最近在跟随莫烦哥进行tensorflow的学习,在学习dropout那一节的时候。有一个问题卡了很长时间,就是下图:
一
发现这个问题以后,我百思不得其解,测试了很多细节,终于发现了bug,同时也有一些其他新的发现。
在定义神经网络层add_layer()的时候,我定义的数据是一列为一个样本,但是后来在测试sotfmax函数的过程中,我发现tf.nn.softmax(x)中,默认是按照行的方向进行计算。查阅资料发现
tf.nn.softmax(
logits,
axis=None,
name=None,
dim=None
)
但是在我pycharm的这个函数中,只有logits和name这两个标识。因此在以前实验时,我设置了一个标志位,以区分softmax和其他激活函数(事实发现,这里不用区分,因为其他激活函数起作用只与当前神经元的值有关,只有softmax是与其他神经元也有关)。而且标志位默认为False,也就是说在激活函数之前不需要对输入进行转置。由于此次分类问题中需要用到softmax,而博主恰好忽略了这一点,因此就导致了前面出现的问题。
def add_layer(input,in_size,out_size,activation_function=None,needtf=False):
Weights = Variable(random_normal([out_size,in_size]))
Biases = Variable(zeros([out_size,1])+0.1)
Wx_plus_b = matmul(Weights,input)+Biases
if activation_function==None:
output = Wx_plus_b
else:
if needtf == True:
output = activation_function(transpose(Wx_plus_b))
output = transpose(output)
else:
output = activation_function(Wx_plus_b)
return output
在定义的神经网络类中调用add_layer,同时更改needtf状态,tensorboard显示正常:
self.l1 = add_layer(self.xs,in_size, hidden_size,activation_function=activation_function1,needtf=True)
self.prediction = add_layer(self.l1,hidden_size,out_size,activation_function=activation_function2,needtf=True)
可以发现在dropout之前,测试误差明显大于训练误差,出现过拟合。
二
总结这次经验教训,以后写含有默认参数的程序时最好使用‘functionnama_with_default’,同时在数据需要转置传入的时候要做好标记
三
同时在解决这个bug的过程中,又找出了新的bug,欢迎大家围观。
Tensorflow–改变的"变量"真的变了吗?