0 关于本文
本文利用 Stanford Dogs Dataset (其数据取自ImageNet
, 包含120个狗分类), 训练了一个用于狗分类的深度学习模型. 本文的目标是TF的Getting Start
.
1 环境搭建(CPU版本为例)
在Linux下, 环境的部署较为简单, 下载 Python2 或者Python3.x版本的TF安装包安装即可.
$ sudo pip install tensorflow-1.3.0rc0-cp27-none-linux_x86_64.whl
在Windows下也可类似的方法安装TF, 但是目前官方仅发布有Python3.x的二进制包, 因此需要在Python3的环境下工作. 另外, Windows 下, 诸如 Numpy/OpenCV 等计算库也较难编译, 推荐一个提供二进制包的地方: Unofficial Windows Binaries for Python Extension Packages. 可能会用到的库有:
Numpy、Scipy、OpenCV、PIL ……
相关的库安装完成后, 可以在 Python 环境运行一段最简单的代码:
>>> import tensorflow as tf # 引入tf模块
>>> hello = tf.constant('Hello, TensorFlow!') # 声明一个类型为string的常量
>>> sess = tf.Session() # Session 是计算的环境
>>> sess.run(hello) # 在session中执行语句
'Hello, TensorFlow!'
>>> a = tf.constant(10)
>>> b = tf.constant(32)
>>> sess.run(a + b)
42
>>>
由此可见, 在Python环境下使用TF, 实际上分为两个过程:
- 定义计算图: 描述计算节点和节点之间的关系.
- 使用Python接口, 向底层的计算图传入
输入数据
, 执行计算图, 并获取相应的输出.
2 网络搭建与训练
2.1 用于分类任务的网络(计算图)的定义
在本文中, 使用了经典的alexnet
来进行分类任务, 网络的定义见 slim-alexnet. 该网络接受大小为(224, 224, 3)
的Tensor作为输入数据, 其输出为与分类任务类别数n相同的实值输出, 即大小为(n,)
.
可以通过如下语句来使用这个网络定义:
from tensorflow.contrib.slim.python.slim.nets.alexnet import alexnet_v2 as alexnet
2.2 训练目标
我们企图通过如上定义的网络
来执行分类任务, 实际上, 是希望获得一个置信度较高的从二维图像到分类数的映射, 该映射对于给定图像的输出值应尽可能的与该图像对应的实际值(label)相似
. 我们有很多方法来描述这种相似, 例如:
- 均方误差(Mean Squared Error, MSE), 其基于真实值和预测值的欧氏距离进行度量.
- 交叉熵(Cross Entropy), 交叉熵是信息论中的概念, 真实值p和预测值q的交叉熵定义为: