目录
摘要
一、acc 曲线与 loss 曲线
二、完整代码
摘要
loss / loss 可视化,可视化出准确率上升、损失函数下降的过程
一、acc 曲线与 loss 曲线
history = model.fit(训练集数据,
训练集标签,
batch_size=,
epochs=,
validation_split=用作测试数据的比例,
validation_data=测试集,
validation_freq=测试频率)
history:
losss:训练集 loss
val_losss:测试集 loss
sparse_categorical_accuracy:训练集准确率
val_sparse_categorical_accuracy:测试集准确率
acc = history.history["sparse_categorical_accuracy"]
val_acc = history.history["val_sparse_categorical_accuracy"]
loss = history.history["loss"]
val_loss = history.history["val_loss"]
# 画 acc/val_acc 图
plt.subplot(1, 2, 1) # 将图像分为一行两列,这里画出第1列
plt.plot(acc, label="Training Accuracy") # 画出 acc 数据
plt.plot(val_acc, label="Validation Accuracy") # 画出 val_acc 数据
plt.title("Training and Validation Accuracy") # 设置图标题
plt.legend() # 画出图例
# 画 loss/val_loss 图
plt.subplot(1, 2, 2) # 将图像分为一行两列,这里画出第2列
plt.plot(loss, label="Training Loss") # 画出 loss 数据
plt.plot(val_loss, label="Validation Loss") # 画出 val_loss 数据
plt.title("Training and Validation Loss") # 设置图标题
plt.legend() # 画出图例
plt.show() # 显示图像
二、完整代码
"""
acc 与 loss 可视化,可视化出准确率上升、损失函数下降的过程
"""
# 模块导入
import os
import numpy as np
import tensorflow as tf
from matplotlib import pyplot as plt
# 设置显示全部内容,np.inf 表示无穷大
np.set_printoptions(threshold=np.inf)
# 导入数据集,分别为输入特征和标签
mnist = tf.keras.datasets.mnist
# (x_train, y_train):(训练集输入特征,训练集标签)
# (x_test, y_test):(测试集输入特征,测试集标签)
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# 对输入网络的输入特征进行归一化,使原本0到255之间的灰度值,变为0到1之间的数值
# (把输入特征的数值变小更适合神经网络吸收)
x_train, x_test = x_train / 255.0, x_test / 255.0
# 搭建网络结构
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(), # 将输入特征拉直为一维数组,也就是拉直为28*28=784个数值
tf.keras.layers.Dense(128, activation="relu"), # 第一层网络128个神经元,使用relu激活函数
tf.keras.layers.Dense(10, activation="softmax") # 第二层网络10个神经元,使用softmax激活函数,使输出符合概率分布
])
# 配置训练方法
model.compile(optimizer="adam", # 优化器
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False), # 损失函数,输出是概率分布,from_logits=False
metrics=["sparse_categorical_accuracy"]) # 数据集中的标签是数值,神经网络输出y是概率分布
# 读取模型
base_path = os.path.dirname(os.path.abspath(__file__))
# ../MNIST_FC/checkpoint/
base_path = os.path.join(base_path, "MNIST_FC")
base_path = os.path.join(base_path, "checkpoint")
checkpoint_save_path = os.path.join(base_path, "mnist.ckpt")
if os.path.exists(checkpoint_save_path + ".index"):
print("------------load the model------------")
model.load_weights(checkpoint_save_path)
# 保存模型
cp_callback = tf.keras.callbacks.ModelCheckpoint(
filepath=checkpoint_save_path,
save_weights_only=True,
save_best_only=True)
# 执行训练过程
history = model.fit(x_train, # 训练集输入特征
y_train, # 训练集标签
batch_size=32, # 每次喂入网络32组数据
epochs=5, # 数据集迭代5次
validation_data=(x_test, y_test), # 测试集输入特征,测试集标签
validation_freq=1, # 每迭代1次训练集执行一次测试集的评测
callbacks=[cp_callback]
)
# 打印出网络结构和参数统计
model.summary()
# 打印模型参数,存入文本
print(model.trainable_variables)
file_path = os.path.join(base_path, "weights.txt")
file = open(file_path, "w", encoding="utf-8")
for v in model.trainable_variables:
file.write(str(v.name) + "\n")
file.write(str(v.shape) + "\n")
file.write(str(v.numpy()) + "\n")
file.close()
# 显示训练集和验证集的 acc 和 loss 曲线
# 读取所需数据
acc = history.history["sparse_categorical_accuracy"]
val_acc = history.history["val_sparse_categorical_accuracy"]
loss = history.history["loss"]
val_loss = history.history["val_loss"]
# 画 acc/val_acc 图
plt.subplot(1, 2, 1) # 将图像分为一行两列,这里画出第1列
plt.plot(acc, label="Training Accuracy") # 画出 acc 数据
plt.plot(val_acc, label="Validation Accuracy") # 画出 val_acc 数据
plt.title("Training and Validation Accuracy") # 设置图标题
plt.legend() # 画出图例
# 画 loss/val_loss 图
plt.subplot(1, 2, 2) # 将图像分为一行两列,这里画出第2列
plt.plot(loss, label="Training Loss") # 画出 loss 数据
plt.plot(val_loss, label="Validation Loss") # 画出 val_loss 数据
plt.title("Training and Validation Loss") # 设置图标题
plt.legend() # 画出图例
plt.show() # 显示图像