Session
会话(Session)
Session是tensorflow为了控制和输出文件所执行的语句,也就是说,如果使用了tensorflow,而你又想正常输出,那就需要创建一个会话,在会话中执行sess.run()来完成你的需求。
1 | import tensorflow as tf |
注意:对于张量的写法,无论是几维,最外面总是有个中括号,然后每一维一个中括号
变量
tensorflow中变量必须用tf.Variable()函数来定义,而且应以完了之后必须用tf.initialize_all_varialbles()来初始化,其实这里的初始化也只是静态的初始化,最后还要在session中run一下,run()完之后变量算是真正得到了初始化,但是如果要输出某个变量的值,仍需要sess.run()将Session指针移过去
1 | import tensorflow as tf |
占位符(placeholder)
顾名思义,占位符在声明的时候并没有值给它初始化,这也就是它为什么叫占位符的原因,仅仅起到一个占位置的作用,那它什么时候有值呢?它会在session中被赋值,也就是说,如果程序中不算一开始就给值的话,可以用占位符的方式。
1 | import tensorflow as tf |
placeholder最终在sess.run()中用feed_dict{}进行输入,需要注意的是,即便这里shape是[1,1],后面输入时仍是[[1]]的形式
Tensorboard
关于tensorboard的使用,大概分为一下几步:
tf.summary.histogram()或者tf.summary.scalar()来绘制图层
,从名字上讲,histogram绘制的是柱状图,scalar绘制的是折线图,但其实我并不认识histogram绘制的是什么东西merged = tf.summary.merge_all
将所有的summary汇总在一起writer = tf.summary.FileWriter()
将event文件写到指定目录下result = sess.run(merged,feed_dict={...})
writer.add_summary(result,i)
- 然后在命令行中
tensorboard --logdir event文件目录
Regression代码分析
这里是一个回归分析的例子
1 | # -*- coding: utf-8 -*- |
它的学习过程是这样的,对于两个初始值xs,ys,xs会经过某种变换到达ys,这里我们通过隐含层,会计算出来一个Output,通过训练不断减小ys(理想值)和output(实际值)的误差,来达到学习的效果
Classification代码分析
1 | # -*- coding: utf-8 -*- |
dropout fix overfitting
1 | # -*- coding: utf-8 -*- |
有点不太明白的是,loss生成的是两个event文件,为什么最后显示在一张图里,难道说是tensorflow自己把logdir下的两个文件夹下的两个文件合并了么
遇到的问题
InvalidArgumentError: You must feed a value for placeholder tensor 'Placeholder' with dtype float
一直以为是占位符的问题,后来发现是tensorboard的问题,因为上述代码中其实是要绘制两份图表,大概是因为tensorflow的
tf.merge_all_summaries()
使用一个默认的图来收集我们的所有操作,包括此前进行的一些错误操作,所以我在所有的tf操作之前加了代码tf.reset_default_graph()
就好了,更多请参考
一些小问题
- 在引入matplotlib时,有错误显示
spyder No module named 'PyQt4'
,几经折腾,最后发现系统中有新版本PyQt5而默认设置还是4,所以打开Tools -> Preferences -> IPython console -> Graphics -> Backened 修改为QT5
Convolution Neural Network
CNN常用在图片识别,计算机视觉等领域,它大概操作如下:
- 对于一张图片,它有长宽高,这里的高指的是它是黑白还是彩色的
- 然后有个过滤器,在图片上进行扫描,每次会扫描图片上的一小部分区域,经过一次扫描,会把这个图片压缩成,长和宽更小,高度更厚的一个图片,这个过程就叫做卷积。每次扫描多大一块区域呢,我们把这个叫做patch,有时候也叫它Kernel,还有一个术语叫stride,表示扫描时移动的步幅。这个过程其实就是对特征的多次提取,其中的高度就表特征,这样的过程重复几次后,会得到一个长宽很小,高度很厚的图片,
- 然后把它放到全连接神经网络中进行分类。
如果每次扫描时stride过大,可能会造成信息的损失,这时候就需要pooling 池化来减少 这个效果。
根据扫描中如何处理边界,有valid padding和same padding,valid padding表示只处理图片边缘内容,不会涉及边缘以外的东西,same padding表示将图片边缘以外的东西用0来填充
代码分析
1 | # -*- coding: utf-8 -*- |
RNN
用来做classification的例子
1 | # -*- coding: utf-8 -*- |
CNN做regression的例子
1 | """ |
上述例子中,shape的变化很烦人呐
综合上述两个例子,LSTMRNN的核心过程,input_layer,cell,output_layer,对此tensorflow已经为我们做了很大的集成工作,需要注意的是,input_layer阶段需要进行reshape,不过用心的tf api似乎没有这个问题,然后就是output_layer部分也要reshape,cell阶段主要是构建cell, init state,并执行RNN,框架大概就是i这样了。
损失函数
对损失函数求导,从而知道如何调节参数能够使损失函数超降低的方向发展。
上图就是一个用于训练模型的迭代的方法。
梯度下降法
梯度,是由偏导数组成的矢量,而偏导数,指的是多元函数对某一个自变量的导数(保持其他变量不变),偏导数在几何上反应出来的就是这个函数沿着该自变量维度的一个增减情况,所以由偏导数组成的梯度,就可以描述函数在整个定义域上的一个起伏情况。
通过梯度下降的方法,我们能够更快的找到损失最小的点。
学习速率
这里会有一个学习速率的概念,其表示每次训练的一个步长,学习速率并非越大越好,因为有时学习速率交大时,可能直接跳过损失函数最小的点。例如,如果梯度大小为 2.5,学习速率为 0.01,则梯度下降法算法会选择距离前一个点 0.025 的位置作为下一个点。