天天看点

基于神经网络的二分类问题

下面是利用模拟的数据集训练神经网络,解决二分类问题:

#===========================================================================
#==============神经网络解决二分类问题========================================
#==========================================================================

import tensorflow as tf
from numpy.random import RandomState  #用于生成模拟数据集

#定义训练数据batch的大小
batch_size = 8
#定义神经网络的参数
w1 = tf.Variable(tf.random_normal([2, 3], stddev = 1, seed = 1))
w2 = tf.Variable(tf.random_normal([3, 1], stddev = 1, seed = 1))
#定义占位符
x = tf.placeholder(tf.float32, shape = (None, 2), name = 'x_input')
y_ = tf.placeholder(tf.float32, shape = (None, 1), name = 'y_input')
#定义神经网络前向传播过程
a = tf.matmul(x, w1)
y = tf.matmul(a, w2)
#定义损失函数和反向传播算法
#tf.clip_by_value(A, min, max) A为张量,将A中的每一个元素压缩到 min 与 max 之间
cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y, 1e-10, 1.0)))
train_step = tf.train.AdamOptimizer(0.001).minimize(cross_entropy)

#通过随机数生成一个模拟数据集
rdm = RandomState(1)  #局部随机种子,其中‘1’为种子,不同的种子产生的随机数也不相同
dataset_size = 128
X = rdm.rand(dataset_size, 2)
#定义规定来给出样本标签
#所有x1+x2<1规定为正样本;其他规定为负样本;
#此处我们简化为:0表示负样本;1表示正样本
Y = [[int(x1+x2 < 1)] for (x1, x2) in X]

#创建一个会话
with tf.Session() as sess:
    init_op = tf.global_variables_initializer()
    sess.run(init_op)  #启动初始化
    print(sess.run(w1))  #打印训练前参数
    print(sess.run(w2))  
    
    #设定训练次数
    STEPS = 10000
    for i in range(STEPS):
        start = (i * batch_size) % dataset_size  #每次选取batch_size个样本进行训练
        end = min(start+batch_size, dataset_size) 
        #通过选取的样本训练神经网络并更新参数
        sess.run(train_step, feed_dict = {x: X[start:end], y_: Y[start:end]})
        
        if i%1000 == 0:
            #每隔一段时间计算所有数据上的交叉熵并输出
            total_cross_entropy = sess.run(cross_entropy, feed_dict = {x: X, y_: Y})
            print('After %d training steps(s),  cross entropy on all data is %g' % (i, total_cross_entropy))
    #训练完后打印网络参数       
    print(sess.run(w1))
    print(sess.run(w2))
#===========================================================================
           

训练的结果:

基于神经网络的二分类问题

通过结果可看出:随着训练的进行,交叉熵逐渐减小,说明预测的结果和真实值越接近。

继续阅读