模型训练-保存训练数据

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.0correct = 0total = 0# 训练一个 epochfor 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 / totalaccuracy = 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 = 0epoch = config.epochfor 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 = vaccsave_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 tfclass SaveTrainingDataCallback(tf.keras.callbacks.Callback):def __init__(self, file_path):super(SaveTrainingDataCallback, self).__init__()self.file_path = file_pathdef 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 tfclass SaveTrainingDataCallback(tf.keras.callbacks.Callback):def __init__(self, file_path):super(SaveTrainingDataCallback, self).__init__()self.file_path = file_pathdef 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 tfclass SaveTrainingDataCallback(tf.keras.callbacks.Callback):def __init__(self, file_path):super(SaveTrainingDataCallback, self).__init__()self.file_path = file_pathdef 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.hqwc.cn/news/618442.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器主机关机重启告警

提取时间段内系统操作命名,出现系统重启命令,若要出现及时联系确认 重启命令: reboot / init 6 / shutdown -r now(现在重启命令) 关机命令: init 0 / shutdown -h now(关机&#…

ASP.NET Core 标识(Identity)框架系列(二):使用标识(Identity)框架生成 JWT Token

前言 JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络上以 JSON 对象的形式安全地传输信息。 JWT 通常用于在用户和服务器之间传递身份验证信息,以便在用户进行跨域访问时进行身份验证。 JWT 由…

会声会影2024全新视频剪辑软件

会声会影 (CyberLink PowerDirector) 是一款既强大又易于使用的视频编辑软件,具有众多功能和工具,专为用户设计制作高质量的视频剪辑和制作。无论您是一个新手或是一个有经验的电影制作者,会声会影都适合您的需要。 生活即电影 软件下载地址&…

物联网:门锁RNBN-K18使用记录

摘要:对 RNBN品牌下 K18智能门锁日常使用操作经验记录。 常见问题: 1.门锁联网时,找不到 wifi 怎么办。 答:检查一下几个方面:1. wifi 信号是否是2.4G,2.wifi信号是否距离没锁很远。因为门锁只能获取到2…

python应用-os库操作目录

python自带的os模块提供了许多与操作系统交互的函数,适配多种操作系统,比如windows,mac,linux等,比如常用路径操作、进程管理、环境参数等都可通过os模块实现。 以下是自带的os.py中的前面一部分代码。 第一个红框中主…

Flutter第八弹 构建拥有不同项的列表

目标:1)项目中,数据源可能涉及不同的模版,显示不同类型的子项,类似RecycleView的itemType, 有多种类型,列表怎么显示? 2)不同的数据源构建列表 一、创建不同的数据源 采用类似Rec…

C++ | Leetcode C++题解之第27题移除元素

题目&#xff1a; 题解&#xff1a; class Solution { public:int removeElement(vector<int>& nums, int val) {int left 0, right nums.size();while (left < right) {if (nums[left] val) {nums[left] nums[right - 1];right--;} else {left;}}return lef…

minikube环境搭建

&#x1f4d5;作者简介&#xff1a; 过去日记&#xff0c;致力于Java、GoLang,Rust等多种编程语言&#xff0c;热爱技术&#xff0c;喜欢游戏的博主。 &#x1f4d8;相关专栏Rust初阶教程、go语言基础系列、spring教程等&#xff0c;大家有兴趣的可以看一看 &#x1f4d9;Jav…

深度学习学习日记4.14 数据增强 Unet网络部分

数据增强 transforms.Compose([&#xff1a;这表示创建一个转换组合&#xff0c;将多个数据转换操作串联在一起 transforms.RandomHorizontalFlip()&#xff1a;这个操作是随机水平翻转图像&#xff0c;以增加数据的多样性。它以一定的概率随机地水平翻转输入的图像。 transfo…

【云计算】云数据中心网络(二):弹性公网 IP

云数据中心网络&#xff08;二&#xff09;&#xff1a;弹性公网 IP 1.什么是弹性公网 IP2.弹性公网 IP 的类型2.1 多线 EIP2.2 任播 EIP2.3 单线静态 EIP2.4 精品 EIP2.5 识别不同类型的 IP 的地址 3.弹性公网 IP 功能3.1 自带公网 IP 地址上云3.2 尽力找回公网 IP 地址3.3 连…

发布 Chrome/Edge浏览器extension扩展到应用商店

Chrom Extension发布流程 创建和发布自定义 Chrome 应用和扩展程序&#xff1a;https://support.google.com/chrome/a/answer/2714278?hlzh-Hans 在 Chrome 应用商店中发布&#xff1a;https://developer.chrome.com/docs/webstore/publish?hlzh-cn 注册开发者帐号&#…

有真的副业推荐吗?

#有真的副业推荐吗# 我做副业项目的时候&#xff0c;认识了一位带娃宝妈&#xff0c;讲一下她空闲时间做副业赚钱的故事吧。在一个温馨的小家庭里&#xff0c;李婷是一位全职宝妈&#xff0c;她的主要任务是照顾和陪伴自己可爱的宝宝。然而&#xff0c;随着宝宝逐渐长大&#x…