我在将numpy.float32()值打印到stdout时遇到了一些问题。以下是代码:
import numpy as np
import tensorflow as tf
n_samples = 1000
batch_size = 100
num_steps = 20000
x_data = np.random.uniform(1, 10, (n_samples, 1))
y_data = 2 * x_data + 1 + np.random.normal(0, 2, (n_samples, 1))
x = tf.placeholder(tf.float32, shape=(batch_size, 1))
y = tf.placeholder(tf.float32, shape=(batch_size, 1))
with tf.variable_scope('linear-regression'):
k = tf.Variable(tf.random_normal((1, 1)), name='slope')
b = tf.Variable(tf.zeros(1,), name='bias')
y_pred = tf.matmul(x, k) + b
loss = tf.reduce_sum((y - y_pred) ** 2)
optimizer = tf.train.GradientDescentOptimizer(0.05).minimize(loss)
display_step = 5000
with tf.Session() as session:
session.run(tf.global_variables_initializer())
for i in range(num_steps):
indices = np.random.choice(n_samples, batch_size)
x_batch, y_batch = x_data[indices], y_data[indices]
_, loss_val, k_val, b_val = session.run((optimizer, loss, k, b), feed_dict={x: x_batch, y: y_batch})
if (i + 1) % display_step == 0:
print(f'Epoch {i+1}: loss = {loss_val.item():.3f}, k = {np.sum(k_val).item():.3f}, b = {np.sum(b_val).item():.3f}')当我试图在最后一个字符串中打印值时,我得到如下内容:
Epoch 5000: loss = nan, k = nan, b = nan
Epoch 10000: loss = nan, k = nan, b = nan
Epoch 15000: loss = nan, k = nan, b = nan我使用的是视觉代码(Windows 10)。在调试模式下,我尝试打印loss_val值,并将其转换为Python本机浮点值,然后再打印,但不获取任何值。
谢谢你的帮助
P.S. TensorFlow 1.4.0,NumPy 1.14,Windows 10,视代码为IDE。
更新
在“if-statment”中停止的调试模式中,我尝试过
print(1)并得到:
None
1我做错什么了?看起来像是某种重新定义print()的东西。
发布于 2018-02-03 10:27:09
您可以看到NaNs,因为网络中的值正在迅速增长,变得太大,无法适应float。这次爆炸主要是由你的超参数引起的:
k初始值太大,降低了标准差,例如:
K=tf.Variable(tf.random_normal(1,1),stddev=0.001),名称=‘斜率’)0.01而不是0.05;tf.reduce_mean而不是tf.reduce_sum来保持损失和梯度调整到批处理大小。结果代码:
x = tf.placeholder(tf.float32, shape=(batch_size, 1))
y = tf.placeholder(tf.float32, shape=(batch_size, 1))
with tf.variable_scope('linear-regression'):
k = tf.Variable(tf.random_normal((1, 1), stddev=0.001), name='slope')
b = tf.Variable(tf.zeros(1, ), name='bias')
y_pred = tf.matmul(x, k) + b
loss = tf.reduce_mean((y - y_pred) ** 2)
optimizer = tf.train.GradientDescentOptimizer(0.01).minimize(loss)PS。如果希望获得更好的结果,还应该考虑将输入规范化。
https://stackoverflow.com/questions/48410530
复制相似问题