我tm吹爆batch_norm
!!!!!一开始以为换了tfrecord
之后也可以和以前直接读取图片那样不需要batch_norm
,但是几天的训练精度都在0.2,我不禁怀疑起了人生,最后用了batch_norm
,一切都回来了。现在我把两个版本的代码都放上来,留作纪念,并希望可以帮助到需要的人。
附上个batch_norm
的教程链接。Batch Normalization – Solutions
在定义网络层的时候,如果要通过tf.get_variable()
来用进行参数的xavier
初始化tf.contrib.layers.xavier_initializer()
,那么在前面应该使用tf.variable_scope
而不是tf.name_scope()
。这是因为name_scope
和get_variable
之间会存在参数复用的问题,会报错。
没有batch_norm
的代码如下:
"""
# AlexNet模型
"""
import tensorflow as tf
'''
获取tensor信息
'''
def print_tensor_info(tensor):
print("tensor name:",tensor.op.name,"-tensor shape:",tensor.get_shape().as_list())
def inference(input, num_class, keep_prob):
# 定义参数
parameters = []
# 第一层卷积层
with tf.variable_scope("conv1"):
# 设置卷积核5×5,3通道,32个卷积核
# kernel1 = tf.Variable(tf.truncated_normal([5,5,3,32],mean=0,stddev=0.1,
# dtype=tf.float32),name="weights")
kernel1 = tf.get_variable("weight", [5, 5, 3, 32],
initializer=tf.contrib.layers.xavier_initializer())
# 卷积,卷积的横向步长和竖向补偿都为4
conv = tf.nn.conv2d(input,kernel1,[1,1,1,1],padding="SAME")
#初始化偏置
biases = tf.get_variable("bias", [32], initializer=tf.contrib.layers.xavier_initializer())
bias = tf.nn.bias_add(conv,biases)
#RELU激活函数
conv1 = tf.nn.relu(bias)
#输出该层的信息
print_tensor_info(conv1)
#统计参数
parameters += [kernel1,biases]
#lrn处理
#lrn1 = tf.nn.lrn(conv1,4,bias=1,alpha=1e-3/9,beta=0.75,name="lrn1")
#最大池化
pool1 = tf.nn.max_pool(conv1,ksize=[1,2,2,1],strides=[1,2,2,1],padding="SAME",name="pool1")
print_tensor_info(pool1)
# 可视化输出
with tf.variable_scope('visual'):
x_min = tf.reduce_min(kernel1)
x_max = tf.reduce_max(kernel1)
kernel_0_to_1 = (kernel1 - x_min) / (x_max - x_min)
# to tf.image_summary format [batch_size, height, width, channels]
kernel_transposed = tf.transpose(kernel_0_to_1, [3, 0, 1, 2])
# this will display random 3 filters from the 64 in conv1
tf.summary.image('conv1/filters', kernel_transposed, max_outputs=3)
layer1_image1 = conv1[0:1, :, :, 0:16]
layer1_image1 = tf.transpose(layer1_image1, perm=[3, 1, 2, 0])
tf.summary.image("filtered_images_layer1", layer1_image1, max_outputs=16)
#第二层卷积层
with tf.<