TensorFlow使用函数封装库重写CIFAR卷积网络

一 实例描述
使用tf.contrib.layers进行重构,重写CIFAR卷积网络。

二 代码
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")
# 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
x_image = tf.reshape(x, [-1,24,24,3])
h_conv1 =tf.contrib.layers.conv2d(x_image,64,[5,5],1,'SAME',activation_fn=tf.nn.relu)
h_pool1 = tf.contrib.layers.max_pool2d(h_conv1,[2,2],stride=2,padding='SAME')
h_conv2 =tf.contrib.layers.conv2d(h_pool1,64,[5,5],1,'SAME',activation_fn=tf.nn.relu)
h_pool2 = tf.contrib.layers.max_pool2d(h_conv2,[2,2],stride=2,padding='SAME')
nt_hpool2 = tf.contrib.layers.avg_pool2d(h_pool2,[6,6],stride=6,padding='SAME')
nt_hpool2_flat = tf.reshape(nt_hpool2, [-1, 64])
y_conv = tf.contrib.layers.fully_connected(nt_hpool2_flat,10,activation_fn=tf.nn.softmax)
cross_entropy = -tf.reduce_sum(y*tf.log(y_conv))
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"))
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.078125
step 200, training accuracy 0.335938
step 400, training accuracy 0.390625
step 600, training accuracy 0.242188
step 800, training accuracy 0.414062
step 1000, training accuracy 0.34375
step 1200, training accuracy 0.5
step 1400, training accuracy 0.46875
step 1600, training accuracy 0.46875
......

运行比较慢,不再等后面结果输出。

四 说明
1 在深层次网络结构中,大量重复代码会使代码可读性越来越差,所以使用tf.contrib.layers不失为一个好办法。
2 tf.contrib.layers中具体函数介绍
看似简单的函数,幕后却做了很多事情,在上面的代码中,没有定义权重,没有初始化,没有多大的的参数,这些都是tf.contrib.layers帮我们封装好的。
下面以最复杂的卷积为例进行介绍,其他函数与之相似,不再展开介绍。
convolution(inputs,
num_outputs,
kernel_size,
stride=1,
padding='SAME',
data_format=None,
rate=1,
activation_fn=nn.relu,
normalizer_fn=None,
normalizer_params=None,
weights_initializer=initializers.xavier_initializer(),
weights_regularizer=None,
biases_initializer=init_ops.zeros_initializer,
biases_regularizer=None,
reuse=None,
variables_collections=None,
outputs_collections=None,
trainable=True,
scope=None)
参数说明
inputs:代表输入
num_outputs:代表输出几个channel。这里不需要再指定输入的channel了,因为函数会自动根据inputs的shape去判断。
kernel_size:卷积核的大小,不需要带上batch和channel,只需要输入尺寸即可。[5,5]就代表5*5大小的卷积核。如果长、宽都一样,也可以直接写一个数字5.
stride:步长,默认是长、宽都相等的步长。卷积时,一般都用1,所以默认值也是1,如果长和宽步长都不同,也可以用一个数组[1,2]。
padding:padding的规则。
activation_fn:输出后的激活函数。
weights_initializer:权重的初始化,默认initializers.xavier_initializer函数,
weights_regularizer:正则化项。
trainable:是否看训练,如作训练节点,必须设为True。默认即可。

五 参考



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值