一、Keras安装及配置
1、安装Keras
由于Keras是tensorflow的封装,必须先安装tensorflow才能使用
pip install h5py # 支持模型保存和载入
pip install tensorflow # 只有python3.5之后版本才能安装TensorFlow
pip install keras
2、配置Keras
一旦,Keras 被安装完成,你需要去修改后端文件,也就是去确定,你需要 TensorFlow 作为后端,还是 Theano 作为后端,修改的配置文件位于 ~/.keras/keras.json
{
"floatx": "float32",
"epsilon": 1e-07,
"backend": "tensorflow",
"image_data_format": "channels_last"
}
请注意,参数 image_data_format 是 channels_last ,也就是说这个后端是 TensorFlow。因为,在TensorFlow中图像的存储方式是[height, width, channels],但是在Theano中是完全不同的,也就是 [channels, height, width]。因此,如果你没有正确的设置这个参数,那么你模型的中间结果将是非常奇怪的。对于Theano来说,这个参数就是channels_first。
二、使用keras搭建网络
1、建模
Keras 有两种不同的神经网络建模方式
(1)Sequential models(序贯模型)
这种方法用于实现一些简单的模型,这样建立的神经网络模型就是一层一层的结构。
from keras.models import Sequential
#创建序贯模型
model = Sequential()
model.add(Dense(8, input_dim=2))
model.add(Activation("relu"))
model.add(Dense(2))
model.add(Activation("sigmoid"))
(2)Functional API(函数式模型)
序列模型,可以实现简单的神经网络算法,然而很多时候我们的模型并不是严格的序列化模型。你的网络可能是network-in-network形式的,或者有多输入,多输出(图像分割)等等。 这个时候序列模型就不可行了,你需要用到keras的Functional API。这是一种更加灵活的定义方式,可是实现多输入和多输出的深度网络结构。Functional API接受tensors返回tensor,多个函数组合到一起就是一个框架, 也就是keras.models里面的Model类。
在函数式模型中,所有的模型都是可调用的,就像层一样,很容易利用可以训练好的模型,提供tensor进行调用。调用训练好的模型时,不仅仅是重用结构,也是重用权重。
这时候必须先使用keras.Input将输出转换为tensor
from keras import Input
input_tensor = Input(shape=(64,))
使用keras.models.Model将定义好的模型转换为函数式框架
from keras.models import Sequential, Model
from keras import layers
from keras import Input
input_tensor = Input(shape=(784,))
x = layers.Dense(128, activation='relu')(input_tensor)
x = layers.Dense(64, activation='relu')(x)
x = layers.Dense(32, activation='relu')(x)
output_tensor = layers.Dense(10, activation='softmax')(x)
model = Model(input_tensor, output_tensor)
# define CNN model using keras
# input 1
Input_figure = Input(shape=(75,75,3), name='input1')
# input 2
Input_angle = Input(shape=(1,), name = 'input2')
x = Conv2D(13, kernel_size=(3,3))(Input_figure)
x = BatchNormalization()(x)
x = Activation('elu')(x)
x = MaxPooling2D(pool_size=(2,2))(x)
x = Dropout(0.3)(x)
x = Conv2D(21, kernel_size=(3,3))(x)
x = BatchNormalization()(x)
x = Activation('elu')(x)
x = MaxPooling2D(pool_size=(2,2))(x)
x = Dropout(0.3)(x)
x = Conv2D(34, kernel_size=(3,3))(x)
x = BatchNormalization()(x)
x = Activation('elu')(x)
x = MaxPooling2D(pool_size=(2,2), strides=(2,2))(x)
x = Dropout(0.3)(x)
x = Conv2D(55, kernel_size=(3,3))(x)
x = BatchNormalization()(x)
x = Activation('elu')(x)
x = MaxPooling2D(pool_size=(2,2), strides=(2,2))(x)
x = Dropout(0.3)(x)
x = GlobalMaxPool2D()(x)
# concatenate x and input 2
x = concatenate([x, Input_angle])
x = Dense(89)(x)
x = BatchNormalization()(x)
x = Activation('elu')(x)
x = Dropout(0.3)(x)
x = Dense(89, activation='elu')(x)
out = Dense(1, activation='sigmoid')(x)
model = Model(inputs=[Input_figure, Input_angle], outputs=out)
2、模型查看、编译、训练、验证
(1)使用model.summary()方法来查看模型架构
model.summary()
(2)使用model.compile()方法来进行模型编译
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
通过compile来对学习过程进行配置,它接收三个参数。
参数 | 含义 | 说明 |
---|---|---|
optimizer | 优化器 | 该参数可指定为已预定义的优化器名,如rmsprop、adagrad,或一个Optimizer类的自定义对象。 |
loss | 损失函数 | 该参数为模型试图最小化的目标函数,它可为预定义的损失函数名,如categorical_crossentropy、mse,也可以为一个自定义的损失函数。 |
metrics | 评价指标列表 | 对分类问题,我们一般将该列表设置为metrics=['accuracy']。指标可以是一个预定义指标的名字,也可以是一个自定义的指标函数。 |
用法举例如下
# 二元分类问题,采用预定义指标
model.compile(optimizer='rmsprop',
loss='binary_crossentropy', # 二分类的对数损失
metrics=['accuracy']) # 准确率
# 二分类问题,自定义指标函数
import keras.backend as K
def mean_squared_error(y_true, y_pred):
return K.mean(K.square(y_pred - y_true), axis=-1)
def my_loss(y_true, y_pred):
return K.mean((y_pred-y_true),axis = -1)
model.compile(optimizer='rmsprop',
loss=my_loss,
metrics=['accuracy', mean_squared_error])
# 多分类问题
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy', # 多类的对数损失
metrics=['accuracy']) # 准确率
# 回归问题
model.compile(optimizer='rmsprop',
loss='mse') # 均方误差
(3)使用model.fit()方法来进行模型训练
# 模型训练
history = model.fit(train_tensors, train_targets,
validation_data=(valid_tensors, valid_targets),
epochs=epochs,
batch_size=batch_size,
callbacks=[checkpointer],
verbose=1)
参数 | 说明 |
---|---|
batch_size | 在使用批量梯度下降法训练时候就需要将数据集分成几个 batch。Batch_size是指一个 batch 中的样本总数。 |
epochs | 训练轮数(周期),当一个完整的数据集通过了神经网络一次并且返回了一次,这个过程称为一个 epoch(每 epoch 完成对整数据集的一次遍历)。随着 epoch 数量增加,神经网络中的权重的更新次数也增加,曲线从欠拟合变得过拟合。 那么,几个 epoch 才是合适的呢?不幸的是,这个问题并没有正确的答案。对于不同的数据集,答案是不一样的。但是数据的多样性会影响合适的 epoch 的数量。比如,只有黑色的猫的数据集,以及有各种颜色的猫的数据集。 |
Iteration(迭代) | 迭代是 batch 需要完成一个 epoch 的次数。记住:在一个 epoch 中,batch 数和迭代数是相等的。比如对于一个有 2000 个训练样本的数据集。将 2000 个样本分成大小为 500 的 batch,那么完成一个 epoch 需要 4 个 iteration。 |
verbose | 进度表示方式。0表示不显示数据,1表示显示进度条,2表示用只显示一个数据。 |
callbacks | 回调函数列表。就是函数执行完后自动调用的函数列表 |
validation_split | 验证数据的使用比例。 |
validation_data | 被用来作为验证数据的(X, y)元组。会代替validation_split所划分的验证数据。 |
class_weigh | 分类权值键值对。键为类别,值为该类别对应的权重。只在训练过程中衡量损失函数用。 |
shuffle | 布尔类型。是否数据混洗。(只对训练集有效) |
(4)使用model.evalute方法来进行模型验证,展示模型在验证数据上的效果,其中参数和fit函数中的参数基本一致。
model.evalute(X,
y,
batch_size=128,
show_accuracy=False,
verbose=1,
sample_weight=None)
我们可以使用以下命令来快捷的评估模型:
# Scoring the model
score = model.evaluate(X, y)
print("\nAccuracy: ", score[-1])
(5)使用模型对新数据做预测
用于对测试数据的预测,返回:对于测试数据的预测数组
model.predict(X,
batch_size=128,
verbose=1)
3、模型保存和载入
keras中的模型主要包括model和weight两个部分
(1)保存/加载整个模型
包括(结构 + 权重 + 优化器状态),不建议使用 pickle 或 cPickle 来保存 Keras 模型
可以使用 model.save(filepath) 将 Keras 模型保存到单个 HDF5 文件中,该文件将包含:
- 模型的结构,允许重新创建模型
- 模型的权重
- 训练配置项(损失函数,优化器)
- 优化器状态,允许准确地从你上次结束的地方继续训练。
可以使用 keras.models.load_model(filepath) 重新实例化模型。load_model 还将负责使用保存的训练配置项来编译模型(除非模型从未编译过)。
示例:
from keras.models import load_model
# 创建 HDF5 文件 'my_model.h5'
model.save('my_model.h5')
# 删除现有模型
del model
# 返回一个编译好的模型
# 与之前那个相同
model = load_model('my_model.h5')
(2)只保存/加载模型的结构
只需要保存模型的结构,而非其权重或训练配置项
方法一:json文件
from keras.models import model_from_json
# 保存为 JSON
json_string = model.to_json()
# 从 JSON 重建模型:
model = model_from_json(json_string)
方法二:Yaml文件
from keras.models import model_from_yaml
# 保存为 YAML
yaml_string = model.to_yaml()
# 从 YAML 重建模型:
model = model_from_yaml(yaml_string)
(3)只保存/加载模型的权重
如果只需要模型的权重,可以使用下面的代码以 HDF5 格式进行保存。
请注意,我们首先需要安装 HDF5 和 Python 库 h5py,它们不包含在 Keras 中。
# 保存权重
model.save_weights('my_model_weights.h5')
# 假设你有用于实例化模型的代码,则可以将保存的权重加载到具有相同结构的模型中
model.load_weights('my_model_weights.h5')
# 如果你需要将权重加载到不同的结构(有一些共同层)的模型中,例如微调或迁移学习,则可以按层的名字来加载权重
model.load_weights('my_model_weights.h5', by_name=True)