神经网络代码实例 | Python基于keras的简单二元分类模型

# keras.datasets包含了很多公开的数据集,这里是使用了imbd(互联网电影数据库)的评论数据
from keras.datasets import imdb
from keras import models
from keras import layers
import matplotlib.pyplot as plt
import numpy as np

(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)
# 参数num_word的意思是仅保留训练数据中前10000个最常出现的单词,以缩小向量规模
# train_data与test_data均为评论组成的列表,而labels是0与1组成的列表,0表示该评论为负面评价,1表示正面评价

# 下面的代码可以把某条评论迅速解码成英文单词,可以方便理解
"""
word_index = imdb.get_word_index() # word_index 是一个将单词映射为整数索引的字典
reversed_word_index = dict([(value, key) for (key, value) in word_index.items()]) # 键值颠倒,将整数索引值映射为单词
decoded_review = ' '.join([reversed_word_index.get(i - 3, '?') for i in train_data[0]]) # 注意索引去掉了3,因为0,1,2分别保留给了”padding“,”start of sequence“与”unknown“
print(decoded_review)
"""


# 列表转化为张量才能输入神经网络,下面是把整数序列编码为二进制矩阵的函数
def vectorize_sequences(sequences, dimension=10000):
results = np.zeros((len(sequences), dimension))
for i, sequences in enumerate(sequences):
results[i, sequences] = 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')

# 构建模型
model = models.Sequential()
model.add(layers.Dense(16, activation='relu', input_shape=(10000, )))
model.add(layers.Dense(16, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))

# 选择损失函数与优化器
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:]

# 使用512个样本组成的小批量,将模型训练20次。同时,监控留出的10000个样本上的损失与精度
history = model.fit(partial_x_train, partial_y_train, epochs=20, batch_size=512, validation_data=(x_val, y_val))

# 绘制图像
history_dic = history.history
loss_values = history_dic['loss']
val_loss_values = history_dic['val_loss']

epochs = range(1, len(loss_values) + 1)

# 这里是绘制训练损失和验证损失
plt.plot(epochs, loss_values, 'bo', label='Training loss') # bo表示蓝色圆点
plt.plot(epochs, val_loss_values, 'b', label='Validation loss') # b表示蓝色圆点
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()

plt.show()

发表评论