在学习了cross_entropy损失函数以后,我本想将其加入到程序代码中,测试一下二分类的效果:
#基于seed产生随机数
rdm = np.random.RandomState(seed)
#随机数返回32行2列的矩阵 表示32组 体积和重量 作为输入数据集
X = rdm.rand(32,2)/10.0+0.9 #范围在 0-1之间
for i in range(0,31):
X[i, 0] = 0.3 - X[i,0] #0.2——0.3
X[i, 1] = 0.5 + X[i,1] #0.5——0.6
#从X这个32行2列的矩阵中取出一行,判断如果和小于1,给Y赋值1,如果和不小于1,给Y赋值0
#作为输入数据集的标签(正确答案)
Y = rdm.rand(32,2)
for i in range(0,31):
Y[i, 0] = X[i, 0] + X[i, 1] + 0.1 - rdm.rand()/5.0
Y[i, 1] = X[i, 1] - X[i, 0] + 0.1 - rdm.rand()/5.0
首先生成了一组数据,这组数据一共32个样本,每个样本两个特征值。输出的Y也是两个数组成,一个比较大,是输入样本特征1和输入样本特征2的组合,一个比较小,使他们的差值。
之后我定义损失函数:
#2 定义损失函数及反向传播方法
ce = -tf.reduce_mean(y_*tf.log(tf.clip_by_value(y,1e-12,1.0)))
train_step = tf.train.GradientDescentOptimizer(0.001).minimize(ce)
该损失函数采用交叉熵,为了保证log运算数的意义,令y的值压缩在1e-12到1之间。
然后训练20000轮。发现参数根本没有变!损失函数的大小也没有变。
然后我进行了各种调试,发现原来自己忘记了使用激活函数。
有的时候想得太简单,总会忘记一些本质性的东西。在神经网络随机参数生成时,网络参数很可能会计算出负数的y,然后放进这个损失函数程序中,会变为1e-12,这就失去了意义。根源在于我们没有通过激活函数把y得值压缩在0到1之间。