目录
介绍
keras是一个机器学习的前端库,tensorflow把其作为前端封装了数据,模型等方法,能够方便的开始数据训练.
实际中可以直接使用tensorflow调用keras库.
keras可以实现以下内容:
1. 简单和快速的原型设计
2. 支持CNN和RNN,或者自行设计模型层
3. 无缝CPU和GPU的切换,支持python2.7-3.6
简单上手的例子
# 基于python3.6
import tensorflow as tf
# 导入数据
mnist = tf.keras.datasets.mnist
# 临时数据目录'~/.keras/datasets/'
(x_train,y_train),(x_test,y_test) = mnist.load_data()
x_train,x_test = x_train/255.0,x_test/255.0
# 选取模型
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28,28)),
tf.keras.layers.Dense(128,activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10,activation='softmax')
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(x_train,y_train,epochs=5)
model.evaluate(x_test,y_test)
该示例是tensorflow学习最简单的示例,表示对图片的分类,最终训练的结果是准确率97%以上.
一些基本概念
- 符号计算
tensorflow是keros的后端,是一个”符号式”的库,基本流程是:首先定义各种变量,然后建立一个”计算图”,计算图规定了各变量的计算关系,之后编译计算图以确定内部细节,此时计算图还是一个空壳(缺少数据),只有把数据放进去才能形成数据流,产生输出. - 张量或tensor
张量可以看作是向量/矩阵的推广.例如规模最小的张量是0阶,即标量(常数);一阶张量是一个向量;二阶张量是一个矩阵;三阶张量就变成了立方体(图片的三个颜色通道);四阶张量就是更高维度的向量. - data_format
在tensorflow中,通道维在最后(“channels_last”),即100张16*32的3通道图片表示为(100,16,32,3),而theano则将通道放在张数后边(“channels_first”).
4.函数式模型
在keras中有一个Sequential(序贯模型),即单输入单输出,一条路走到底,层与层之间只有相邻关系.其实这种模型时函数式模型的特例,更一般的方法是functional model API.
batch
深度学习的优化算法就是梯度下降,每次参数更新有两种选择:
①遍历全部数据计算一次损失函数,然后计算梯度并更新,这样计算量很大,梯度下降慢,不支持在线学习,称为批梯度下降.
②每看一个数据就计算一次损失函数,然后计算梯度并更新,这称为随机梯度下降,这种方法速度快,但收敛性能不好.
为了克服这种缺点,采用折衷的手段,即mini-batch gradient decent,小批量的梯度下降.batch_size指的就是这个批量.epochs
指训练所有数据的次数
使用陷阱
- tf和th
keras提供了两套后端,分别对应Theano和TensorFlow,可以使用需要的卷积核,但如果使用错误并不会报错,但最终得出的结果会很不理想,所以需要特别注意. - 向BN层载入权重
如果淘来一些训练好的BN层,想把权重载入,需要特别注意数据次序.例如keras BN层的参数时[mean, std, gamma, beta]
,但训练参数应该是[gamma, beta, mean, std]
,因为gamma/beta是可训练的参数,后两个不是. - shuffle和validation_split的顺序
模型的fit函数有两个参数,shuffle用于将数据打乱,validation_split用于选取验证集,这里的陷阱是,程序先执行validation_split再执行shuffle,所以如果样本不均匀就会导致选出的验证集不具有一般性,最好提前手动shuffle.