目录正则表达式
MNIST是一个很是有名的手写体数字识别数据集,在不少资料中,这个数据集都会被用做深度学习的入门样例。MNIST数据集是NIST数据集的一个子集,它包含了60000张图片做为训练数据,10000张图片做为测试数据。如下代码是使用TensorFlow读取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
TensorFlow提供了经过变量名称来建立或者获取一个变量的机制。经过这个机制,在不一样函数中能够直接经过变量名称来建立或者获取一个变量的机制。经过这个机制,在不一样的函数中能够直接经过变量的名字来使用变量,而不须要将变量经过参数的形式处处传递。TensorFlow中经过变量名称获取变量的机制主要是经过tf.get_variable和tf.variable_scope函数来实现,还能够同规格tf.Variable函数来建立变量。测试
经过tf.variable_scope函数能够控制tf.get_variable函数的语义。当tf.variable_scope函数使用参数reuse=True生成上下文管理器时,这个上下文管理器内全部的tf.get_variable函数会直接获取已经建立的变脸。若是变量不存在,则tf.get_variable函数将报错;相反,若是tf.variable_scope函数使用参数reuse=None或者reuse=False建立上下文管理器,tf.get_variable操做将建立新的变量。若是同名变量已经存在,则tf.get_variable函数将报错。如下代码示例说明了经过variable_scope来管理变量:编码
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)
运行结果:spa
v:0 foo/v:0 foo/bar/v:0 v1:0
TensorFlow提供了一个很是简单的API来保存和还原一个神经网络模型。这个API就是tf.train.Saver类。下面代码给出了保存和加载计算图的方法:rest
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]
全链接神经网络处理图像的最大问题在于全链接层的参数太多,参数增多除了致使计算速度减慢,还很容易致使过拟合问题。因此须要一个更合理的神经网络结构来有效地减小神经网络中参数个数,卷积神经网络就能够达到这个目的。
卷积神经网络主要由5种结构组成:输出层、卷积层、池化层、全链接层和Softmax层。
输入层:输入层是整个神经网络的输入,在处理图像的卷积神经网络中,它通常表明了一张图片的像素矩阵。
卷积层:从名字能够看出。卷积层是一个卷积神经网络中最为重要的部分。和传统全链接层不一样,卷积层中每个节点的输入只是上一层神经网络的一小块,这个小块经常使用的大小有3*3或者5*5。卷积层试图将神经网络中的每一小块进行更加深刻地分析从而获得抽象程度更高的特征。通常来讲,经过卷积层处理过的节点矩阵会变得更深。
池化层:池化层神经网络不会改变三维矩阵的深度,可是它能够缩小矩阵的大小。池化操做能够认为是将一张分辨率较高的图片转化为分辨率较低的图片。经过池化层,能够进一步缩小最后全链接层中节点的个数,从而达到减小整个神经网络中参数的目的。
全链接层:我能够将卷积层和池化层当作自动图像特征提取的过程。在特征提取完成以后,仍然须要使用全链接层来完成分类任务。
Softmax层:Softmax层主要用于分类问题,经过Softmax层能够获得当前样例属于不一样种类的几率分布状况。
卷积层神经网络结构中最重要的部分,称之为过滤器(filter)或者内核(kernel)。过滤器能够将当前层神经网络上的一个子节点矩阵转化为下一层神经网络上的一个单位节点矩阵。单位节点矩阵指的是一个长和宽都为1,但深度不限的节点矩阵。子节点矩阵的尺寸也被称之为过滤器的尺寸,经常使用的过滤器尺寸有3*3或5*5。由于过滤器处理的矩阵深度和当前层神经网络节点矩阵的深度是一致的,因此虽然节点矩阵是三维的,但过滤器的尺寸只须要指定两个维度。过滤器中另一个须要人工指定的设置是处理获得的单位节点矩阵的深度,这个设置称之为过滤器的深度。
卷积层的参数个数要远远小于全链接层,并且卷积层的参数个数和图片的大小无关,它只和过滤器的尺寸、深度以及当前层节点矩阵的深度有关,这使得卷积神经网络能够很好地扩展到更大的图像数据上。
在卷积层之间每每会加上一个池化层,池化层能够很是有效地缩小矩阵的尺寸,从而减小最后全链接层中的参数。使用池化层能够加快计算速度,也有防止过拟合问题的做用。池化层前向传播过程也是经过移动一个相似过滤器的结构完成的,不过池化层过滤器中的计算不是节点的加权和,而实采用更加简单的最大值或者平均值计算。
卷积层和池化层中过滤器移动的方式是类似的,惟一的区别在于卷积层使用的过滤器是横跨整个深度的,而池化层使用的过滤器只影响一个深度上的节点。因此池化层的过滤器除了在长和宽两个维度移动,它还须要在深度这个维度上移动。
如下正则表达式公式总结了一些经典的用于图片分类问题的卷积神经网络结构:
输入层—>(卷积层+—>池化层?) +—>全链接层+
在以上公式中,“卷积层+”表示一层或者多层卷积层,大部分卷积神经网络中通常最多连续使用三层卷积层。“池化层?”表示没有或者一层池化层。池化层虽然能够起到减小参数防止过拟合问题,可是在部分论文中也发现能够直接经过调整卷积步长来完成。在多轮卷积层和池化层后,卷积神经网络在输出以前通常会通过1~2个全链接层。好比LeNet-5模型就能够表示为如下结构:
输入层—>卷积层—>池化层—>卷积层—>池化层—>全链接层—>全链接层—>输出层
Inception结构是一种和LeNet-5结构彻底不一样的卷积神经网络结构。在LeNet-5模型中,不一样卷积层经过串联的方式链接在一块儿,而Inception-v3模型中的Inception结构是将不一样的卷积层经过并联的方式结合在一块儿。Inception模块中通常会使用不一样尺寸的过滤器处理输入矩阵,经过使用全零填充且步长为1,那么前向传播获得的结果矩阵的长和宽都与输入矩阵一致。这样通过不一样过滤器处理的结果矩阵能够拼接成一个更深的矩阵。通常推荐使用TensorFlow-Slim工具来更加简洁地实现一个卷积层。例如:
net = slim.conv2d(input, 32, [3, 3])
TensorFlow提供了一种统一的格式来存储数据,这个格式就是TFRecord。
通常图像的原始输入数据是直接使用图像原始的像素矩阵,可是能够经过对图像的预处理,能够尽可能避免受到无关因素的影响。TensorFlow提供了几类图像处理函数,分别为图像编码处理、图像大小调整、图像翻转、图像色彩调整和处理标注框。