【问题标题】:Printing TensorFlow and NumPy values to stdout将 TensorFlow 和 NumPy 值打印到标准输出
【发布时间】:2018-07-02 19:01:51
【问题描述】:

我在将 numpy.float32() 值打印到标准输出时遇到了一些问题。 代码如下:

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 本机浮点值并在此之后打印,但得到 None 值。

感谢您的帮助 =)

附: TensorFlow 1.4.0、NumPy 1.14、Windows 10、Visual Code as IDE。

更新

在 if-statment 中停止的调试模式下,我已经尝试过

print(1)

然后得到:

None
1

我做错了什么?看起来像是重新定义了 print()。

【问题讨论】:

    标签: python windows numpy tensorflow nan


    【解决方案1】:

    您看到 NaN 是因为网络中的值爆炸得非常快并且变得太大而无法容纳 float。这种爆炸主要是由您的超参数引起的:

    • k初始值太大,减小标准差,例如:

      k = tf.Variable(tf.random_normal((1, 1), stddev=0.001), name='slope')
      
    • 学习率也太高了,试试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。如果您想要更好的结果,您还应该考虑对输入进行归一化。

    【讨论】:

    • 感谢您的建议!它有帮助 =)
    猜你喜欢
    • 2013-05-01
    • 2020-06-25
    • 2015-08-31
    • 1970-01-01
    • 2018-12-25
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多