一、几个基本概念
1. 前向传播
输入 ------(模型+参数)------> 输出
2. 损失函数
(1) 分类问题:交叉熵 + softmax -> tf.nn.sparse_softmax_cross_entropy_with_logits()
(2) 回归问题:MSE均方误差
3. 反向传播
调整参数使得损失函数的差距变小
(1) 反向传播算法:所有参数
(2) 梯度下降法:单个参数
4. 激活函数
神经网络 线性->非线性
(1) ReLU: f(x)=max(x,0)
(2) sigmoid: f(x)=1/(1+e^(-x))
(3) tanh: f(x)=(1-e^(-2x)/(1+e^(-2x))
5. 监督学习
在已知答案的标注数据集上,模型给出的预测结果要尽量接近真实的答案。
二、TensorFlow入门
1. 计算图
(1) TensorFlow是一个通过计算图的形式来表述计算的编程系统
(2) 图必须在会话(session)里启动。
2.张量
(1) 张量(Tensor)和变量(Variable)都有
- 形状 - .shape
- 类型 - .dtype
- 值 - .numpy()
*变量类型不可变,但维度可变(在assign()的参数里指定validate_shape=False)。
(2) 张量支持的类型
- 实数:float32, float64
- 整数:int8, int16, int32, int64, uint8
- 布尔型:bool
- 复数:complex64, complex128
3. TensorFlow游乐场
http://playground.tensorflow.org
4. 神经网络反向传播优化流程图
5 训练神经网络的过程
(1) 定义神经网络的结构和前向传播的输出结果。
(2) 定义损失函数以及选择反向传播优化的算法。
(3) 生成会话(tf.Session)并且在训练数据上反复运行反向传播优化算法。
三、深层神经网络
y = x * W + bias
1. 全连接神经网络
2. 神经网络优化算法
(1) 深度学习的优化算法,说白了就是梯度下降。
- 标准梯度下降:先计算样本汇总的误差,然后根据总误差来更新权值。
- 随机梯度下降:随机抽取一个样本来计算误差,然后更新权值。
- 批量梯度下降:以总样本抽取一个批次(比如1万个样本选取100个样本作为1个batch),然后计算这个batch的总误差,根据总误差来更新权值。
(2) 学习率逐渐变小可以使训练结果收敛。比如学习率设为0.95^n (n为训练次数)。
(3) 滑动平均模型:y = min {decay, (1 - 9 / (new_num + 10))} (decay一般为非常接近1的数,eg. 0.999或0.9999)
(4) 神经网络优化方向
- 激活函数
- 隐藏层
- 滑动平均模型
- 指数衰减的学习率
- 正则化损失
四、卷积神经网络
1. MNIST数据处理
(1) 图分的分辨率为width*height,而image的shape为[height, width, channel],长和宽的顺序不一样。
(2) TensorFlow模型一般会存在后缀为 .ckpt 的文件中。
- model.ckpt.meta: 计算图中节点及元数据。
- model.ckpt.index: 保存所有变量的取值。
- model.ckpt.data-*****-of-*****: 同上。
- checkpoint: 所有模型文件的文件名。
2.卷积神经网络(Convolutional Neural Network, CNN)
(1) 卷积层(Convolution):侦测pattern不需要看看整个image,只看一小部分就行。同样的pattern会出现在图片中的不同位置。(有多少个filter,输出的深度就是多少)
- tf.nn.conv2d()
(2) 池化层(Pooling):降采样(梯度下降)
- tf.nn.max_pool(): 最大池化层
- tf.nn.avg_pool(): 平均池化层
3. 经典卷积网络模型
(1) LeNet-5模型
(2) Inception-v3模型
4. 神经网络迁移
5. TFRecord输入数据格式
- tf.TFRecordReader(): 读
- tf.python_io.TFRecordWriter(): 写
6. 图像数据处理
(1) 图像编码处理
- tf.image.decode_jpeg(): 解码
- tf.image.encode_jpeg(): 编码
(2) 图像大小调整(处理前将图像转化为实数类型,避免精度损失)
- tf.image.resize_images(): 拉伸原图像
- tf.image.resize_image_with_crop_or_pad(): 裁剪或填充图像
- tf.image.central_crop(): 按比例裁剪/填充图像
- tf.image.crop_to_bounding_box(): 裁剪指定区域图像
- tf.image.pad_to_bounding_box(): 填充指定区域图像
(3) 图像翻转
- tf.image.flip_up_down(): 上下翻转
- tf.image.flip_left_right(): 左右翻转
- tf.image.transpase_image(): 对角线翻转
- tf.image.random_flip_up_down(): 以50%概率上下翻转
- tf.image.random_flip_left_right(): 以50%概率左右翻转
(4) 图像色彩调整
- tf.image.adjust_brightness(): 调整亮度(最后须要有截断操作)
- tf.image.adjust_contrast(): 调整对比度
- tf.image.adjust_hue(): 调整色相
- tf.image.adjust_saturation(): 调整饱和度
- tf.image.per_image_standardization(): 图像标准化
- tf.image.random_brightness(): 随机调整亮度
- tf.image.random_contrast(): 随机调整对比度
- tf.image.random_hue(): 随机调整色相
- tf.image.random_saturation(): 随机调整饱和度
(5) 处理标注框
- tf.image.draw_bounding_boxes()
7. 多线程输入数据处理框架
(1) 经典输入数据处理流程:
指定原始数据的文件列表
-> 创建文件列表队列
-> 从文件中读取数据
-> 数据预处理
-> 整理成Batch作为神经网络输入
(2) 队列
- tf.FIFOQueue(): 先进先出队列
- tf.RandomShuffleQueue(): 随机队列
(3) 多线程
- tf.Coordinator.should_stop(): 信号值,决定是否要退出线程
- tf.Coordinator.request_stop(): 将信号值设为True,通知其它线程退出
- tf.Coordinator.join(): 等待所有线程完成
- tf.train.QueueRunner(): 定义QueueRunner
- tf.train.add_queue_runner(): 添加QueueRunner到默认集合
- tf.train.start_queue_runner(): 启动QueueRunner
(4) batchsize, iteration 和epoch的区别
- batchsize: 批大小,即每次训练在训练集中取batchsize个样本训练。
- iteration: 1个iteration等于使用batchsize个样本训练一次。
- epoch: 1个epoch等于使用训练集中的全部样本训练一次,通俗的说epoch的值就是整个数据集被轮几次。
eg. 训练集有500个样本,batchsize=10,那么训练完整个样本集: iteration=50,epoch=1。
8. 数据集(Dataset)
dataset = tf.data.TFRecordDatasetJ(input_files)
dataset = dataset.map(parser) # parser is a function which return feature1 and feature2
iterator = dataset.make_one_shot_iterator()
feature1, feature2 = iterator.get_next()
(1) 遍历器包括
- make_one_shot_iterator
- make_initializable_iterator
- make_reinitializable_iterator
- make_feedable_iterator
五、循环神经网络
1. 循环神经网络(Recurrent neural network, RNN)
2. 长短时记忆网络(Long Short Term Memory, LSTM)
六、TensorFlow高层封装
1. TensorFlow-Slim和TFLearn
TensorFlow 2.0不支持TensorFlow-Slim和TFLearn,因为tensorflow.contrib在TensorFlow 2.0中被移除了。
2. Keras
3. Estimator
七、TensorFlow计算加速——GPU
1. 同步模型 VS 异步模型
(1) 同步模型
优点:不同设备之间完全独立,训练效率高。
缺点:参数更新缺陷,有可能无法达到较优训练结果。
(2) 异步模型
优点:解决异步模型参数更新的问题。
缺点:每一轮训练时间取决于训练最慢的设备,其它完成了的设备很多时间都花在等待上,训练效率低。
2. GPU
GPU增加,处理能力也增加,但是非线性的。
3. 计算图内分布式 VS 计算图之间分布式
附录
API手册:https://docs.w3cub.com/tensorflow~python/
1. tf.reduce_xxxx
- tf.reduce_sum() #压缩对所有元素求和,用于降维
- tf.reduce_mean() #压缩对所有元素求平均值
- tf.reduce_logsumexp() #压缩对所有元素求log(sum(exp(x)))
- tf.reduce_max() #压缩对所有元素求最大值
- tf.reduce_min() #压缩对所有元素求最小值
- tf.reduce_prod() #压缩对所有元素求积
- tf.reduce_join() #压缩对所有字符串元素求拼接
- tf.reduce_all() #压缩对所有逻辑元素求与
- tf.reduce_any() #压缩对所有逻辑元素求或
import tensorflow as tf
x = tf.constant([[1,1,1],[1,1,1]]) # 求和:tf.Tensor(6, shape=(), dtype=int32)
# 按列求和:tf.Tensor([2 2 2], shape=(3,), dtype=int32)
# 按行求和:tf.Tensor([3 3], shape=(2,), dtype=int32)
# 按照行的维度进行求和: tf.Tensor([[3],[3]], shape=(2, 1), dtype=int32)
# 按照行列求和:tf.Tensor(6, shape=(), dtype=int32) |
See details at: https://docs.w3cub.com/tensorflow~python/tf/reduce_sum/