我正在尝试从文件夹中读取图像并执行卷积。
首先,我输入这些图像并将它们打包为.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')
尝试较小的学习率从1e-5
开始,让你的初始权重更小tf.truncated_normal(shape, stddev = 0.0001)
,看看这些常见问题是否能解决你的问题。
根据评论,这听起来像这两个常见问题之一导致NaN
问题(请评论,如果我误读你的评论)。
当权重被随机初始化时经常发生这个问题,因为大的权重将有很长的路要走以改善,这可能导致非常陡峭的梯度步骤,例如,爆炸梯度问题。较小的权重/学习率将改善这一问题。
同样值得注意的是BatchNorm也倾向于改善这个问题。您通常可以准确地获得更大的学习速率,因为当信号通过网络时,BatchNorm可以防止事情变得非常糟糕。