神经网络在第一次训练后产生NaN

时间:2018-08-14 06:39:42

标签: python tensorflow machine-learning neural-network tensorlayer

我的神经网络的输出在第一次训练后很快就变得毫无意义。不管我如何修改学习率,所有费用都是微不足道的。我已经检查了Stack Overflow和其他网站,但我的问题没有落到他们当中。在进行任何培训之前,我的网络确实会产生正确的(非Nan)输出。我不确定这是我的输入问题还是神经网络问题,因为该神经网络似乎正常。

我的神经网络的输入是机器的某些功能,例如总计划数量,总库存数量等。输出是单个计划数量,表示每个机器的总计划数量将如何分配到其他机器。我最大的担心是输入和输出都有很多零,因为数据采用各种形式且不完整。我将所有空白归零,以便能够将其放入神经网络中。但是即使那样,我也不认为第一次训练后,网络将不会产生nan。谁能指出我的问题?下面是我的完整代码:

#load data
ld = Loader()
X_train, y_train, X_val, y_val, X_test, y_test = ld.load_data() * 3

tf.reset_default_graph()
sess = tf.InteractiveSession()

#placeholder
x = tf.placeholder(tf.float32, shape=[None, 1306], name='x')
y_ = tf.placeholder(tf.float32, shape=[None, 508], name='y_')

#a single-layer neural network
net = 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_))

#train
n_epoch = 100
batch_size = 30
learning_rate = 10 ** -7
print_freq = 1
train_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 model
if 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()

以下是示例输出:

output output-continued

2 个答案:

答案 0 :(得分:0)

从文档中:

  

run()返回的值与fetches参数具有相同的形状,其中叶子被TensorFlow返回的相应值替换。 “提取”可以是任意列表,元组,namedtuple,字典

因此,我想您的err变量不是整数,因此当您尝试将其除以数字时,它将返回NaN

答案 1 :(得分:0)

首先,检查您的输入,任何int monthNumber = 1; //1-12 string monthName = new DateTimeFormatInfo().GetMonthName(monthNumber); NaN输入都会破坏整个模型。

然后,如果输入正确,建议您使用TensorFlow调试器(阅读文档here)来调试模型。在文档中,有一个有关如何调试NaN外观的教程。