内容
第 5 章 MNIST 数字识别问题
MNIST 是一个非常知名的手写数字识别数据集,在许多来源中,该数据集被用作深度学习的一个介绍性示例。 MNIST 数据集是 NIST 数据集的子集,其中包含 60,000 张图像作为训练数据和 10,000 张图像作为测试数据。以下代码用于读取 MNIST 数据集。如果本地不存在,会自动下载到本地指定目录,并打印数据集的训练集、验证集、测试集的维度。
from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets("./MNIST_data/", one_hot=True) print ("Training data size: ", mnist.train.num_examples) print ("Validating data size: ", mnist.validation.num_examples) print ("Testing data size: ", mnist.test.num_examples)
运行结果:
Extracting ./MNIST_data/train-images-idx3-ubyte.gz Extracting ./MNIST_data/train-labels-idx1-ubyte.gz Extracting ./MNIST_data/t10k-images-idx3-ubyte.gz Extracting ./MNIST_data/t10k-labels-idx1-ubyte.gz Training data size: 55000 Validating data size: 5000 Testing data size: 10000
提供通过变量名创建或获取变量的机制。通过这种机制,创建或获取变量的机制可以直接通过不同函数中的变量名传递。通过这种机制,变量可以在不同的函数中直接使用它们的名字,而不是以参数的形式传递变量。通过变量名获取变量的机制主要是通过 tf.和 tf。函数和变量也可以使用相同的规范创建 tf.功能。
tf. 的语义。功能可以通过 tf.功能。当 tf.函数使用参数reuse=True 来生成一个上下文管理器,都是tf.上下文管理器中的函数将直接获取创建的面部变化。如果变量不存在,则 tf.函数会报错;相反,如果 tf.函数使用参数reuse=None 或reuse=False 创建一个上下文管理器,tf.操作将创建一个新变量。如果已存在同名变量,则 tf.函数会报错。以下代码示例说明了通过以下方式管理变量:
import tensorflow as tf v1 = tf.get_variable("v", [1]) print (v1.name) with tf.variable_scope("foo"): v2 = tf.get_variable("v", [1]) print (v2.name) with tf.variable_scope("foo"): with tf.variable_scope("bar"): v3 = tf.get_variable("v", [1]) print (v3.name) v4 = tf.get_variable("v1", [1]) print (v4.name)
运行结果:
v:0 foo/v:0 foo/bar/v:0 v1:0
提供了一个非常简单的 API 来保存和恢复神经网络模型。这个 API 是 tf.train.Saver 类。以下代码展示了如何保存和加载计算图:
import tensorflow as tf v1 = tf.Variable(tf.random_normal([1], stddev=1, seed=1)) v2 = tf.Variable(tf.random_normal([1], stddev=1, seed=1)) result = v1 + v2 init_op = tf.global_variables_initializer() saver = tf.train.Saver() with tf.Session() as sess: sess.run(init_op) saver.save(sess, "./Saved_model/model.ckpt")
运行结果:
加载保存的模型:
ith tf.Session() as sess: saver.restore(sess, "./Saved_model/model.ckpt") print (sess.run(result))
运行结果:
INFO:tensorflow:Restoring parameters from ./Saved_model/model.ckpt [-1.6226364]
第 6 章图像识别和卷积神经网络
全连接神经网络处理图像的最大问题是全连接层参数过多。参数的增加不仅会减慢计算速度,而且容易导致过拟合。适合问题。因此,需要更合理的神经网络结构来有效减少神经网络中的参数数量,而卷积神经网络可以达到这个目的。
卷积神经网络主要由五个结构组成:输出层、卷积层、池化层、全连接层和层。
输入层:输入层是整个神经网络的输入。在处理图像的卷积神经网络中,一般表示图片的像素矩阵。
卷积层:顾名思义。卷积层是卷积神经网络中最重要的部分。与传统的全连接层不同,卷积层中每个节点的输入只是前一层神经网络的一小部分。这个小块常用的尺寸是3*3或者5*5。卷积层试图更深入地分析神经网络中的每个小块,以获得更抽象的特征。一般来说,通过卷积层处理的节点矩阵会变得更深。
池化层:池化层神经网络不会改变三维矩阵的深度,但可以减小矩阵的大小。池化操作可以被认为是将高分辨率图像转换为低分辨率图像。通过池化层可以进一步减少最终全连接层的节点数量,从而达到减少整个神经网络中参数的目的。
全连接层:我可以将卷积层和池化层视为自动图像特征提取的过程。特征提取完成后,仍然需要使用全连接层来完成分类任务。
图层:图层主要用于分类问题。通过layer可以得到当前样本属于不同类型的概率分布。
卷积层神经网络结构中最重要的部分称为()或()。滤波器可以将当前层神经网络上的子节点矩阵变换为下一层神经网络上的单位节点矩阵。单位节点矩阵是指长宽均为1的节点矩阵,但不限制深度。子节点矩阵的大小也称为滤波器的大小,常用的滤波器大小为3*3或5*5。因为处理的矩阵的深度和神经网络当前层的节点矩阵的深度是一致的,虽然节点矩阵是三维的,但是的大小只需要指定二维过滤器中另一个需要手动指定的设置是得到的单元节点矩阵的深度,称为过滤器的深度。
卷积层的参数个数远小于全连接层,而卷积层的参数个数与图像的大小无关,只与大小有关,过滤器的深度和当前层的节点矩阵,这使得卷积神经网络可以很好地扩展到更大的图像数据。
通常在卷积层之间添加一个池化层。池化层可以非常有效地减小矩阵的大小,从而减少最终全连接层中的参数。使用池化层可以加快计算速度,还可以防止过拟合问题。池化层的前向传播过程也是通过移动一个类似过滤器的结构来完成的,但是池化层过滤器中的计算不是节点的加权和,而是更简单的最大值或平均值计算。
卷积层和池化层中过滤器的移动方式类似,唯一的区别是卷积层使用的过滤器跨越整个深度,而池化层使用的过滤器只影响一个深度的节点。因此,池化层的过滤器除了长宽两个维度外,还需要在深度维度上移动。
下面的正则表达式公式总结了一些用于图像分类问题的经典卷积神经网络结构:
输入层—>(卷积层+—>池化层?)+—>全连接层+
上式中,“卷积层+”表示一个或多个卷积层,大多数卷积神经网络一般使用最多连续三层的卷积层。 “池化层?”表示没有或只有一个池化层。虽然池化层可以减少参数以防止过拟合,但在一些论文中也发现可以直接通过调整卷积步长来完成。经过多轮卷积层和池化层后,卷积神经网络一般要经过1-2个全连接层才能输出。例如,LeNet-5 模型可以表示为如下结构:
输入层—>卷积层—>池化层—>卷积层—>池化层—>全连接层—>全连接层—>输出层
该结构是与LeNet-5结构完全不同的卷积神经网络结构。在LeNet-5模型中,不同的卷积层是串联的,而-v3模型中的结构是不同的卷积层并联组合而成。该模块一般使用不同大小的滤波器来处理输入矩阵。通过使用全零填充,步长为1,前向传播得到的结果矩阵的长度和宽度与输入矩阵一致。通过这种方式,可以将不同过滤器处理的结果矩阵连接成更深的矩阵。一般推荐使用 -Slim 工具来更简洁地实现一个卷积层。例如:
net = slim.conv2d(input, 32, [3, 3])
第 7 章图像数据处理
提供了一个统一的格式来存储数据,这个格式就是。
一般来说,图像的原始输入数据是直接使用图像的原始像素矩阵,但通过对图像进行预处理,可以尽可能避免无关因素的影响。提供多种图像处理功能,包括图像编码处理、图像缩放、图像翻转、图像颜色调整、标注框处理等。
暂无评论内容