建立一个带有全局平均池化层的卷积神经网络

一 实例描述
使用全局平均池化层来代替传统的全连接层,使用了3个卷积层的同卷积操作,滤波器为5*5,每个卷积层后面都会跟个步长为2*2的池化层,滤波器为2*2。2层的卷积加池后是输出为10个通道卷积层,然后对这10个feature map进行全局平均池化,得到10个特征,再对这10个特征进行softmax计算,其结果来代表最终分类。
通过一个带有全局平均池化层的卷积神经网络对CIFAR数据集分类。

二 代码
'''
导入头文件引入数据集
导入被切割后的24*24尺寸图片,每次取128个图片进行运算。
'''
import cifar10_input
import tensorflow as tf
import numpy as np
batch_size = 128
data_dir = '/tmp/cifar10_data/cifar-10-batches-bin'
print("begin")
images_train, labels_train = cifar10_input.inputs(eval_data = False,data_dir = data_dir, batch_size = batch_size)
images_test, labels_test = cifar10_input.inputs(eval_data = True, data_dir = data_dir, batch_size = batch_size)
print("begin data")
'''
定义网络结构
对于权重w的定义,统一使用函数truncated_normal生成标准差为0.1的随机数为其初始化。
对于权重b的定义,统一初始化为0.1。
'''
def weight_variable(shape):
  initial = tf.truncated_normal(shape, stddev=0.1)
  return tf.Variable(initial)
def bias_variable(shape):
  initial = tf.constant(0.1, shape=shape)
  return tf.Variable(initial)
'''
卷积操作的函数中,统一进行同卷积操作,即步长为1,padding='SAME'.
'''
def conv2d(x, W):
  return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')
'''
池化层有两个函数
一个是放在卷积后面,取最大值的方法,步长为2,padding='SAME',即将原尺寸的长和宽各除以2
另外一个是用来放在最后一层,取均值的方法,步长为最终生成的特征尺寸6*6(24*24经过两次池化变成了6*6),filter也为6*6.
倒数第二层没有最大池化的卷积层,因为共有10类,所有卷积输出的是10个通道,并使其全局平均池化为10个节点。
'''
def max_pool_2x2(x):
  return tf.nn.max_pool(x, ksize=[1, 2, 2, 1],
                        strides=[1, 2, 2, 1], padding='SAME')  
                        
def avg_pool_6x6(x):
  return tf.nn.avg_pool(x, ksize=[1, 6, 6, 1],
                        strides=[1, 6, 6, 1], padding='SAME')
