\quad\quad Keras是一个Python深度学习框架,是一个模型级的库,为开发深度学习模型提供了高层次的构建模块,可以方便地定义和训练几乎所有类型的深度学习模型。
Keras具有以下重要特性:
一般使用Tensorflow后端作为大部分深度学习任务的默认后端
通过Tensorflow,Keras可以在CPU和GPU上无缝运行
Keras工作流程如下:
加载数据集:
from keras.datasets import imdb
# imdb.load_data(path='imdb.npz', num_words=None, skip_top=0, maxlen=None, seed=113, start_char=1, oov_char=2, index_from=3, **kwargs)
# num_words=10000 表示仅保留训练数据中前10000个最常出现的单词,低频的被舍弃
(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)
# 查看数据
# 每条评论为单词索引组成的列表
train_data[0]
# 标签
# 由0或1组成的列表,0表示负面,1表示正面
train_labels[0]
# 将单词索引组成的列表还原为评论
# word_index是将单词映射到整数索引的字典
word_index = imdb.get_word_index()
# 键值颠倒,将整数索引映射到单词
reverse_word_index = dict([(value, key) for (key, value) in word_index.items()])
# 解析评论; 请注意,索引减去了3,因为0,1和2是“填充”,“序列开始”和“未知”的保留索引。
decoded_review = ' '.join([reverse_word_index.get(i - 3, '?') for i in train_data[0]])
decoded_review
下载数据很慢,可以到网上找资源,然后放在用户目录下的
.keras
目录下
安装Keras
后,windows/Linux
用户目录下都会生成.keras
数据准备:
# 将整数序列编码为二进制矩阵
import numpy as np
def vectorize_sequences(sequences, dimension=10000):
# 创建一个形状为(len(sequences), dimension)的0矩阵
results = np.zeros((len(sequences), dimension))
for i, sequence in enumerate(sequences):
results[i, sequence] = 1. # 将results[i]的指定索引设为1
return results
# 训练数据向量化
x_train = vectorize_sequences(train_data)
# 测试数据向量化
x_test = vectorize_sequences(test_data)
# 将标签向量化
y_train = np.asarray(train_labels).astype('float32')
y_test = np.asarray(test_labels).astype('float32')
# 模型定义
from keras import models
from keras import layers
model = models.Sequential()
# 该层神经元个数16,使用relu作为激活函数
model.add(layers.Dense(16, activation='relu', input_shape=(10000,)))
model.add(layers.Dense(16, activation='relu'))
# 最后一层使用sigmoid激活,输出0-1范围内的概率,和为1
model.add(layers.Dense(1, activation='sigmoid'))
# 编译模型
# optimizer:优化器
# loss:损失函数
# metrics:指标(正确率)
model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['accuracy'])
# 划分出测试集
x_val = x_train[:10000]
partial_x_train = x_train[10000:]
y_val = y_train[:10000]
partial_y_train = y_train[10000:]
# 训练模型
history = model.fit(partial_x_train, partial_y_train, epochs=20, batch_size=512, validation_data=(x_val, y_val))
# 测试结果
results = model.evaluate(x_test, y_test)
print(results)
model.fit()返回一个History对象,包括dict_keys([‘val_loss’, ‘val_acc’, ‘loss’, ‘acc’])可以用来绘图
# 绘制训练损失和验证损失
import matplotlib.pyplot as plt
%matplotlib inline
acc = history.history['acc']
val_acc = history.history['val_acc']
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(1, len(acc) + 1)
# "bo" 蓝色圆点
plt.plot(epochs, loss, 'bo', label='Training loss')
# "b" 蓝色实线
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()
model.predict(x_test)
图中我们可以看出,训练损失一直在减小(这正是我们优化的对象),但验证损失先减小,大概在第4epoch后开始增大,说明第4epoch后,模型开始过拟合了
图中可以看出,训练的精度一直在提高(优化的对象),而验证的精度在第4epoch时达到最高
针对上面的过拟合问题的解决办法:
还有其他方法,将在以后详细介绍