TensorFlow 是一个非常强大的用来做大规模数值计算的库。其所擅长的任务之一就是实现以及训练深度神经网络。
TensorFlow 可以拆分成 tensor 和 flow 两部分来理解,tensor 指的是张量,是维度的推广,表示更多维度的矩阵;flow 指的是流,一层层的计算可以看作是“张量”在计算模型上的流动,简单的说就是看作计算过程。
TensorFlow 的工作方式是:
- 使用图(graph)来表示计算任务.
- 在会话(Session)的上下文(context)中执行图.
- 使用 tensor 表示数据.
- 通过变量(Variable)维护状态.
- 使用 feed 和 fetch 可以为任意的操作(arbitrary operation)赋值或者从其中获取数据.
TensorFlow 程序通常被组织成一个构建阶段和一个执行阶段。在构建阶段, 节点的执行步骤被描述成一个图;在执行阶段, 使用会话执行图中的节点计算。
当我们开始学习编程的时候,第一件事往往是学习打印”Hello World”。就好比编程入门有Hello World,机器学习入门有MNIST。MNIST是一个入门级的计算机视觉数据集,它包含各种手写数字图片:
它也包含每一张图片对应的标签,告诉我们这个是数字几。比如,上面这四张图片的标签分别是5,0,4,1。
这里我们搭建一个卷积神经网络来识别图中的数字。
加载MNIST数据集
首先是采用一个脚本来自动下载和导入MNIST数据集,它会自动创建一个’MNIST_data’的目录来存储数据。
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('MNIST_data', one_hot = True)
使用InteractiveSession类创建一个会话,通过它可以更加灵活地构建代码。它能在运行图的时候,插入一些计算图,如果没有使用InteractiveSession,那么需要在启动session之前构建整个计算图,然后启动该计算图。
import tensorflow as tf
sess = tf.InteractiveSession()
设置输入数据的参数,x、y_用占位符表示,用来存储输入图像展开形成的向量和输入图像的标签。
x = tf.placeholder("float", shape = [None, 784])
y_ = tf.placeholder("float", shape = [None, 10])
tf.placeholder(dtype, shape=None, name=None)函数可以理解为形参,用于定义过程,在执行的时候再赋具体的值,返回的是一个tensor。
参数:
- dtype:数据类型,常用的数据类型有tf.float32,tf.float64等.
- shape:数据形状,可以是一维值,也可以是多维。这里的[None, 784]和[None,10]表示的是固定列数、任意行数的数据.
- name:名称.
初始化权重
创建这个模型需要创建大量的权重和偏置项,而且权重在初始化时应该加入少量的噪声来打破对称性以及避免0梯度。我们使用的是ReLU神经元,因此比较好的做法是用一个较小的正数来初始化偏置项,以避免神经元节点输出恒为0的问题(dead neurons)。为了不在建立模型的时候反复做初始化操作,这里定义两个函数用于初始化。
#生成shape形状的标准差为0.1的正态分布中的随机值
def weight_variable(shape):
initial = tf.truncated_normal(shape, stddev = 0.1)
return tf.Variable(initial)
#生成形状为shape的值都为0.1的常量
def bias_variable(shape):
initial = tf.constant(0.1, shape = shape)
return tf.Varia