Tensorflow2.x可视化训练结果

Tensorflow2.x可视化训练结果

综述

在本篇文章中我们将对上一篇文章基于LeNet-5的MNIST手写数字识别中的训练结果利用matplotlib进行可视化的操作。

在进行可视化操作之前你需要学会的技能有:

如果你不会使用这两个库的话,可以点击上面的超链接学习。

获取训练数据

在Tensorflow2.x中当我们使用keras来进行模型的训练时使用了一个叫fit的函数,如下所示:

# 网络定义
network = Sequential([
    # 卷积层1
    layers.Conv2D(filters=6,kernel_size=(5,5),activation="relu",input_shape=(28,28,1),padding="same"),
    layers.MaxPool2D(pool_size=(2,2),strides=2),
    
    # 卷积层2
    layers.Conv2D(filters=16,kernel_size=(5,5),activation="relu",padding="same"),
    layers.MaxPool2D(pool_size=2,strides=2),
    
    # 卷积层3
    layers.Conv2D(filters=32,kernel_size=(5,5),activation="relu",padding="same"),
    
    layers.Flatten(),
    
    # 全连接层1
    layers.Dense(200,activation="relu"),
    
    # 全连接层2
    layers.Dense(10,activation="softmax")    
])
network.summary()

# 模型训练 训练30个epoch
network.compile(optimizer='adam',loss="sparse_categorical_crossentropy",metrics=["accuracy"])
network.fit(trainImage,trainLabel,epochs=30,validation_split=0.1)

我们使用了network.fit进行了网络的训练,我们如果需要获得训练的结果的话需要添加如下的写法

# 模型训练 训练30个epoch
history = network.fit(trainImage,trainLabel,epochs=30,validation_split=0.1)
data = history.history

这里的history可以读取获得我们的训练数据,它返回的是一个python的字典格式。为了方便数据的处理,我们可以将其存储为json格式的文件。

# json文件写入
def save_json(data):
    with open('history.json', 'w') as json_file:
        json.dump(data, json_file)

# 保存训练结果
save_json(data)

在进行json文件的写入时记得导入json库,然后完成json文件的保存。

当我们保存完毕后可以获得一个叫history.json的文件,里面保存着我们的训练数据。

{
    "loss": [
        xxx,
    ],
    "accuracy": [
        xxx,
    ],
    "val_loss": [
        xxx,
    ],
    "val_accuracy": [
        xxx,
    ]
}

其中四个字段的解释如下:

lossaccuracyval_lossval_accuracy
训练中的loss训练中的准确率测试中的loss测试中的准确率

读取文件完成可视化操作

导入库

import matplotlib.pyplot as plt
import numpy as np
import json

读取history.json文件

# 载入数据
def load_data():

    try:
        with open('history.json','r') as json_file:
            data = json.load(json_file)
            print('data load success!')
    except:
        print('data load failed!')
    return data

解析数据

# 读取数据
def get_data(data):
    # 训练集损失数据
    loss = data['loss']
    np_loss = np.array(loss)
    y_loss = np_loss
    x_epoch = np.arange(30)

    # 训练集准确度数据
    acc = data['accuracy']
    np_acc = np.array(acc)
    y_acc = np_acc
    x_epoch = np.arange(30)

    # 测试集损失数据
    val_loss = data['val_loss']
    np_val_loss = np.array(val_loss)
    y_val_loss = np_val_loss
    x_epoch = np.arange(30)

    # 测试集准确度数据
    val_acc = data['val_accuracy']
    np_val_acc = np.array(val_acc)
    y_val_acc = np_val_acc
    x_epoch = np.arange(30)

    return y_loss,y_acc,y_val_loss,y_val_acc,x_epoch

注意! 为了方便matplotlib进行图形的绘制我们将数据转为numpy的array格式,具体代码如上所示。

绘制结果

这里我们绘制一个两行两列的图像,使用matplotlib来进行绘制

def main():
    data = load_data()
    y_loss,y_acc,y_val_loss,y_val_acc,x_epoch = get_data(data)

    plt.figure(figsize=(10,4))
    # loss图像
    plt.subplot(2,2,1)
    plt.plot(x_epoch,y_loss,label='loss')
    plt.legend()
    plt.xlabel('epoch')
    plt.ylabel('loss')

    # acc图像
    plt.subplot(2,2,2)
    plt.plot(x_epoch,y_acc,label='acc',color='red')
    plt.legend()
    plt.xlabel('epoch')
    plt.ylabel('acc')
    plt.ylim(0.9,1)

    # val_loss图像
    plt.subplot(2,2,3)
    plt.plot(x_epoch,y_val_loss,label='val_loss')
    plt.legend()
    plt.xlabel('epoch')
    plt.ylabel('val_loss')

    # val_acc图像
    plt.subplot(2,2,4)
    plt.plot(x_epoch,y_val_acc,label='val_acc',color='red')
    plt.legend()
    plt.xlabel('epoch')
    plt.ylabel('val_acc')
    plt.ylim(0.9,1)

    plt.show()

结果展示

绘制结果如下所示
在这里插入图片描述

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值