keras基础

介绍

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%以上.

一些基本概念

  1. 符号计算
    tensorflow是keros的后端,是一个”符号式”的库,基本流程是:首先定义各种变量,然后建立一个”计算图”,计算图规定了各变量的计算关系,之后编译计算图以确定内部细节,此时计算图还是一个空壳(缺少数据),只有把数据放进去才能形成数据流,产生输出.
  2. 张量或tensor
    张量可以看作是向量/矩阵的推广.例如规模最小的张量是0阶,即标量(常数);一阶张量是一个向量;二阶张量是一个矩阵;三阶张量就变成了立方体(图片的三个颜色通道);四阶张量就是更高维度的向量.
  3. data_format
    在tensorflow中,通道维在最后(“channels_last”),即100张16*32的3通道图片表示为(100,16,32,3),而theano则将通道放在张数后边(“channels_first”).

4.函数式模型
在keras中有一个Sequential(序贯模型),即单输入单输出,一条路走到底,层与层之间只有相邻关系.其实这种模型时函数式模型的特例,更一般的方法是functional model API.

  1. batch
    深度学习的优化算法就是梯度下降,每次参数更新有两种选择:
    ①遍历全部数据计算一次损失函数,然后计算梯度并更新,这样计算量很大,梯度下降慢,不支持在线学习,称为批梯度下降.
    ②每看一个数据就计算一次损失函数,然后计算梯度并更新,这称为随机梯度下降,这种方法速度快,但收敛性能不好.
    为了克服这种缺点,采用折衷的手段,即mini-batch gradient decent,小批量的梯度下降.batch_size指的就是这个批量.

  2. epochs
    指训练所有数据的次数

使用陷阱

  1. tf和th
    keras提供了两套后端,分别对应Theano和TensorFlow,可以使用需要的卷积核,但如果使用错误并不会报错,但最终得出的结果会很不理想,所以需要特别注意.
  2. 向BN层载入权重
    如果淘来一些训练好的BN层,想把权重载入,需要特别注意数据次序.例如keras BN层的参数时[mean, std, gamma, beta],但训练参数应该是[gamma, beta, mean, std],因为gamma/beta是可训练的参数,后两个不是.
  3. shuffle和validation_split的顺序
    模型的fit函数有两个参数,shuffle用于将数据打乱,validation_split用于选取验证集,这里的陷阱是,程序先执行validation_split再执行shuffle,所以如果样本不均匀就会导致选出的验证集不具有一般性,最好提前手动shuffle.
上一篇
下一篇