关于tf.layers.dense()导致训练所有loss为nan,识别度为0

来源:2-8 神经网络实现(多分类逻辑斯蒂回归模型实现)

辉夜

2019-05-12

老师,您好。我仿照老师的模板写了一个通过骨骼坐标识别动作的神经网络,但是中途出现了损失函数值一直为nan的情况,但是通过调整代码:
y_ = tf.layers.dense(hidden1,12)
成功可以训练了。然而我发现这个最后一层的数量如果小于12的话,就会出现损失函数值loss变为nan且识别度为0的情况。我的训练集的label是{1, 2, 3, 4, 5, 7, 9, 10, 11}定义为整形数字的九个类。是不是因为其函数内部直接默认0~11,所以导致tf.layers.dense的unit必须得赋值12呀。

x = tf.placeholder(tf.float32, [None, 28])  
y = tf.placeholder(tf.int64, [None])  
hidden1 = tf.layers.dense(x, 28, activation=tf.nn.relu)            
y_ = tf.layers.dense(hidden1,12)  #此处需要写成12(可能必须空出0~11?)
loss = tf.losses.sparse_softmax_cross_entropy(labels=y, logits=y_)
predict = tf.argmax(y_, 1)  
correct_prediction = tf.equal(predict, y) 
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float64)) 
with tf.name_scope('train_op'):
    train_op = tf.train.AdamOptimizer(1e-4).minimize(loss)  
写回答

1回答

正十七

2019-05-17

同学你好,这是因为你的label里面与11啊,它会把label值当成索引去计算,所以必须长度是12,但这应该不影响预测结果。因为多出来的三个位置不会被训练。如果你想要设成9,那么需要把label里的7,9,10, 11都重新设置为6, 7, 8, 9

1
1
辉夜
啊啊,原来如此,谢谢老师。
2019-05-17
共1条回复

深度学习之神经网络(CNN/RNN/GAN)算法原理+实战

深度学习算法工程师必学,深入理解深度学习核心算法CNN RNN GAN

2617 学习 · 935 问题

查看课程