我有一个CNN架构来输出一个对象周围的一个盒子的坐标:
然而,如果我在tf中实现它,即使在一个时代之后,损失也会变成nan。我尝试过梯度裁剪和批处理规范化,但两者都不起作用。我怀疑我的损失出了什么问题,下面是相应的代码:
...
output = tf.layers.dense(dense, 4, name="output")
# Loss
error = output-y
error_sq = tf.square(error)
loss = tf.reduce_mean(error_sq, axis=-1)
# Training operation
optimizer = tf.train.RMSPropOptimizer(learning_rate=0.001, momentum=0.9, decay=0.0, epsilon=1e-08)
training_op = optimizer.minimize(loss)
我用keras实现了相同的体系结构,它运行得很好:
...
model.add(Dense(4))
# Optimizer
optimizer = RMSprop(lr=0.001, rho=0.9, epsilon=1e-08, decay=0.0)
# Compile
model.compile(optimizer = optimizer , loss = "mean_squared_error", metrics=["mean_squared_error"])
我看不出这两者有什么不同。
注1:如果我删除axis=-1参数,也会得到nan的值,但是我包含了它,因为keras平均数是用相同的参数计算的。
注2:即使我在输入上只训练了一个密集的层,keras模型也会慢慢收敛,而tensorflow模型则不会。
发布于 2019-08-06 07:21:07
捕获可能是因为行,error = output-y
。因为output
是每个类的逻辑或预测概率。
如果我们打印它,它将如下所示:
output/logits = [[-4.55290842e+00 9.54713643e-01 2.04970908e+00 ... 1.06385863e+00
-1.76558220e+00 5.84793314e-02]
[ 1.42444344e+01 -3.09316659e+00 4.31246233e+00 ... -1.64039159e+00
-4.75767326e+00 2.69032687e-01]
[-3.66746974e+00 -1.05631983e+00 1.63249350e+00 ... 2.34054995e+00
-2.86306214e+00 -1.29766455e-02]
...
[ 1.92035064e-01 2.18118310e+00 1.05751991e+01 ... -3.32132912e+00
2.23277748e-01 -4.14045334e+00]
[-3.95318937e+00 7.54375601e+00 5.60657620e-01 ... 3.35071832e-02
2.31437039e+00 -3.36187315e+00]
[-4.37104368e+00 4.23799706e+00 1.20920219e+01 ... -1.18962801e+00
2.23617482e+00 -3.06528354e+00]]
因此,步骤error = output-y
、error_sq = tf.square(error)
和loss = tf.reduce_mean(error_sq, axis=-1)
可能会导致NaN。
下面的代码将解决您的问题:
l1 = tf.layers.dense(normed_train_data, 64, activation='relu')
l2 = tf.layers.dense(l1, 64, activation='relu')
l3 = tf.layers.dense(l2, 4, name="output")
mse = tf.losses.mean_squared_error(labels=y, logits=l3)
loss = tf.reduce_mean(mse, name="loss")
optimizer = tf.train.RMSPropOptimizer(learning_rate=0.001, momentum=0.9, decay=0.0, epsilon=1e-08)
training_op = optimizer.minimize(loss)
correct = tf.nn.in_top_k(logits, y, 1)
accuracy = tf.reduce_mean(tf.cast(correct, tf.float32))
https://stackoverflow.com/questions/53848232
复制相似问题