模型训练-保存训练数据

news2024/11/18 2:32:27

1.目的

找到一个可运行的代码,可以每个epoch打印训练数据,但是不会保存。因为在改进模型需要这些训练数据进行对比,所以需要将每个epoch的训练数据保存下来,写到一个文件中。

2.解决方案1

直接问ChatGPT,提示词如下:

做一个深度学习的图像分类任务,现在需要将每个epoch的训练数据存到一个文件,用python来实现

import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader
from torchvision import datasets, transforms
import json

# 定义一个简单的网络
class SimpleCNN(nn.Module):
    def __init__(self):
        super(SimpleCNN, self).__init__()
        self.conv1 = nn.Conv2d(1, 32, kernel_size=3, stride=1, padding=1)
        self.relu = nn.ReLU()
        self.fc1 = nn.Linear(32 * 28 * 28, 10)

    def forward(self, x):
        x = self.conv1(x)
        x = self.relu(x)
        x = x.view(x.size(0), -1)
        x = self.fc1(x)
        return x

# 设置超参数
batch_size = 64
num_epochs = 10
learning_rate = 0.01

# 创建数据集和数据加载器
transform = transforms.Compose([transforms.ToTensor()])
train_dataset = datasets.MNIST(root='data/', train=True, transform=transform, download=True)
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)

# 创建网络、损失函数和优化器
model = SimpleCNN()
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=learning_rate)

# 文件名
output_file = "training_data.json"

# 开始训练
training_data = []

for epoch in range(num_epochs):
    epoch_loss = 0.0
    correct = 0
    total = 0

    # 训练一个 epoch
    for inputs, labels in train_loader:
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        epoch_loss += loss.item() * inputs.size(0)
        _, predicted = outputs.max(1)
        correct += predicted.eq(labels).sum().item()
        total += labels.size(0)

    # 计算平均损失和准确度
    avg_loss = epoch_loss / total
    accuracy = correct / total

    # 将 epoch 的数据添加到列表中
    epoch_data = {
        "epoch": epoch + 1,
        "avg_loss": avg_loss,
        "accuracy": accuracy
    }
    training_data.append(epoch_data)

    # 打印 epoch 的训练结果
    print(f"Epoch {epoch + 1}: Avg Loss: {avg_loss:.4f}, Accuracy: {accuracy:.4f}")

# 将所有 epoch 的训练数据保存到文件中
with open(output_file, 'w') as f:
    json.dump(training_data, f)

print(f"Training data saved to {output_file}")

由于缺少数据集,也懒得去找一个数据集,就将自己py文件中训练部分摘出来给ChatGPT,让它在训练方法中实现这个功能。 

def train():
    data_format(os.path.join(config.root_path, './data/train.txt'),
    os.path.join(config.root_path, './data/data'), os.path.join(config.root_path, './data/train.json'))
    data = read_from_file(config.train_data_path, config.data_dir, config.only)
    train_data, val_data = train_val_split(data)
    train_loader = processor(train_data, config.train_params)
    val_loader = processor(val_data, config.val_params)

    best_acc = 0
    epoch = config.epoch
    for e in range(epoch):
        print('-' * 20 + ' ' + 'Epoch ' + str(e+1) + ' ' + '-' * 20)
        # 训练模型
        tloss, tloss_list = trainer.train(train_loader)
        print('Train Loss: {}'.format(tloss))
        # writer.add_scalar('Training/loss', tloss, e)
        # 验证模型
        vloss, vacc = trainer.valid(val_loader)
        print('Valid Loss: {}'.format(vloss))
        print('Valid Acc: {}'.format(vacc))
        # writer.add_scalar('Validation/loss', vloss, e)
        # writer.add_scalar('Validacc/acc', vacc, e)
        # 保存训练数据
        training_data = {
            "epoch": e + 1,
            "train_loss": tloss,
            "valid_loss": vloss,
            "valid_acc": vacc
        }
        with open('training_data.json', 'a') as f:
            json.dump(training_data, f)
            f.write('\n')
        print("数据保存完成")
        # 保存最佳模型
        if vacc > best_acc:
            best_acc = vacc
            save_model(config.output_path, config.fuse_model_type, model)
            print('Update best model!')


     
    print('-' * 20 + ' ' + 'Training Finished' + ' ' + '-' * 20)
    print('Best Validation Accuracy: {}'.format(best_acc))

在我的代码中具体加入的是下列几行代码

# 保存训练数据
training_data = {
    "epoch": e + 1,
    "train_loss": tloss,
    "valid_loss": vloss,
    "valid_acc": vacc
}
with open('training_data.json', 'a') as f:
    json.dump(training_data, f)
    f.write('\n')
