tensorflow新编程概念

编程模式

符号式编程:tensorflow

命令式编程:Pytorch

两种编程模式结合:Caffee,Mxnet

命令式编程就是编写我们理解意义上的程序,很容易理解和调试。,按照原有逻辑执行。符号编程一般先定义各种变量,然后建立一个数据流图,在数据流图中规定各个变量之间的计算关系。最后对数据流图编译,但此时里面还没有任何实际数据,只有把需要运算的数据放进去后,才能在整个模型中形成数据流。

例如:t=tf.add(8,9)

Print(t)

上面并不会打印出17,因为没有执行运算。运算需要放在图中运行,而图的运行只发生在会话中。

基本介绍

Tensorflow计算流图由节点与边组成。Tensor(张量)代表了数据流图的边,而flow(流动)这个操作代表了数据流图中节点所做的操作。

边:Tensor(张量),边定义了数据依赖和控制依赖,实线代表数据依赖,即张量

节点:代表一个操作,用来表示施加的数学运算

在调用Session对象的run()时候,会传入一些tensor,这个过程叫填充。会话的extend可以往图中增加节点和边,run操作时输入计算的节点和填充必要的数据后进行运算。

State=tf.Variable(0, name=’counter’)

创建一个变量,初始化为标量0

填充机制:在构建图时用tf.placeholder()历史替代任意操作的张量,在调用Session对象的run方法执行图时,使用填充数据作为参数。

变量的作用域

Variable_scope:给variable_name和op_name加前缀

V=tf.get_variable(name, shape, dtype, initializer)

通过所给的名字创建或是返回一个变量

tf.variable_scope(\<scope_name>)

为变量指定作用域

注意:如果在开启的变量作用域里使用之前预先定义的一个作用域,则会跳过当前变量的作用域,保持预先存在的作用域不变。

变量作用域可以默认携带一个初始化器,在这个作用域的子作用域或变量都可以继承或者重写父作用域初始化器中的值。

在作用域variable_scope下的操作,会被加上前缀:

With tf.variable_scope(“foo”):

X=1.0+tf.get_variable(“v”, [1])

Assert x.op.name==”foo/add”

Name_scope:为变量划分范围,在可视化中,这表示在计算图中的一个层级。

name_scope会影响op_name,不会影响get_variable()创建的变量,但会影响Variable()创建的变量。

批标准化

为了克服神经网络层数加深导致难以训练而产生的。解决思路:根据训练样本和目标样本的比例对训练样本做一个矫正。因此,通过引入批标准化来规范化某些层或者所有层的输入,从而固定每层输入信号的均值域方差。

批标准化一般用在激活函数前,是结果均值为0,方差为1。在遇到NN收敛速度很慢或梯度爆炸等无法训练的情况下,可以尝试采用批标准化。

相关函数:tf.nn.batch_normalization( )函数

激活函数

Sigmoid函数

Tanh函数

Relu函数

Dropout函数:一个神经元依概率keep_prop决定是否被抑制。如果被抑制,输出为0,若不被抑制,该神经元的输出被放大为原来的1/keep_prop倍。

在训练的时候用概率p丢弃,在预测的时候,所有参数都按照比例乘以p缩小。在实际实现中,都是用反向ropout代替dropout,也就是,在训练的时候一边dropout,然后再按照比例放大,也就是乘以1/p,然后在预测时候不做任何处理。

当输入数据特征相差明显,tanh会比较好。当特征相差不明显,sigmoid函数好,用sigmoid函数和tanh‘函数要注意规范化,否则激活值容易进入平坦区,失去训练效果。Relu作为激活函数可以不用考虑规范化。

模型存储和加载

检查点文件.ckpt,只包含权重和程序中定义的变量,不包含图结构Saver.save()

图协议文件.pb,只包含图结构,没有权重参数信息,tf.train.write_graph()

加载数据

预加载:在图中定义常量和变量来保存所有数据

填充数据:Python产生数据,在通过Session的run方法填充数据

从文件读取:从文件中直接读取,让队列管理器从文件中读取数据。先把样本数据写入TFrecords文件,再从队列中读取。

八. Tensorflow源代码学习

  1. 先对网络模型原理了解,知道实现的基本原理。

2.尝试运行Github上的https://github.com/tensorflow/models的模型,lm_1b,Swivel,syntaxnet,textsum以及tutorials目录中的word2vec,运行模型,尝试调参和调试

conv1d,conv2d,conv3d区别

(注意:卷积操作后得到的时对应的feature map)

2d的运算一般用在图像上,3d的运算用在视屏数据上(连续的几帧是有关系的)

http://blog.csdn.net/liuxiao214/article/details/78212982

9.1. Conv2d:

input:是需要做卷积的输入图像,要求是一个Tensor,具有[batch, in_height,
in_width, in_channels]这样的shape,具体含义是[训练时一个batch的图片数量,
图片高度, 图片宽度,
图像通道数],注意这是一个4维的Tensor,要求类型为float32和float64其中之一。

filter:相当于CNN中的卷积滤波器,要求是一个Tensor,具有[filter_height,
filter_width, in_channels,
out_channels]这样的shape,具体含义是[卷积核的高度,卷积核的宽度,图像通道数,卷积核个数],要求类型与参数input相同。注意,第三维in_channels,就是参数input的第四维。

strides:卷积时在图像每一维滑动的步长,这是一个一维的向量,长度4,一般是[1,x,x,1]的形式。

例子1:

input:使用一张3×3、5通道的图像(对应的shape:[1,3,3,5])。filter:用一个1×1的卷积核(对应的shape:[1,1,5,1])。
strides:[1,1,1,1]。

返回tensor:是一张3×3、单通道(卷积核个数)的feature
map(对应的shape:[1,3,3,1])。

这就相当于每一个像素点,卷积核都与该像素点的每一个通道做点积,该像素点有5个通道。

例子2:

input:使用10张5×5、5通道的图像(对应的shape:[10,5,5,5])。 一个batch有10张图片
filter:用7个3×3的卷积核(对应的shape:[3,3,5,7])。
padding:SAME。
strides:[1,2,2,1]。
返回tensor:是10张3×3、7通道的feature map(对应的shape:[10,3,3,7])