以下代码直接从第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。为什么书会说它在不起作用时会起作用?
也许是因为我在控制台中看到了以下输出,其中显示了许多错误?
输出:
最后,您可以在此处查看实际书籍中的页面,并确认我已完全复制了该页面: book image
答案 0 :(得分:0)
您可能使用了错误版本的Tensorflow,或者未正确安装其依赖项。 NaN
可能是这些问题的结果。仔细检查该书使用的版本和pip install tensorflow==<version>
,用该书使用的版本替换<version>
。
通过运行pip list | grep tensorflow
可以看到正在运行的版本。
有关更具体的答案,您是否可以显示在控制台中看到的更多错误?代码对我来说很好。