# tf Graph Input
x = tf.placeholder(tf.float32, [None, 24,24,3]) # cifar data image of shape 24*24*3
y = tf.placeholder(tf.float32, [None, 10]) # 0-9 数字=> 10 classes
W_conv1 = weight_variable([5, 5, 3, 64])
b_conv1 = bias_variable([64])
x_image = tf.reshape(x, [-1,24,24,3])
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
h_pool1 = max_pool_2x2(h_conv1)
W_conv2 = weight_variable([5, 5, 64, 64])
b_conv2 = bias_variable([64])
h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
h_pool2 = max_pool_2x2(h_conv2)
W_conv3 = weight_variable([5, 5, 64, 10])
b_conv3 = bias_variable([10])
h_conv3 = tf.nn.relu(conv2d(h_pool2, W_conv3) + b_conv3)
nt_hpool3=avg_pool_6x6(h_conv3)#10
nt_hpool3_flat = tf.reshape(nt_hpool3, [-1, 10])
y_conv=tf.nn.softmax(nt_hpool3_flat)
cross_entropy = -tf.reduce_sum(y*tf.log(y_conv))
'''
对于梯度优化算法,还是和多分类问题一样,使用AdamOptimizer函数,学习率为0.0001
'''
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
correct_prediction = tf.equal(tf.argmax(y_conv,1), tf.argmax(y,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
'''
运行session进行训练,启动session,迭代15000次数据集,这里记得要启动队列,同时读出来的label还要转成onehot编码
'''
sess = tf.Session()
sess.run(tf.global_variables_initializer())
tf.train.start_queue_runners(sess=sess)
for i in range(15000):#20000
  image_batch, label_batch = sess.run([images_train, labels_train])
  label_b = np.eye(10,dtype=float)[label_batch] #one hot
  
  train_step.run(feed_dict={x:image_batch, y: label_b},session=sess)
  
  if i%200 == 0:
    train_accuracy = accuracy.eval(feed_dict={
        x:image_batch, y: label_b},session=sess)
    print( "step %d, training accuracy %g"%(i, train_accuracy))
'''
评估结果
从测试数据集里将数据取出,放到模型里运行,查看模型的正确率。
'''
image_batch, label_batch = sess.run([images_test, labels_test])
label_b = np.eye(10,dtype=float)[label_batch]#one hot
print ("finished! test accuracy %g"%accuracy.eval(feed_dict={
     x:image_batch, y: label_b},session=sess))
三 运行结果
begin
begin data
step 0, training accuracy 0.09375
step 200, training accuracy 0.367188
step 400, training accuracy 0.367188
step 600, training accuracy 0.382812
step 800, training accuracy 0.460938
step 1000, training accuracy 0.492188
step 1200, training accuracy 0.578125
step 1400, training accuracy 0.53125
step 1600, training accuracy 0.515625
step 1800, training accuracy 0.445312
step 2000, training accuracy 0.5625
step 2200, training accuracy 0.570312
step 2400, training accuracy 0.515625
step 2600, training accuracy 0.554688
step 2800, training accuracy 0.515625
step 3000, training accuracy 0.539062
step 3200, training accuracy 0.5
step 3400, training accuracy 0.515625
step 3600, training accuracy 0.539062
step 3800, training accuracy 0.445312
step 4000, training accuracy 0.554688
step 4200, training accuracy 0.507812
step 4400, training accuracy 0.5625
step 4600, training accuracy 0.617188
step 4800, training accuracy 0.65625
step 5000, training accuracy 0.65625
step 5200, training accuracy 0.578125
step 5400, training accuracy 0.625
step 5600, training accuracy 0.484375
step 5800, training accuracy 0.59375
step 6000, training accuracy 0.578125
step 6200, training accuracy 0.6875
step 6400, training accuracy 0.539062
step 6600, training accuracy 0.609375
step 6800, training accuracy 0.523438
step 7000, training accuracy 0.640625
step 7200, training accuracy 0.578125
step 7400, training accuracy 0.640625
step 7600, training accuracy 0.625
step 7800, training accuracy 0.625
step 8000, training accuracy 0.617188
step 8200, training accuracy 0.570312
step 8400, training accuracy 0.648438
step 8600, training accuracy 0.601562
step 8800, training accuracy 0.617188
step 9000, training accuracy 0.609375
step 9200, training accuracy 0.65625
step 9400, training accuracy 0.625
step 9600, training accuracy 0.703125
step 9800, training accuracy 0.5625
step 10000, training accuracy 0.617188
step 10200, training accuracy 0.625
step 10400, training accuracy 0.703125
step 10600, training accuracy 0.625
step 10800, training accuracy 0.617188
step 11000, training accuracy 0.703125
step 11200, training accuracy 0.648438
step 11400, training accuracy 0.601562
step 11600, training accuracy 0.585938
step 11800, training accuracy 0.601562
step 12000, training accuracy 0.65625
step 12200, training accuracy 0.648438
step 12400, training accuracy 0.648438
step 12600, training accuracy 0.75
step 12800, training accuracy 0.585938
step 13000, training accuracy 0.703125
step 13200, training accuracy 0.609375
step 13400, training accuracy 0.671875
step 13600, training accuracy 0.703125
step 13800, training accuracy 0.648438
step 14000, training accuracy 0.671875
step 14200, training accuracy 0.640625
step 14400, training accuracy 0.632812
step 14600, training accuracy 0.679688
step 14800, training accuracy 0.625
finished! test accuracy 0.640625
四 运行说明
可以看出,识别效果得到了收敛,正确率在0.6左右,这个正确率不算很高,因为模型相对简单,只是用了两层的卷积操作。
实例中对于卷积核池化的使用也表明了一种习惯,一般在卷积过程中都会设为步长为1的same卷积,即大小不变,需要降维时则是全部通过池化来完成的。

猜你喜欢

转载自blog.csdn.net/chengqiuming/article/details/80299051