Tensorflow 基础介绍:
机器学习框架:
Tensorflow、Caffe、Torch、MXNet 考虑(开发语言、并行计算、分布式训练、语言模型、模型部署、高层封装)
slim API: 提供好的数据集去跑分,图片分类
slim: 数据集、多机多卡加速训练(数据同步、并行计算)、模型
download_and_convert_data.py: 下载和转换数据
train_image_classifier.py:数据训练
eval_image_classifier.py: 训练情况 (验证)
export_interference_graph.py: 训练的可以用了 (导出)
卷积神经网络:
卷积convolution 激活函数activation 池化pooling 批归一化batch normalization Dropout (VGG模型)
卷积:
卷积的计算方式 :
公开课:http://deeplearning.stanford.edu/wiki/index.php/卷积特征提取
特性:局部相关性(数据和周围的数据关系十分紧密)中心感受引
激活函数:
公开课:https://zhuanlan.zhihu.com/p/21462488?refer=intelligentunit
非线性特征的能力 不能等比例的增长的--非线性的扭曲
池化:
池化的计算方式:http://deeplearning.standord.edu/wiki/index.php/池化
临近的像素点通过某种运算变成一个像素点
缩化--信息保留--平移不变性
批归一化:
批归一化计算方式:http://blog.csdn.net/shuzfan/article/details/50723877
梯度弥散问题--数据重新规整
加速训练,尽快收敛
Dropout:
Dropout计算方式:https://zhuanlan.zhihu.com/p/21560667
增大随机扰动、减少过拟合、可能使收敛变慢
冻结一部分神经元(缺一堂课)-- 自己去学习,减少过拟合--收敛慢
优秀的模型分析:
AlexNet: 结构清晰简单,五层卷积,一层一层叠加 细段
VGG:结构简单清晰,简单深度结构的最后一个网络,预训练权重应用广泛,深度学习成为了主流方向 细、长
ResNet(152层 1001层网络): 超越了深度的极限,残差传递结构,Block结构,跳接和堆叠 又细又长
Inception: 也许是最优秀的模型,1x1卷积--Branch结构--非对称卷积--凹凸有致
DenseNet: 大杂烩, 1x1 bottleneck--Block+Branch--可扩展的设计-- 数据流经网络的时候可能选择路径的多少 来判断模型
如何训练自己的模型:
①数据准备(需要修改代码)
②模型训练
③启动训练
④过程监控(调参:Dropout比例、网络的结构)
⑤结果评估(需要修改代码)
⑥上线测试(需要修改代码)
(1)Tensorflow 使用TFRecord生成数据
_NUM_VALIDATION:验证 设的数目通常是总图片的10%
_NUM_SHARDS:分成几个record文件
(2)模型选择:
收敛速度: VGG>Inception>DenseNet>ResNet
泛化能力: Inception~DenseNet~ResNet>VGG
运算量: Inception<DenseNet<ResNet<VGG
内存开销: Inception<ResNet<DenseNet<VGG
下载预训练模型:Inception V4
(3)启动训练:
-dataset_name
-model_name
-checkpoint_exclude_scopes
-trainable_scopes (固化其他层、只训练最后一层)
-dataset_dir
-checkpoint_path(绝对路径)
-train_dir
-learning_rate
-batch_size
(4)过程监控:
TensorBoard: 主要监控Loss、Global_step和batch
启动命令: tensorboard --logindir=/tmp/my_train
(5)结果评估:
用训练集和验证机验证 --将训练集和测试集输出到不同的子目录中
--注意测试集的走势
验证集比训练集低一些,趋势可能间距拉大
如果训练集往上,验证集往下说明开始过拟合了
(6)测试和上线:
导出模型 export 修改代码取得预处理函数(缩放到-1.0-1.0之间)
精简模型
使用模型 TF自带的classify_image.py
利用Flask做一个简单的API和Web界面 最直观的方式 WebServer(例如植物识别的应用)
(7)生产环境的使用
Tensorflow Serving -->导出模型 -->执行Serving --> 执行Client
数据准备-->训练-->验证 -->使用(预测)slim完全没提供的是 预测
相关的问题:
需要多少照片才能训练自己的模型?
--每种>20,图片总数和参数数量有关
照片都有什么要求?
--贴近实际使用场景为好
分辨率是不是固定的?
--对于图像分类、通常使用全连接分类器,会限制输入分辨率
测试时发现识别不准确怎么办?
--增加Dropout
--增大1.2惩罚
图像分类有什么局限?
--硬按一个分类
--同图多物体会有问题
怎么能加快速度?
--CPU不要用pip安装,使用自行编译的安装包
--即使用GPU训练,也减少CPU和磁盘的开销