上篇延续内容
模型定义
from keras import models
from keras import layers
#定义模型一个三层的神经网络,输入层的维度为10000,一二层都为16个神经元,最后一层为1个神经元
model = models.Sequential() #搭建层
model.add(layers.Dense(16,activation='relu',input_shape=(10000,))) #relu用于将负值归0,主要是非线性或激励函数以得到丰富的假设空间,充分利用多层优势
model.add(layers.Dense(16,activation='relu'))
model.add(layers.Dense(1,activation='sigmoid'))
编译模型
对于二分类问题,就可以选用二元交叉熵(binary crossentropy)损失函数;
对于多分类问题,可以用分类交叉熵(categorical crossentropy)损失函数;
对于序列数据问题,可以用联结时序分类(CTC)损失函数
model.compile(optimizer='rmsprop',
loss='binary_crossentropy', #binary_crossentropy指二元交叉熵
metrics=['accuracy'])
留出验证集
x_val = x_train[:10000] #1:10000的数据为验证集
partial_x_train = x_train[10000:]#10000到最后的数据为训练集
y_val = y_train[:10000]
partial_y_train = y_train[10000:]
?
训练模型
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['acc'])
#model.fit()返回了一个history对象,这个对象有一个成员history,是一个字典,包含训练过程中所有的数据
history = model.fit(partial_x_train, #数据测试集
partial_y_train, #标签测试集
epochs=20,#将模型训练
batch_size=512, #512个样本组成一个小批量
validation_data=(x_val,y_val)) #验证集
?
绘制训练损失和验证损失
import matplotlib.pyplot as plt
#每个轮次的验证结果是存储在字典里面的,用history方法去调用字典获取键值,这是为了后面画图做准备。字典中包含四个条目,对应训练过程和验证过程中监控的指标
history_dict = history.history
loss_values = history_dict['loss'] #得到每一轮测试数据的损失值
val_loss_values = history_dict['val_loss'] #得到每一轮验证数据的损失值
epochs = range(1,len(loss_values) + 1) #epochs的范围
plt.plot(epochs,loss_values,'bo',label='Training loss') #'bo'表示蓝色圆点 loss数值变化的曲线
plt.plot(epochs,val_loss_values,'b',label='Validation loss') #'b'表示蓝色实线 val_loss数值变化的曲线
plt.title('Training and Validation loss') #标题
plt.xlabel('Epochs') #x轴的标题
plt.ylabel('Loss') #y轴的标题
plt.legend() #使上述代码产生效果
plt.show() #显示图片
?
绘制训练精度和验证精度
plt.clf() #清空图像
acc = history_dict['acc'] #得到每一轮测试数据的精度
val_acc = history_dict['val_acc'] #得到每一轮验证数据的精度
plt.plot(epochs,acc,'bo',label='Training acc')
plt.plot(epochs,val_acc,'b',label='Validation acc')
plt.title('Training and Validation accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend()
plt.show()
从头开始重新训练一个模型
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'])
#model.fit()反回了一个History对象,这个对象有一个成员history,是一个字典,包含训练过程中的所有数据
model.fit(x_train,y_train,
epochs=4,
batch_size=512)
results = model.evaluate(x_test,y_test) #监控在流出的10000个样本上的损失和精度
?
使用训练好的网络在新数据上生成预测结果
model.predict(x_test)
|