我的神经网络在第一次训练后输出很快就变成了全部NaN。无论我如何调整学习率,所有的成本都是NaN。我已经在Stack Overflow和其他网站上查过了,我的这个问题不属于任何一种情况。在任何训练之前,我的网络确实会产生正确的(非NaN)输出。我不确定这是我的输入还是我的神经网络的问题,因为神经网络看起来没问题。
我的神经网络的输入是一些机器的特征,例如总计划数量、总库存数量等。输出是每个机器的总计划数量如何分配给其他机器的个体计划数量。我最大的担忧是输入和输出都有很多零,因为数据形式多样且不完整。我用零填充了所有空白,以便将其放入神经网络中。但即使如此,我认为网络在第一次训练后也不会产生NaN。谁能指出我的问题?以下是我的完整代码:
#load datald = Loader()X_train, y_train, X_val, y_val, X_test, y_test = ld.load_data() * 3tf.reset_default_graph()sess = tf.InteractiveSession()#placeholderx = tf.placeholder(tf.float32, shape=[None, 1306], name='x')y_ = tf.placeholder(tf.float32, shape=[None, 508], name='y_')#a single-layer neural networknet = tl.layers.InputLayer(x, name='input')net = tl.layers.DenseLayer(net, n_units=1300, act=tf.nn.relu, name='relu1')net = tl.layers.DenseLayer(net, n_units=508, act=None, name='output')y = net.outputs#cost = tf.nn.softmax_cross_entropy_with_logits_v2(labels=y_, logits=y, name='xentropy')cost = tf.reduce_mean(tf.square(y - y_))#trainn_epoch = 100batch_size = 30learning_rate = 10 ** -7print_freq = 1train_op = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)tl.layers.initialize_global_variables(sess)net.print_params()net.print_layers()print(' learning_rate: %f' % learning_rate)print(' batch_size: %d' % batch_size)for epoch in range(n_epoch): start_time = time.time() for X_train_a, y_train_a in tl.iterate.minibatches(X_train, y_train, batch_size, shuffle=True): feed_dict = {x: X_train_a, y_: y_train_a} sess.run(train_op, feed_dict=feed_dict) if epoch + 1 == 1 or (epoch + 1) % print_freq == 0: print("Epoch %d of %d took %fs" % (epoch + 1, n_epoch, time.time() - start_time)) train_loss, n_batch = 0, 0 for X_train_a, y_train_a in tl.iterate.minibatches(X_train, y_train, batch_size, shuffle=True): feed_dict = {x: X_train_a, y_: y_train_a} err = sess.run(cost, feed_dict=feed_dict) train_loss += err n_batch += 1 print(" train loss: %f" % (train_loss / n_batch))# Save modelif not os.path.isdir(path): os.makedirs(path)saver = tf.train.Saver()save_path = saver.save(sess, "model/model.ckpt")print("Model saved in file: %s" % save_path)tl.files.save_npz(net.all_params, name='model.npz')sess.close()
这是样本输出:
回答:
首先,检查你的输入,任何NaN
或inf
输入都会毁掉整个模型。
然后,如果输入正确,我建议你使用TensorFlow调试器(阅读这里的文档)来调试你的模型。在文档中,有一个关于如何调试NaN出现的教程。