也许是一般性的问题,但任何人都可以解释什么会导致卷积神经网络发散?
具体细节:
我正在使用Tensorflow的iris_training模型和我自己的一些数据并继续获取
错误:tensorflow:模型与损失= NaN分歧.
追溯...
tensorflow.contrib.learn.python.learn.monitors.NanLossDuringTrainingError:训练期间NaN丢失.
回溯源于线:
tf.contrib.learn.DNNClassifier(feature_columns=feature_columns,
hidden_units=[300, 300, 300],
#optimizer=tf.train.ProximalAdagradOptimizer(learning_rate=0.001, l1_regularization_strength=0.00001),
n_classes=11,
model_dir="/tmp/iris_model")
Run Code Online (Sandbox Code Playgroud)
我已经尝试调整优化器,使用零学习率,并且不使用优化器.任何有关网络层,数据大小等的见解都是值得赞赏的.
我在MNIST上运行深度神经网络,其中损失定义如下:
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred, label))
该程序似乎运行正常,直到我在10000多个小批量中获得纳米损失.有时,程序正常运行直到完成.我想tf.nn.softmax_cross_entropy_with_logits是给了我这个错误.这很奇怪,因为代码只包含mul和add操作.
也许我可以用:
if cost == "nan":
optimizer = an empty optimizer
else:
...
optimizer = real optimizer
Run Code Online (Sandbox Code Playgroud)
但我找不到那种类型nan.我该如何检查变量nan?
我怎么能解决这个问题?
为Session.run(fetches, feed_dict)保证执行其fetches有序参数呢?
文档似乎没有提到它.
例如,如果你跑
sess.run([accuracy, train_op], feed_dict=feed_dict)
Run Code Online (Sandbox Code Playgroud)
执行的顺序很重要:train_op将更新影响的参数accuracy.
这是一个关于如何在张量流图中找到Nan的第一次出现的一个很好的问题:
答案非常有用,以下是代码:
train_op = ...
check_op = tf.add_check_numerics_ops()
sess = tf.Session()
sess.run([train_op, check_op]) # Runs training and checks for NaNs
Run Code Online (Sandbox Code Playgroud)
显然,第一次遇到Nan时,同时运行训练和数字检查将导致错误报告.
我如何将其整合到Keras中?在文档中,我找不到任何看起来像这样的东西.
我也检查了代码.更新步骤在此处执行:https: //github.com/fchollet/keras/blob/master/keras/engine/training.py
有一个函数称为_make_train_function创建计算损失和应用更新的操作.这被称为训练网络.
我可以像这样更改代码(总是假设我们在tf后端运行):
check_op = tf.add_check_numerics_ops()
self.train_function = K.function(inputs,
[self.total_loss] + self.metrics_tensors + [check_op],
updates=updates, name='train_function', **self._function_kwargs)
Run Code Online (Sandbox Code Playgroud)
我目前正在尝试正确设置它,并不确定上面的代码是否真的有效.也许有一种更简单的方法?