将训练和测试的loss、accuracy等数据保存到文件

本文介绍如何使用Python的pandas库创建和操作CSV文件,包括数据的生成、写入及可视化展示,并展示了如何创建和写入TXT文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.csv文件

1.1 创建csv文件

这里用的是pandas库,以创建train_acc.csv为例,var_acc.csv类似

  • 代码
import random
import pandas as pd
from datetime import datetime
#创建train_acc.csv和var_acc.csv文件,记录loss和accuracy
df = pd.DataFrame(columns=['time','step','train Loss','training accuracy'])#列名
df.to_csv("F:\\Documents\\train_acc.csv",index=False) #路径可以根据需要更改

  • 生成train_acc.csv文件
    在这里插入图片描述

1.2 将数据写入csv文件

说明:这里用的loss和accuracy数据是随机生成的,仅用作test

#初始化train数据
t_loss = 0.4
t_acc = 0.3
for i in range(20):#假设迭代20次
    time = "%s"%datetime.now()#获取当前时间
    step = "Step[%d]"%i
    t_loss = t_loss - random.uniform(0.01,0.017)
    train_loss = "%f"%t_loss
    t_acc = t_acc + random.uniform(0.025,0.035)
    train_acc = "%g"%t_acc
#将数据保存在一维列表
    list = [time,step,train_loss,train_acc]
#由于DataFrame是Pandas库中的一种数据结构,它类似excel,是一种二维表,所以需要将list以二维列表的形式转化为DataFrame
    data = pd.DataFrame([list])
    data.to_csv('F:\\Documents\\train_acc.csv',mode='a',header=False,index=False)#mode设为a,就可以向csv文件追加数据了

  • 写入数据后
    在这里插入图片描述

1.3 可视化

  • 代码
#可视化
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#读取csv中指定列的数据
data = pd.read_csv('F:\\Documents\\train_acc.csv')
data_loss = data[['train Loss']] #class 'pandas.core.frame.DataFrame'
data_acc = data[['training accuracy']]
x = np.arange(0,20,1)
y1 =np.array(data_loss)#将DataFrame类型转化为numpy数组
y2 = np.array(data_acc)
#绘图
plt.plot(x,y1,label="loss")
plt.plot(x,y2,label="accuracy")
plt.title("loss & accuracy") 
plt.xlabel('step')
plt.ylabel('probability')
plt.legend()   #显示标签
plt.show()
  • 折线图
    在这里插入图片描述

2.txt文件

2.1 创建txt文件并写入数据

这里重新生成一组数据写入txt文件,这个较简单,直接上代码

  • 代码
from datetime import datetime
import random

train_loss = 0.4
train_acc = 0.3
trainAcc_txt = "F:\\Documents\\train_acc.txt"
for i in range(20):
    train_loss = train_loss - random.uniform(0.01,0.017)
    train_acc = train_acc + random.uniform(0.025,0.035)
    output = "%s:Step [%d]  train Loss : %f, training accuracy :  %g" % (datetime.now(),i, train_loss, train_acc)
    with open(trainAcc_txt,"a+") as f:
        f.write(output+'\n')
        f.close
  • 效果
    在这里插入图片描述
### 如何通过 `train.py` 加载数据集并训练模型 在 Python 脚本中,通常会编写一个名为 `train.py` 的文件来完成模型的训练过程。以下是实现这一功能的关键部分: #### 数据集加载 可以通过 PyTorch 提供的数据加载工具来读取数据集。例如,在 CIFAR-10 数据集中,可以使用如下代码加载训练集[^5]: ```python import torchvision.transforms as transforms from torchvision import datasets transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) ]) train_set = datasets.CIFAR10(root='./data', train=True, download=False, transform=transform) train_loader = torch.utils.data.DataLoader(train_set, batch_size=64, shuffle=True) ``` #### 定义模型、优化器损失函数 为了训练模型,需要定义模型结构、优化器以及损失函数。以下是一个典型的设置方式[^2]: ```python import torch.nn as nn import torch.optim as optim device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') model = create_model(num_classes=num_classes).to(device) # 创建模型实例 params_to_optimize = [p for p in model.parameters() if p.requires_grad] optimizer = optim.SGD(params_to_optimize, lr=0.01, momentum=0.9, weight_decay=5e-4) criterion = nn.CrossEntropyLoss() ``` #### 模型训练循环 在训练过程中,每次迭代都会计算损失值,并更新模型参数。以下是一个简单的训练循环示例[^4]: ```python for epoch in range(num_epochs): running_loss = 0.0 correct_predictions = 0 total_samples = 0 for inputs, labels in train_loader: inputs, labels = inputs.to(device), labels.to(device) optimizer.zero_grad() outputs = model(inputs) _, predicted = torch.max(outputs, 1) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() total_samples += labels.size(0) correct_predictions += (predicted == labels).sum().item() epoch_loss = running_loss / len(train_loader) epoch_accuracy = 100 * correct_predictions / total_samples print(f"Epoch {epoch+1}/{num_epochs}, Loss: {epoch_loss:.4f}, Accuracy: {epoch_accuracy:.2f}%") ``` #### 保存模型参数 当训练完成后,可以将模型的状态字典保存到磁盘上以便后续使用[^1]: ```python torch.save(model.state_dict(), 'model.pth') print("Model parameters saved to 'model.pth'") ``` --- ### 使用 `predict.py` 进行自定义数据测试 对于测试阶段,可以创建另一个脚本 `predict.py` 来加载已保存的模型并对新数据进行预测。 #### 加载模型 首先需要重新构建相同的模型架构,并加载之前保存的参数: ```python model.load_state_dict(torch.load('model.pth')) model.eval() # 设置为评估模式 ``` #### 处理自定义输入 假设有一个图像路径列表作为输入,则可以逐个处理这些图片并获取其分类结果[^3]: ```python from PIL import Image def preprocess_image(image_path): img = Image.open(image_path).convert('RGB') tensor_img = transform(img).unsqueeze_(0).to(device) return tensor_img image_paths = ['path/to/image1.jpg', 'path/to/image2.jpg'] with torch.no_grad(): for path in image_paths: input_tensor = preprocess_image(path) output = model(input_tensor) probabilities = torch.softmax(output, dim=1)[0] top_prob, class_idx = torch.topk(probabilities, k=1) print(f"{path}: Predicted Class={class_idx.item()}, Probability={top_prob.item():.4f}") ``` --- ### 关于 `model.py` 中的模型结构设计 如果要单独维护模型结构,可以在 `model.py` 文件中定义网络层。例如,基于 ResNet 或其他卷积神经网络的设计可能如下所示: ```python import torch.nn as nn class CustomCNN(nn.Module): def __init__(self, num_classes): super(CustomCNN, self).__init__() self.features = nn.Sequential( nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3), nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=2, stride=2), nn.Conv2d(in_channels=64, out_channels=128, kernel_size=3), nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=2, stride=2) ) self.classifier = nn.Linear(128*7*7, num_classes) def forward(self, x): x = self.features(x) x = x.view(x.size(0), -1) x = self.classifier(x) return x ``` 调用此模块时只需传入类别数量即可初始化模型对象。 ---
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值