Tensorflow解决训练误差大于测试误差

最近在跟随莫烦哥进行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–改变的"变量"真的变了吗?

发布了21 篇原创文章 · 获赞 5 · 访问量 382

猜你喜欢

转载自blog.csdn.net/def_init_myself/article/details/104486346
今日推荐