jyupter notebook内编写
"""路透社数据集:
包含许多短新闻及其对应的主题,包含46个不同的主题,每个主题都至少含有10个样本
但标签、多分类问题:每个数据点只能划分到一个类别"""
from tensorflow.python.keras.datasets import reuters
(train_data, train_labels), (test_data, test_labels) = reuters.load_data(num_words=10000)
print(len(train_data), len(test_data)) # 8982个训练样本, 2246个测试数# 据
print('\n')
print(train_data[10])
print(train_labels[10]) # 标签是0~45内的整数,即话题索引号
"""编码数据"""
import numpy as np
def vectorize_sequences(sequences, dimension=10000):
results = np.zeros((len(sequences), dimension))
for i, sequence in enumerate(sequences):
results[i, sequence] = 1
return results
x_train = vectorize_sequences(train_data) # 将训练数据向量化
x_test = vectorize_sequences(test_data) # 将测试数据向量化
"""编码标签,将标签向量化(one-hot)"""
# keras中的one-hot编码以及配置好了
from tensorflow.python.keras.utils import to_categorical
one_hot_train_labels = to_categorical(train_labels)
one_hot_test_labels = to_categorical(test_labels)
"""构建网络"""
from tensorflow.python.keras import models
from tensorflow.python.keras import layers
model = models.Sequential()
model.add(layers.Dense(64, activation='relu', input_shape=(10000, )))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(46, activation='softmax'))
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
"""验证方法
训练数据中留出1000个样本"""
x_val = x_train[:1000]
partial_x_train = x_train[1000:]
y_val = one_hot_train_labels[:1000]
partial_y_train = one_hot_train_labels[1000:]
"""训练模型"""
history = model.fit(partial_x_train,
partial_y_train,
epochs=20,
batch_size=512,
validation_data=(x_val, y_val))
# 从第8伦开始过拟合
print(history.history.keys())
"""绘制训练损失和验证损失"""
import matplotlib.pyplot as plt
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(1, len(loss) + 1)
plt.plot(epochs, loss, 'ro', label='Training loss')
plt.plot(epochs, val_loss, 'r', label='Validation loss')
plt.title('Training and Validation loss')
plt.xlabel('epochs')
plt.ylabel('loss')
plt.legend()
plt.show()
"""绘制训练和验证精度"""
import matplotlib.pyplot as plt
acc = history.history['acc']
val_acc = history.history['val_acc']
epochs = range(1, len(loss) + 1)
plt.plot(epochs, acc, 'ro', label='Training accuracy')
plt.plot(epochs, val_acc, 'r', label='Validation accuracy')
plt.title('Training and Validation accuracy')
plt.xlabel('epochs')
plt.ylabel('accuracy')
plt.legend()
plt.show()
"""发现网络在第8伦之后过拟合,故将训练次数改为8"""
import matplotlib.pyplot as plt
# ---------------------------训练网络-------------------------
history = model.fit(partial_x_train,
partial_y_train,
epochs=8,
batch_size=512,
validation_data=(x_val, y_val))
# -----------------------输出history的形式---------------------
print(history.history.keys())
# ------------------------绘制图像----------------------------
loss = history.history['loss']
val_loss = history.history['val_loss']
acc = history.history['acc']
val_acc = history.history['val_acc']
epochs = range(1, len(loss) + 1)
plt.plot(epochs, loss, 'ro', label='Training loss')
plt.plot(epochs, val_loss, 'r', label='Validation loss')
plt.title('Training and Validation loss')
plt.xlabel('epochs')
plt.ylabel('loss')
plt.legend()
plt.show()
plt.plot(epochs, acc, 'ro', label='Training accuracy')
plt.plot(epochs, val_acc, 'r', label='Validation accuracy')
plt.title('Training and Validation accuracy')
plt.xlabel('epochs')
plt.ylabel('accuracy')
plt.legend()
plt.show()
"""新数据上生成预测结果"""
predictions = model.predict(x_test)
print(predictions[0].shape) # 每个元素长度46
print(np.sum(predictions[0])) # 每个向量元素和1
print(np.argmax(predictions[0])) # 概率最大的为类别