直接从(受欢迎的)书中复制的Tensorflow代码不收敛:

时间:2019-07-03 20:42:24

标签: python tensorflow

以下代码直接从第237页的“使用Scikit学习和Tensorflow进行机器学习”一书中直接复制。

n_epochs = 10000
learning_rate = 0.01
X = tf.constant(housing_data_plus_bias, dtype=tf.float32, name="X")
y = tf.constant(housing.target.reshape(-1, 1), dtype=tf.float32, name="y")
theta = tf.Variable(tf.random_uniform([n + 1, 1], -1.0, 1.0), name="theta")
y_pred = tf.matmul(X, theta, name="predictions")
error = y_pred - y
mse = tf.reduce_mean(tf.square(error), name="mse")
gradients = 2/m * tf.matmul(tf.transpose(X), error)
training_op = tf.assign(theta, theta - learning_rate * gradients)
init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    for epoch in range(n_epochs):
        if epoch % 100 == 0:
            print("Epoch", epoch, "MSE =", mse.eval())
        sess.run(training_op)
    best_theta = theta.eval()

这里,数据housing_data_plus_bias是规范化的数据集,与本书使用的数据集相同,但我自己使用以下代码对其进行了规范化。

housing = fetch_california_housing()
m, n = housing.data.shape
housing_data_plus_bias = np.c_[np.ones((m, 1)), housing.data]

means = []
vars = []
for col in range(n):
    means.append(np.mean(housing_data_plus_bias[:, col]))
    vars.append(np.std(housing_data_plus_bias[:, col]))


for row in range(m):
    for col in range(n):
        if col == 0:
            continue
        housing_data_plus_bias[row, col] = (housing_data_plus_bias[row, col] - means[col])/vars[col]

但是代码不收敛,请参见下面的输出。它会生成NAN。为什么书会说它在不起作用时会起作用?

也许是因为我在控制台中看到了以下输出,其中显示了许多错误?

输出:

output

最后,您可以在此处查看实际书籍中的页面,并确认我已完全复制了该页面: book image

1 个答案:

答案 0 :(得分:0)

您可能使用了错误版本的Tensorflow,或者未正确安装其依赖项。 NaN可能是这些问题的结果。仔细检查该书使用的版本和pip install tensorflow==<version>,用该书使用的版本替换<version>

通过运行pip list | grep tensorflow可以看到正在运行的版本。

有关更具体的答案,您是否可以显示在控制台中看到的更多错误?代码对我来说很好。