print("数据保存完成")

代码意思如下: 

  1. with open('training_data.json', 'a') as f:: 打开名为 'training_data.json' 的文件,以追加模式 'a',并将其赋给变量 f。如果文件不存在,将会创建一个新文件。
  2. json.dump(training_data, f): 将变量 training_data 中的数据以 JSON 格式写入到文件 f 中。这个操作会将 training_data 中的内容转换成 JSON 格式,并写入到文件中。
  3. f.write('\n'): 写入一个换行符 \n 到文件 f 中,确保每次写入 JSON 数据后都有一个新的空行,使得每个 JSON 对象都独占一行,便于后续处理。

这段代码的作用是将变量 training_data 中的数据以 JSON 格式写入到文件 'training_data.json' 中,并确保每次写入后都有一个换行符分隔。

结果

可以在每个epoch训练完成后,将训练损失,验证损失和验证准确率保存在training_data.json文件中。

3.解决方案2

这是另外一个代码,使用的是tensoflow来构建网络,代码如下

model = Sequential()

model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(48,48,1)))
model.add(Conv2D(64, kernel_size=(3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2),strides=(2,2)))
model.add(Dropout(0.25))

model.add(Conv2D(128, kernel_size=(3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2),strides=(2,2)))
model.add(Conv2D(128, kernel_size=(3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2),strides=(2,2)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(1024, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(7, activation='softmax'))



# If you want to train the same model or try other models, go for this
if mode == "train":
    # 使用旧版本的Adam优化器


    model.compile(loss='categorical_crossentropy',    optimizer = tf.keras.optimizers.legacy.Adam(learning_rate=0.001, decay=1e-6),metrics=['accuracy'])



    model_info = model.fit_generator(
            train_generator,
            steps_per_epoch=num_train // batch_size,
            epochs=num_epoch,
            validation_data=validation_generator,
            validation_steps=num_val // batch_size,

    )
    train_loss = model_info.history['loss']
    train_accuracy = model_info.history['accuracy']
    val_loss = model_info.history['val_loss']
    val_accuracy = model_info.history['val_accuracy']

    plot_model_history(model_info)
    model.save_weights('model.h5')

询问ChatGPT

import tensorflow as tf

class SaveTrainingDataCallback(tf.keras.callbacks.Callback):
    def __init__(self, file_path):
        super(SaveTrainingDataCallback, self).__init__()
        self.file_path = file_path

    def on_epoch_end(self, epoch, logs=None):
        with open(self.file_path, 'a') as file:
            file.write(f'Epoch {epoch} - Loss: {logs["loss"]}, Accuracy: {logs["accuracy"]}\n')
            # 您可以根据需要保存其他训练数据,如验证集的损失和准确率等

# 创建模型
model = tf.keras.Sequential([
    tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
    tf.keras.layers.MaxPooling2D((2, 2)),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(10, activation='softmax')
])

# 编译模型
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])

# 创建Callback来保存训练数据
save_data_callback = SaveTrainingDataCallback(file_path='training_data.txt')

# 训练模型并在每个epoch结束时保存训练数据
model.fit(x_train, y_train, epochs=10, callbacks=[save_data_callback])

 要保存每个epoch的训练数据并将其存放到一个文件中,您可以使用Callback回调函数来实现。Callback提供了在训练过程中执行特定操作的灵活性,包括在每个epoch结束时保存训练数据。

然后改写到自己代码为

model = Sequential()

model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(48,48,1)))
model.add(Conv2D(64, kernel_size=(3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2),strides=(2,2)))
model.add(Dropout(0.25))

