@[TOC]文章目录
模型结构
该模型结构如下:
由卷积层——最大池化层——卷积层——最大池化层——两个全连接层组成。
建立模型
为了达到变量共享这个目的,tensorflow提供了通过变量名称来创建或者获取一个变量的机制。通过这个机制,
在不同的函数中可以直接通过变量的名字来使用变量,而不需要将变量通过参数的形式到处传递。
主要是通过tf.get_variable
和tf.variable_scope
实现的
tf.variable_scope作用域函数,他会在模型中开辟一个属于自己的空间,变量在这里面被管理,
常用于:1)变量共享
2)tensorboard画流程图进行可视化封装变量。
主要用于共享变量,和tf.get_variable()搭配使用,
tf.variable_scope(<scope_name>) 管理传给get_variable()的变量名称的作用域
tf.get_variable(, , )可根据 name 值,返回该变量,
如果该 name 不存在的话,则会进行创建;
代码如下:
定义卷积函数,参数包括图片,批次,类别
import tensorflow as tf
def inference(image,batch_size,n_classess):
#第一个卷积,每个卷积由一个卷积层和一个最大池化层组成
with tf.variable_scope('conv1') as scope:
weights=tf.get_variable('weights',shape=[3,3,3,16],dtype=tf.float32,
initializer=tf.truncated_normal_initializer(stddev=0.1,dtype=tf.float32))
#创建变量,初始化权值,形状是16个长宽通道都为3的大小
biases=tf.get_variable('biases',shape=[16], dtype=tf.float32,
initializer = tf.constant_initializer(0.1))#初始化偏置,16个值是0.1的偏置
conv=tf.nn.conv2d(image,weights,strides=[1,1,1,1],padding='SAME')#定义卷积层,
pre_activation = tf.nn.bias_add(conv, biases)
conv1 = tf.nn.relu(pre_activation, name= scope.name)#第一层卷积结果,用relu函数激活
pool1=tf.nn.max_pool(conv1,ksize=[1,3,3,1],strides=[1,2,2,1],padding='SAME')#池化层
这一段代码的意思是:建立一个名为“conv1”的作用域,在这里面创建两个变量,分别是weight
和biases
,
之前在写手写数字识别的时候权值初始化用的tf.truncated_normal()
,这里用的tf.truncated_normal_initializer()
。说一下两者的区别:
tf.truncated_normal