Tensorflow Convolution返回Nan

问题描述 投票:0回答:1

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

首先,我输入这些图像并将它们打包为.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

python tensorflow convolution
1个回答
2
投票

尝试较小的学习率从1e-5开始,让你的初始权重更小tf.truncated_normal(shape, stddev = 0.0001),看看这些常见问题是否能解决你的问题。

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

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

同样值得注意的是BatchNorm也倾向于改善这个问题。您通常可以准确地获得更大的学习速率,因为当信号通过网络时,BatchNorm可以防止事情变得非常糟糕。

© www.soinside.com 2019 - 2024. All rights reserved.