model.add(Conv2D(128, kernel_size=(3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2),strides=(2,2)))
model.add(Conv2D(128, kernel_size=(3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2),strides=(2,2)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(1024, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(7, activation='softmax'))

import tensorflow as tf

class SaveTrainingDataCallback(tf.keras.callbacks.Callback):
    def __init__(self, file_path):
        super(SaveTrainingDataCallback, self).__init__()
        self.file_path = file_path

    def on_epoch_end(self, num_epoch, logs=None):
        with open(self.file_path, 'a') as file:
            file.write(f'Epoch {num_epoch} - Loss: {logs["loss"]}, Accuracy: {logs["accuracy"]}, Val Loss: {logs["val_loss"]}, Val Accuracy: {logs["val_accuracy"]}\n')



# If you want to train the same model or try other models, go for this
if mode == "train":
    # 使用旧版本的Adam优化器


    model.compile(loss='categorical_crossentropy',    optimizer = tf.keras.optimizers.legacy.Adam(learning_rate=0.001, decay=1e-6),metrics=['accuracy'])

    # 创建Callback来保存训练数据
    save_data_callback = SaveTrainingDataCallback(file_path='training_data.txt')

    model_info = model.fit_generator(
            train_generator,
            steps_per_epoch=num_train // batch_size,
            epochs=num_epoch,
            validation_data=validation_generator,
            validation_steps=num_val // batch_size,
            callbacks=[save_data_callback]
    )
    train_loss = model_info.history['loss']
    train_accuracy = model_info.history['accuracy']
    val_loss = model_info.history['val_loss']
    val_accuracy = model_info.history['val_accuracy']

    plot_model_history(model_info)
    model.save_weights('model.h5')

添加的代码为

import tensorflow as tf

class SaveTrainingDataCallback(tf.keras.callbacks.Callback):
    def __init__(self, file_path):
        super(SaveTrainingDataCallback, self).__init__()
        self.file_path = file_path

    def on_epoch_end(self, num_epoch, logs=None):
        with open(self.file_path, 'a') as file:
            file.write(f'Epoch {num_epoch} - Loss: {logs["loss"]}, Accuracy: {logs["accuracy"]}, Val Loss: {logs["val_loss"]}, Val Accuracy: {logs["val_accuracy"]}\n')
#在这个示例中,我们定义了一个自定义的回调函数SaveTrainingDataCallback
,在每个epoch结束时将训练和验证数据写入到指定的文件中。然后我们创建了一个回调函数实例,并将其传递给模型的fit方法中,以在模型训练时保存训练数据。

# 创建Callback来保存训练数据
save_data_callback = SaveTrainingDataCallback(file_path='training_data.txt')
callbacks=[save_data_callback]

结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1594563.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

5.4Python之可变类型与列表的深浅拷贝

【1】可变类型与不可变类型 在Python中,数据类型可以分为可变类型(Mutable)和不可变类型(Immutable)。这指的是对象在创建后是否可以更改其值或状态。 不可变类型是指创建后不能更改其值或状态的对象。如果对不可变类…

二极管分类及用途

二极管分类及用途 通用开关二极管 特点:电流小,工作频率高 选型依据:正向电流、正向压降、功耗,反向最大电压,反向恢复时间,封装等 类型:BAS316 ; IN4148WS 应用电路: 说明:应用…

单路高清HDMI编码器JR-3211HD

产品简介: JR-3211HD单路高清HDMI编码器是专业的高清音视频编码产品,该产品具有支持1路高清HDMI音视频采集功能, 1路3.5MM独立外接音频输入,编码输出双码流H.264格式,音频MP3/AAC格式。编码码率可调,画面质…

双写一致性问题

双写一致性问题:同一份数据,需要写数据库、写缓存。数据库中的数据和缓存中的数据要一致 解决办法:延迟双删 当我们要进行更新操作时,先删除缓存,再更新数据库,延迟几百ms再删除一次redis的缓存数据。 示…

Java-Scanner类进阶+题目

Scanner进阶 接收整数数据时: 接收小数数据时: 例子: 可以先这样弄出scanner的框架: 未完待续... ...

DDoS攻击包含哪些层面?如何防护?

DDoS攻击(分布式拒绝服务攻击)是一种通过向目标服务器发送大量流量或请求,以使其无法正常工作的网络攻击手段。DDoS攻击涉及多个层面,在实施攻击时对网络基础架构、网络协议、应用层等进行攻击。下面将详细介绍DDoS攻击的层面。 1…

L1-027 出租

下面是新浪微博上曾经很火的一张图: 一时间网上一片求救声,急问这个怎么破。其实这段代码很简单,index数组就是arr数组的下标,index[0]=2 对应 arr[2]=1,index[1]=0 对应 arr[0]=8,index[2]=3 对应 arr[3]=0,以此类推…… 很容易得到电话号码是18013820100。 本…

【Git教程】(九)版本标签 —— 创建、查看标签,标签的散列值,将标签添加到日志输出中,判断标签是否包含特定的提交 ~

Git教程 版本标签(tag) 1️⃣ 创建标签2️⃣ 查看存在的标签3️⃣ 标签的散列值4️⃣ 将标签添加到日志输出中5️⃣ 判断tag是否包含特定的提交🌾 总结 大多数项目都是用 1.7.3.2和 “ gingerbread” 这样的数字或名称来标识软件版本的。在 …

5.3 mybatis之autoMappingUnknownColumnBehavior作用

文章目录 1. NONE2. WARNING3. FAILING autoMappingUnknownColumnBehavior是< settings >配置下的属性&#xff0c;该属性是指定发现自动映射目标未知列&#xff08;或未知属性类型&#xff09;的行为。就是说当数据库中的字段找不到映射java对象的属性或者与java对象对应…

1036: 寻找整数序列的主元素

解法&#xff1a; #include<iostream> #include<vector> #include<algorithm> using namespace std; int main() {int n;cin >> n;vector<int> arr(n);vector<int> tong(1000);for (auto& x : arr) {cin >> x;tong[x];}int pma…

ArrayList底层源码分析

ArrayList底层源码分析 底层原理 创建使用ArrayList<>()创建空对象的时候&#xff0c;会在底层创建一个长度为0的数组。该数组的名称为elementData&#xff0c;定义变量size size变量有两层含义 ① 表示元素的个数&#xff0c;也就是集合的长度② 表示下一个元素的存入位…

PostgreSQL入门到实战-第二十九弹

PostgreSQL入门到实战 PostgreSQL中数据分组操作(四)官网地址PostgreSQL概述PostgreSQL中CUBE命令理论PostgreSQL中CUBE命令实战更新计划 PostgreSQL中数据分组操作(四) 如何使用PostgreSQL CUBE生成多个分组集 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不…

Ubuntu20.04安装FloodLight最新版本

Ubuntu20.04安装FloodLight最新版本 网上的很多教程尝试了一下都不对&#xff0c;并且很多都是基于Ubuntu14的旧版本系统&#xff0c;其中的Python环境大多是基于2.0的&#xff0c;由于本人所使用的系统是Ubuntu20.04&#xff0c;后再油管澳大利亚某个学校的网络教学视频的帮助…

全国各省自然灾害损失造成的直接经济损失数据(2009-2022年)

01、数据简介 自然灾害是指给人类生存带来危害或损害人类生活环境的自然现象&#xff0c;这些现象是地球演化过程的自然现象。它们主要包括气象灾害、地质灾害、海洋灾害、生物灾害、森林草原火灾等五大类。 具体来说&#xff0c;气象灾害包括干旱、洪涝灾害、台风、风雹、低…

【OpenHarmony】XTS环境配置

零、参考 1、xts测试环境配置&#xff1a;https://www.yuque.com/u25440504/ehvzki/ik2fso 2、Windows安装Python、pip、easy_install的方法&#xff1a;https://pythonjishu.com/bmxqeisbkzgrpnn/ 3、Python中easy_install 和 pip 的安装及使用&#xff1a; https://blog.c…

【2024年IT行业各方向学习路线图(必收藏】

【IT行业各方向学习路线图(必收藏】 2024 Java学习路线图&#xff1a; 学习Java基础知识&#xff0c;包括语法、数据类型、控制流程等。 掌握面向对象编程&#xff08;OOP&#xff09;的概念和Java中的实现。 熟悉Java集合框架和多线程编程。 学习Java I/O流、网络编程和数据…

2024HW --> 安全产品 Powershell无文件落地攻击

在HW中&#xff0c;除了了解中间件&#xff0c;web漏洞&#xff0c;这些攻击的手法&#xff0c;还得了解应急响应&#xff0c;安全产品&#xff0c;入侵排查&#xff0c;溯源反制...... 那么今天&#xff0c;就来说一下安全产品&#xff08;安全公司我就不说了&#xff0c;这个…

[linux]进程控制——进程创建

一、fork&#xff1a; 在linux中fork函数从已存在进程中&#xff0c;创建一个新进程。新进程为子进程&#xff0c;而原进程为父进程。 返回值&#xff1a;子进程中返回0&#xff0c;父进程返回子进程id&#xff0c;出错返回-1。 1、常规用法&#xff1a; 一个父进程希望复制…

【THM】Net Sec Challenge(网络安全挑战)-初级渗透测试

介绍 使用此挑战来测试您对网络安全模块中获得的技能的掌握程度。此挑战中的所有问题都可以仅使用nmap、telnet和来解决hydra。 挑战问题 您可以使用Nmap、 Telnet 和Hydra回答以下问题。 2.1小于10000的最大开放端口号是多少? 8080 nmap -p- -T4 10.10.234.218 2.2普通…

43岁百亿千金夫妇国外旅游高调放闪,羡煞好友马国明

萧正楠早前忙着拍摄TVB新剧《奔跑吧&#xff01;勇敢的女人们》&#xff0c;剧集煞科后他即和老婆黄翠如一起到意大利旅行。两公婆分别在IG大晒旅行靓相&#xff0c;甜蜜满泻。 这次萧正楠的旅游照都是由翠如亲自操刀拍摄&#xff0c;相中所见&#xff0c;萧正楠在广场大摆Chok…