"""IMDB数据集二分类"""

import tensorflow as tf
from tensorflow import keras
import numpy as np

"""数据集加载:
IMDB:keras内置数据集,电影评论评分向量化后的形式"""

from keras.datasets import imdb
(train_data,train_labels),(test_data,test_labels)=imdb.load_data(num_words=10000)
# print(train_data.shape,test_data.shape,train_labels.shape,test_labels.shape)
"""数据预处理:
    填充列表,使其具有相同的长度,这里采用one-hot编码"""

def vectrize_sequences(sequences,dimension=10000):
    results=np.zeros((len(sequences),dimension))
    for i,sequence in enumerate(sequences):
        results[i,sequence]=1
    return results

train_data=vectrize_sequences(train_data)
test_data=vectrize_sequences(test_data)
#将标签数据向量化
y_train=np.array(train_labels,dtype=np.float)
y_test=np.array(test_labels,dtype=np.float)

# print(train_data.shape,test_data.shape)
# print(train_labels.shape,test_labels.shape)

"""网络模型的构建:
    采取两个隐藏层,隐藏层神经元为16"""
from tensorflow.keras import layers
from tensorflow.keras import models
from tensorflow.keras import optimizers
from tensorflow.keras import losses
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"))

"""配置学习过程:
    损失函数:二分类交叉熵
    优化器:rmsprob
    监控指标:metric"""
model.compile(optimizer=optimizers.RMSprop(lr=1e-3),loss="binary_crossentropy",metrics=["acc"])
"""验证集的划分:
    从原始训练集中选10000个作为验证集"""
x_val=train_data[:10000]
partial_x_train=train_data[10000:]
y_val=y_train[:10000]
partial_y_train=y_train[10000:]

"""模型训练:
history:为一个字典,其包含训练过程中的历史数据
val_acc:loss 训练集损失函数
acc:训练集准确率
val_loss:验证集损失
val_acc:验证集准确率
"""
history=model.fit(partial_x_train,partial_y_train,epochs=4,batch_size=512,validation_data=(x_val,y_val))
"""在测试集上进行评估"""
test_acc=model.evaluate(test_data,y_test)
print("Test Acc:",test_acc)
history_dict=history.history
# print(history_dict.keys())

"""训练过程绘制:损失值+准确率
随着神经网络在训练集上的表现越来越好,模型最终会出现过拟合,并在前所未见的
数据上表现越来越差,所以一定要一直监控模型在训练集之外数据上的性能"""

import matplotlib.pyplot as plt
"""损失函数绘制"""
train_loss_values=history_dict["loss"]
val_loss_values=history_dict["val_loss"]
epochs=np.arange(1,len(train_loss_values)+1)

plt.figure(1)
plt.plot(epochs,train_loss_values,label="training loss")
plt.plot(epochs,val_loss_values,label="val loss")
plt.title("Training and Val Loss")
plt.xlabel("Epoch")
plt.ylabel("Loss")
plt.legend()

"""精度(准确率)绘制"""
train_acc=history_dict["acc"]
val_acc=history_dict["val_acc"]

plt.figure(2)
plt.plot(epochs,train_acc,label="Training Acc")
plt.plot(epochs,val_acc,label="Val Acc")
plt.title("Training and Val Acc")
plt.xlabel("Epoch")
plt.ylabel("Acc")
plt.legend()

plt.show()

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