在神经网络训练过程中,可能会出现Weight/Bias等值为NaN(Not a Number)的问题,这是因为在训练过程中权重出现了无穷与非数值的情况。现就出现NAN值问题的原因及解决方案进行总结。未完待续。。。
1. 学习率设置问题
学习率设置不到可能会导致出现NAN值,而且通常是学习率过大导致。
2. 优化器选择问题
在用多元线性回归解决房价预测问题时就遇到过权重出现NAN值问题。先采用的是tf.train.GradientDescentOptimize优化算法,结果训练过程中权重出现了NAN值,后来改用tf.train.AdamOptimize优化算法问题得到了解决。至于为什么还有待深究!
案例分析:
import tensorflow as tf
import numpy as np
houses = 100
features = 2
x_data = np.zeros([houses, 2])
for house in range(houses):
x_data[house, 0] = np.round(np.random.uniform(50., 150.))
x_data[house, 1] = np.round(np.random.uniform(3., 7.))
weights = np.array([[2.], [3.]])
y_data = np.dot(x_data, weights) # 点积
x_data_ = tf.placeholder(tf.float32, [None, 2])
y_data_ = tf.placeholder(tf.float32, [None, 1])
weights_ = tf.Variable(np.ones([2, 1]), dtype=tf.float32)
y_model = tf.matmul(x_data_, weights_)
loss = tf.reduce_mean(tf.pow((y_model - y_data_), 2))
train_op = tf.train.AdamOptimizer(0.01).minimize(loss)
config = tf.ConfigProto()
config.gpu_options.allow_growth = True
sess = tf.Session(config=config)
# sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)
for _ in range(100):
for (x, y) in zip(x_data, y_data):
z1 = x.reshape(1, 2)
z2 = y.reshape(1, 1)
sess.run(train_op, feed_dict={x_data_: z1, y_data_: z2})
print("--------------")
print(sess.run(weights_))