我正在尝试训练一个神经网络来预测两个数字的和。但是我不明白我的模型有什么问题。模型由2个输入层、2个隐藏层和1个输出层组成。每1000次迭代我会打印一次测试执行结果,但结果却越来越小。
import numpy as npimport tensorflow as tfinput_size = 2hidden_size = 3out_size = 1def generate_test_data(): inp = 0.5*np.random.rand(10, 2) oup = np.zeros((10, 1)) for idx, val in enumerate(inp): oup[idx] = np.array([val[0] + val[1]]) return inp, oupdef create_network(): x = tf.placeholder(tf.float32, [None, input_size]) w01 = tf.Variable(tf.truncated_normal([input_size, hidden_size], stddev=0.1)) y1 = tf.sigmoid(tf.matmul(tf.sigmoid(x), w01)) w12 = tf.Variable(tf.truncated_normal([hidden_size, out_size], stddev=0.1)) y2 = tf.sigmoid(tf.matmul(y1, w12)) y_ = tf.placeholder(tf.float32, [None, out_size]) return x, y_, y2def train(x, y_, y2): cross_entropy = tf.reduce_mean( tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y2) ) train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy) sess = tf.InteractiveSession() tf.global_variables_initializer().run() # Train for i in range(100000): batch_xs, batch_ys = generate_test_data() sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys}) # Test if i % 1000 == 0: out_batch = sess.run(y2, {x: batch_xs}) inx = 0 print(batch_xs[inx][0], " + ", batch_xs[inx][1], " = ", out_batch[inx][0])(x, y_, y2) = create_network()train(x, y_, y2)
每1000次迭代的输出:
0.37301352864927173 + 0.28949461772342683 = 0.491115180.050899466843458474 + 0.006174158992116541 = 0.00252607440.3974852369427063 + 0.22402098418952499 = 0.000908285440.15735921047969498 + 0.39645077887600294 = 0.00059037270.23560825884336228 + 0.29010766384718145 = 0.00043178830.4250063393420791 + 0.24181166029062096 = 0.00031525563 = smaller and smaller
回答:
交叉熵损失用于分类问题,而你的任务显然是回归问题。计算的cross_entropy
值没有意义,因此导致了这样的结果。
将你的损失函数改为:
cross_entropy = tf.reduce_mean( tf.nn.l2_loss(y_ - y2))
…你会看到更加合理的结果。