我正在尝试一个非常简单的neural net来判断一个数字是奇数还是偶数。标签[1, 0]表示这个数字是偶数。我使用了两个输出神经元,因为我使用了softmax函数。
我的代码如下:
import tensorflow as tfdata_in = [ [1], [2], [3] ]data_lbl = [ [0, 1], [1, 0], [0, 1] ]# HPlearning_rate = 0.1epochs = 10000ip = tf.placeholder('float', [None, 1])labels = tf.placeholder('float', [None, 2])w1 = tf.Variable(tf.random_normal([1, 2]))w2 = tf.Variable(tf.random_normal([2, 2]))l1 = tf.matmul(ip, w1)l2 = tf.matmul(l1, w2)l2 = tf.nn.softmax(l2)loss = tf.reduce_mean((labels - l2)**2)train = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)sess = tf.Session()sess.run(tf.global_variables_initializer())for epoch in range(epochs): _, err = sess.run([train, loss], feed_dict={ip: data_in, labels: data_lbl}) print(err)print(sess.run(l2, feed_dict={ip: [[2], [5], [7]]}))# [it is, it's not]# 1 = evensess.close()
我的误差没有变化,并且我得到的答案是错误的。有什么建议吗?
回答:
你这里有多个问题,解决这些问题至少能让你学到一些东西:
- 你的网络中除了最后的softmax之外没有非线性。你需要非线性,因为奇偶性不是一个线性函数。
- 你的中间层非常小。
- 你的训练样本非常有限。
- 你没有使用偏置项。
此外,奇偶性是一个很难学习的概念,因此它很难推广到训练集中未见过的数字。