目录

摘要

一、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()  # 显示图像

深度学习loss和acc波动 loss曲线和acc曲线_损失函数