Tensorflow卷积返回Nan

时间:2018-10-18 19:45:16

标签: python tensorflow convolution

我正在尝试从文件夹读取图像并进行卷积。

首先,我输入这些图像并将其打包为.tfrecords,并通过tf.train.batch解码tfrecords。 接下来,我将所有数据(图像,标签)进行卷积(作为代码)。 在此步骤中,bias(b_conv1)和weight(w_conv1)将是 Nan ,并且该模型将不再起作用。

image_batch, label_batch = decodeTFRecord(dirPath,batch_size)
image_batch = tf.reshape(image_batch,[-1,128*128])
label_batch = tf.one_hot(label_batch,Label_size)

x = tf.placeholder(tf.float32,[None,128*128])
y = tf.placeholder(tf.float32,[None,10])
x_image = tf.convert_to_tensor(tf.reshape(x,[-1,128,128,1]))
#conv1 layer
w_conv1 = weight_variable([5,5,1,32])
b_conv1 = bias_variable([32])
h_conv1 = tf.nn.relu(conv2d(x_image,w_conv1)+b_conv1) #outsize = 128*128*32
h_pool1 = max_pool_2x2(h_conv1) # outsize = 64*64*32

conv2d功能:

def conv2d(x,W):
   return tf.nn.conv2d(x,W,strides=[1,1,1,1],padding ='SAME')

max_pool_2x2函数:

def max_pool_2x2(x):
    return tf.nn.max_pool(x,ksize=[1,2,2,1], strides=[1,2,2,1],padding='SAME')

完整代码: https://codeshare.io/5O7ddj

1 个答案:

答案 0 :(得分:2)

尝试从1e-5开始降低学习速度,并减小初始权重tf.truncated_normal(shape, stddev = 0.0001),然后看看这些常见问题中的任何一个是否都能解决您的问题。

根据评论,听起来这两个常见问题之一导致了NaN问题(如果我误读了您的评论,请发表评论)。

当权重被随机初始化时,经常会发生此问题,因为大的权重将有很长的路要走以改善,这可能会导致非常陡峭的渐变步骤,例如爆炸梯度问题。较小的权重/学习率将改善此问题。

还值得注意的是BatchNorm也将趋于改善该问题。通常,您可以以更高的学习率来逃避,恰恰是因为BatchNorm可以防止信号通过网络传播时真正摆脱困境。