十四、文件读取流程
多线程+队列
第一阶段:构造文件名队列
File_queue=Tf.train.string_input_producer(string_tensor,shuffle=True)
String_tensor:含有文件名+路径的1阶张量
Num_epochs:过几遍数据,默认无限过数据
Return:文件队列
第二阶段:读取与解码
文本文件
读取:Tf.TextLineReader()
解码:tf.decode_csv()
图片文件
读取:tf.WholeFileReader()
解码:tf.image.decode_jpeg(contents)/tf.image.decode_png(contents)
二进制文件
读取:tf.FixedLengthRecordReader(record_bytes)
解码:tf.decode_raw()
TFRecords文件
读取:tf.TFRecordReader()
共同的读取方法:key,value=读取器.read(file_queue)
默认都解码成tf.uint8类型
第三阶段:批处理队列
Tf.train.batch(tensors,batch_size,num_threads=1,capacity=32,name=None)
Tensors:可以是包含张量的列表,批处理的内容放到列表当中
Batch_size:从队列中读取的批处理大小
Num_threads:进入队列的线程数
Capacity:整数,队列中元素的最大数量
Return:tensors
Tf.train.shuffle_batch()
启动运行这些队列操作的线程
Tf.train.QueueRunner()
开启会话:
Tf.train.start_queue_runners(sess=None,coord=None)
Sess:所在的会话
Coord:线程协调器
Tf.train.Coordinator()
Request_stop():请求停止
Should_stop():询问是否结束
十五、神经网络基础
输入层,隐藏层、输出层
感知机==逻辑回归
线性加权=logits=sigmod
神经网络主要用途在于分类
神经网络原理:
损失函数
交叉熵损失
总损失——求平均
最小二乘法——线性回归的损失——均方误差
优化损失函数
Tf.nn.softmax_crose_entropy_with_logits(labels=None,logits=None,name=None)
计算logits和labels之间的交叉损失熵
Labels:标签值
Logits:样本加权之后的值
Return:返回损失值列表
Tf.reduce_mean(input_tensor)
计算张量的尺寸的元素平均值
十六、Mnist手写数字识别
Mnist数据获取API
Mnist手写数字识别
网络设计
全连接层设计
流程
完善模型功能
如何计算准确率
增加变量tensorboard显示
增加模型保存模型
增加模型预测结果输出
完善代码
准确率计算:
(1)比较输出结果最大值所在位置和真实值的的最大所在位置
Tf.equal(Tf.argmax(y_true,1),tf.argmax(y_predict,1)) 一致返回true
-
- 求平均
十七、卷积神经网络
传统意义上的多层神经网络:输入层、隐藏层、输出层。隐藏层根据需要来定
卷积神经网络CNN:加入有效的特征学习部分,在原来的全连接层前面加入了卷积层和池化层。卷积神经网络出现,使得神经网络层数加深。
输入层
隐藏层
卷积层
激活层
池化层
Pooling layer
subsample
全连接层
输出层
卷积神经网络原理:
结构:
卷积层
作用:通过在原始图像上平移来提取特征
激活层
作用:增加非线性分割能力
池化层
作用:减少学习的参数,降低网络的复杂度(最大池化和平均池化)
全连接层
作用:进行损失计算并输出分类结果
十八、卷积层(convolutional Layer)
卷积核 – filter - 过滤器 – 卷积单元 - 模型参数
四大要素:
个数
大小
步数
零填充的大小
零填充就是在图片像素外围填充一圈值为0的像素
如何计算输出图像的大小:
输入体积大小H1,W1,D1
四个超参数:
Filter数量K
Filter大小F
步长S
零填充大小P
输出体积大小H2,W2,D2
H2=(H1-F+2P)/S+1
W2=(W1-F+2P)/S+1
D2=K
卷积网络API:
Tf.nn.conv2d(input,filter,strides=,padding=,name=None)
Input:输入张量,具有[batch,height,width,channel]类型为float32,64
Filter:指定过滤器的权重数量,[height,width,in_channels,out_channels]
Strides:步长strides=[1,stride,stride,1]
Padding:零填充 “SAME””VALID”
“SAME”:越过边缘取样
“VALID”:不越过边缘取样
总结:
- 掌握filter要素的相关计算公式
- Filter大小:1*1,3*3,5*5
- 每个过滤器会带有若干权重和1个偏置
十九、激活函数
Sigmoid缺点:
- 计算量相当大
- 反向传播,梯度消失
- 输入的值的范围[-6,6]
Relu=max(0,x)
Relu优点:
- 有效解决梯度消失的问题
- 计算速度快
- 图像没有负的像素值
API:tf.nn.relu(features,name=none)
Features:卷积后加上偏置的结果
二十、池化层
最主要的作用是特征提取
Pooling的方法很多,通常采用最大池化:
Max_pollong:取池化窗口的最大值
Avg_polling:取池化窗口的平均值
API:tf.nn.max_pool(value,ksize=,strides=,padding=)
Value:4-D Tensor形状[bath,height,width,channels]
Channels:并不是原始图片的通道数,而是多少filter观察
Ksize:池化窗口大小,[1,ksize,ksize,1]
Strides:步长大小,[1,strides,strides,1]
Padding:”SAME””VALID”,默认使用“SAME”
全连接层(Full Connection)起到分类器的作用
运用公式求解输出图片大小:卷积向下取整,池化向上取整
网络的优化和改进:
初始参数的大小缩小
模型大小参数的缩小
使用改进版SGD算法
对于深度网络使用bath normalization或者droupout层(防止过拟合)
验证码识别流程分析:
- 读取图片数据
- 解析csv文件,将标签值对应
- 将filename和标签值联系起来
- 构建卷积神经网络
- 构造损失函数(sigmoid交叉熵损失 )
- 优化损失
- 计算准确率
- 开启会话开启线程