最近看到一些开源模型基于Keras实现,之前没系统了解过Keras,去读了官方文档,将一些不错的功能模块整理出来。
建议学习Keras的同学还是去读官方文档,本文相当于我学习后的个人笔记,很多功能不提及,只提及一些个人认为好用的、易忘的功能。
models
Keras定义model的方式有2种:Sequential 和 Model
from keras.models import Sequential,Model
# Sequential 序列式
model1 = Sequential([
Dense(32, input_shape=(784,)),
Activation('relu'),
Dense(10),
Activation('softmax'),
])
# Sequential 添加式
model2 = Sequential()
model2.add(Dense(32, input_dim=784))
model2.add(Activation('relu'))
# model api式
inputs = Input(shape=(784,))
output_1 = Dense(64, activation='relu')(inputs)
output_2 = Dense(64, activation='relu')(output_1)
predictions = Dense(10, activation='softmax')(output_2)
定义好后 model 有几个通用的方法:
# 编译 compile
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy'])
# 训练 fit
hist = model.fit(data, label, epochs=10, batch_size=32)
# 评估 evaluate
score = model.evaluate(x_test, y_test, batch_size=128)
# 预测 predict
layers
layers
里主要常用的方法有 :
Input:实例化输入张量
Dense:全连接
Embedding:对第一层输入的emb
Activation:激活函数
Dropout:随机失活
Conv1D/Conv2D:卷积
MaxPooling1D/MaxPooling2D:池化
# Input
x = Input(shape=(32,))
y = Dense(16, activation='softmax')(x)
model = Model(x, y)
# Embedding
model2 = Sequential()
model2.add(Embedding(1000, 64, input_length=10))
model2.add(Dense(64))
model2.add(Activation('tanh'))
model2.add(Dropout(0.5))
# 现在 model.output_shape == (None, 10, 64),其中 None 是 batch 的维度
# conv
cnn = Sequential()
cnn.add(Conv2D(32, 3, padding='same', strides=2,input_shape=(28, 28, 1)))
cnn.add(LeakyReLU(0.2))
cnn.add(Dropout(0.3))
save/load
# 权重
weights = model.get_weights()
model.set_weights(weights)
# 结构 json
from keras.models import model_from_json
json_string = model.to_json()
model = model_from_json(json_string)
# 结构 yaml
from keras.models import model_from_yaml
yaml_string = model.to_yaml()
model = model_from_yaml(yaml_string)
# 模型
from keras.models import save_model,load_model
model.save('my_model.h5')
load_model('DeepFM.h5')
# deepctr中
from deepctr.layers import custom_objects
save_model(model, 'my_model.h5')
model = load_model('DeepFM.h5',custom_objects)
绘图
模型可视化
from keras.utils import plot_model
plot_model(model, show_shapes=True,show_layer_names=True,dpi=96,to_file='model.png')
model.summary()
绘制epoch输出的历史变化
# epoch历史绘图
import matplotlib.pyplot as plt
history = model.fit(x, y, validation_split=0.25, epochs=50, batch_size=16, verbose=1)
# 绘制训练 & 验证的准确率值
plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
plt.title('Model accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train', 'Test'], loc='upper left')
plt.show()
# 绘制训练 & 验证的损失值
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('Model loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['Train', 'Test'], loc='upper left')
plt.show()
分布式
数据并行
数据并行包括在每个设备上复制一次目标模型,并使用每个模型副本处理不同部分的输入数据。Keras 有一个内置的实用函数 keras.utils.multi_gpu_model,它可以生成任何模型的数据并行版本,在多达 8 个 GPU 上实现准线性加速。
from keras.utils import multi_gpu_model
# 实例化基础模型(或者「模版」模型)。
# 我们推荐在 CPU 设备范围内做此操作,
# 这样模型的权重就会存储在 CPU 内存中。
# 否则它们会存储在 GPU 上,而完全被共享。
with tf.device('/cpu:0'):
model = Xception(weights=None,
input_shape=(height, width, 3),
classes=num_classes)
# 将 `model` 复制到 8 个 GPU 上。
# 假定你的机器有 8 个可用的 GPU。
parallel_model = multi_gpu_model(model, gpus=8)
parallel_model.compile(loss='categorical_crossentropy',
optimizer='rmsprop')
# 这个 `fit` 调用将分布在 8 个 GPU 上。
# 由于 batch size 为 256,每个 GPU 将处理 32 个样本。
parallel_model.fit(x, y, epochs=20, batch_size=256)
# 通过模版模型存储模型(共享相同权重):
model.save('my_model.h5')
设备并行
设备并行性包括在不同设备上运行同一模型的不同部分。对于具有并行体系结构的模型,例如有两个分支的模型,比如双塔结构,这种方式很合适。
# 模型中共享的 LSTM 用于并行编码两个不同的序列
input_a = keras.Input(shape=(140, 256))
input_b = keras.Input(shape=(140, 256))
shared_lstm = keras.layers.LSTM(64)
# 在一个 GPU 上处理第一个序列
with tf.device_scope('/gpu:0'):
encoded_a = shared_lstm(tweet_a)
# 在另一个 GPU上 处理下一个序列
with tf.device_scope('/gpu:1'):
encoded_b = shared_lstm(tweet_b)
# 在 CPU 上连接结果
with tf.device_scope('/cpu:0'):
merged_vector = keras.layers.concatenate([encoded_a, encoded_b],
axis=-1)