TensorFlow中的基本神经网络

8
我正在尝试在TensorFlow中实现一个非常基本的神经网络,但是我遇到了一些问题。这是一个非常基本的网络,它以两个值(睡眠时间和学习时间)作为输入,并预测测试成绩(我在you-tube上找到了这个例子)。因此,我只有一个带有三个单元的隐藏层,每个单元都计算一个激活函数(sigmoid),成本函数是平方误差的总和,并使用梯度下降来最小化它。问题在于,当我用训练数据训练网络并尝试使用相同的训练数据进行一些预测时,结果并不完全匹配,它们看起来也很奇怪,因为它们彼此相等。
import tensorflow as tf
import numpy as np
import input_data

sess = tf.InteractiveSession()

# create a 2-D version of input for plotting
trX = np.matrix(([3,5], [5,1],[10,2]), dtype=float)
trY = np.matrix(([85], [82], [93]), dtype=float) # 3X1 matrix
trX = trX / np.max(trX, axis=0)
trY = trY / 100 # 100 is the maximum score allowed

teX = np.matrix(([3,5]), dtype=float)
teY = np.matrix(([85]), dtype=float)
teX = teX/np.amax(teX, axis=0)
teY = teY/100

def init_weights(shape):
    return tf.Variable(tf.random_normal(shape, stddev=0.01))

def model(X, w_h, w_o):
    z2 = tf.matmul(X, w_h)
    a2 = tf.nn.sigmoid(z2) # this is a basic mlp, think 2 stacked logistic regressions
    z3 = tf.matmul(a2, w_o)
    yHat = tf.nn.sigmoid(z3)
    return yHat # note that we dont take the softmax at the end because our cost fn does that for us

X = tf.placeholder("float", [None, 2])
Y = tf.placeholder("float", [None, 1])

W1 = init_weights([2, 3]) # create symbolic variables
W2 = init_weights([3, 1])

sess.run(tf.initialize_all_variables())

py_x = model(X, W1, W2)

cost = tf.reduce_mean(tf.square(py_x - Y))
train_op = tf.train.GradientDescentOptimizer(0.5).minimize(cost) # construct an optimizer
predict_op = py_x

sess.run(train_op, feed_dict={X: trX, Y: trY})

print sess.run(predict_op, feed_dict={X: trX})

sess.close()

它得到的结果为:

[[ 0.51873487] [ 0.51874501] [ 0.51873082]]

我相信这些结果应该与训练数据的结果相似。

我对神经网络和机器学习还比较新,如有错误敬请谅解,谢谢。

1个回答

10

你的神经网络无法训练的主要原因是这个语句:

sess.run(train_op, feed_dict={X: trX, Y: trY})

在TensorFlow中,运行train_op(或从Optimizer.minimize()返回的任何操作)只会导致网络进行一次梯度下降步骤。您应该在循环中执行它以执行迭代训练,权重最终将收敛。

另外两个提示:(i)如果每步输入子集而不是整个数据集,则可能会实现更快的收敛;(ii)学习率0.5可能太高了(尽管这取决于数据)。


感谢您的回复。因此,我将训练步骤放在一个循环中,并尝试了许多循环大小的组合,虽然得分确实更接近于训练数据,但仍未完全收敛。即使尝试过度拟合模型,最大值也只能达到: [[ 0.85000151] [ 0.85349745] [ 0.89352685]]。 - Thalles
@Thalles,我对这个也很陌生,但我可以告诉你有两种训练nnet的方法:在线或随机学习,其中反向传播仅从每个观察中学习,批量学习则同时从所有观察中学习。还有一种是小批量学习,它是两者的混合。随机学习倾向于更快,但收敛会到处乱跑。批量学习倾向于更慢,但收敛更稳定。你知道正在使用哪种吗? - Ricardo Magalhães Cruz
@Thalles,你永远不可能达到100%的准确率,但如果模型包含例如偏差项,它会变得更好。 - Ricardo Magalhães Cruz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接