关于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
112019-05-17
相似问题