Pytorch 如何将训练数据保存成CSV文件,并读取CSV文件,绘制损失函数图

最近刚入手Pytorch框架,因为论文中需要贴出损失函数的训练过程的曲线,因此就自己写了个函数,通过列表的形式,将训练数据记录下来,并且保存成CSV文件,方便我们以后读取并绘制图像。

一、数据保存成CSV文件

在这里,我们以拟合二次函数为例,首先需要定义一个空的二维列表

定义二维列表:

 lossData=[[]]

 

 接着,向里面添加每一步的训练数据,iter代表训练的次数,loss.data.numpy()代表每一次训练的损失值,因为pytorch中,loss是variable类型,因此要使用data,提取其中的数值(tensor类型),再使用numpy,转换成数值类型,方便我们后续绘图使用

 将数据保存在二维列表中:

 lossData.append([iter,loss.data.numpy()]) #先转成普通tensor,再转成numpy形式

 

 最后,就是自定义一个函数,在训练结束时,将列表数据转换CSV文件

数据转成CSV:

def data_write_csv(file_name, datas):  # file_name为写入CSV文件的路径,datas为要写入数据列表
    file_csv = codecs.open(file_name, 'w+', 'utf-8')  # 追加
    writer = csv.writer(file_csv, delimiter=' ', quotechar=' ', quoting=csv.QUOTE_MINIMAL)
    for data in datas:
        writer.writerow(data)
    print("保存文件成功,处理结束")

完整的代码如下: 

import torch
from  torch.autograd import Variable
import torch.nn.functional as F
import matplotlib.pyplot as plt
import torch.utils.data as Data
torch.manual_seed(1)    # reproducible
import csv
import codecs
import numpy as np

def data_write_csv(file_name, datas):  # file_name为写入CSV文件的路径,datas为要写入数据列表
    file_csv = codecs.open(file_name, 'w+', 'utf-8')  # 追加
    writer = csv.writer(file_csv, delimiter=' ', quotechar=' ', quoting=csv.QUOTE_MINIMAL)
    for data in datas:
        writer.writerow(data)
    print("保存文件成功,处理结束")

if __name__ == '__main__':
    '''快速搭建网络'''
    Net = torch.nn.Sequential(
        torch.nn.Linear(1, 10),
        torch.nn.ReLU(),
        torch.nn.Linear(10, 1)
    )

    '''生成数据'''
    #linespace 返回一维的tensor,从step到end,分成Steps个线段得到的向量
    #unsqueeze 增加一个维度,tensor要求的数据是二维的
    x=torch.unsqueeze(torch.linspace(-1,1,100),dim=1) #shape=(100,1)
    #生成标签,前一项是二次函数,后一项是加上随机噪声
    #返回一个张量,包含了从区间[0, 1)的均匀分布中抽取的一组随机数
    y=x.pow(2)+0.2*torch.rand(x.size())

    '''数据批量化'''
    BATCH_SIZE=10
    EPOCH=20
    # 先转换成 torch 能识别的 Dataset
    torch_dataset = Data.TensorDataset(x, y)

    # 把 dataset 放入 DataLoader
    loader = Data.DataLoader(
        dataset=torch_dataset,  # torch TensorDataset format
        batch_size=BATCH_SIZE,  # mini batch size
        shuffle=True,  #  (打乱比较好)
        num_workers=2,  # 多线程来读数据
    )

    '''训练过程'''
    optimizer = torch.optim.SGD(Net.parameters(), lr=0.1)  # 传入 net 的所有参数, 学习效率,实例化类,生成对象
    loss_func = torch.nn.MSELoss()  # 预测值和真实值的误差计算公式 (均方差处理回归),实例化类,生成对象

    '''可视化操作'''
    lossData=[[]]
    iter=0
    for epoch in range(EPOCH):
        print('Epoch:  ', epoch)
        for step, (batch_x, batch_y) in enumerate(loader):
            b_x = Variable(batch_x)  # 务必要用 Variable 包一下,可以在GPU上运算
            b_y = Variable(batch_y) #Variable类型的变量会被放到一个计算图中
            prediction = Net(b_x)  # 喂给 net 训练数据 x, 输出预测值
            loss = loss_func(prediction, b_y)  # 计算两者的误差
            lossData.append([iter,loss.data.numpy()]) #先转成普通tensor,再转成numpy形式
            iter+=1
            optimizer.zero_grad()  # 清空上一步的残余更新参数值
            loss.backward()  # 误差反向传播, 计算参数更新值
            optimizer.step()  # 将参数更新值施加到 net 的 p
            print("Epoch[{}].step[{}]:loss:{}".format(epoch,step,loss))
            if epoch % 10 == 0:
                torch.save(Net, ".\\checkpoint\\net_{}.pkl".format(epoch))  # 保存整个网络
    data_write_csv(".\\parametres.csv", lossData)

 二、读取CSV文件

这里就是自定义一个函数,根据保存的文件形式,按行读取CSV文件的内容,并且使用空格作为分隔符,将每一行的数据分隔成两个,前一个是训练次数,后一个是对应的损失值,特别地,因为首行为空,所以要先将CSV文件的第一行,剔除出来。

这是CSV保存数据的形式:

完整代码:

import torch
from  torch.autograd import Variable
import torch.nn.functional as F
import matplotlib.pyplot as plt
import csv

'''读取csv文件'''
def readcsv(files):
    csvfile = open(files, 'r')
    plots = csv.reader(csvfile, delimiter=' ')#按行读取CSV文件中的数据,每一行以空格作为分隔符,再将内容保存成列表的形式
    next( plots)  # 读取首行
    x = []
    y = []
    for row in plots:
        x.append(float(row[0]))#从csv读取的数据是str类型,转成float类型
        y.append(float(row[1]))
    return x ,y

plt.figure()
x2,y2=readcsv("parametres.csv")
plt.plot(x2, y2, color='red', linewidth = '1',label='SGD_loss')

plt.xticks(fontsize=20)
plt.yticks(fontsize=20)

plt.ylim(0, 0.2) #y轴取值范围
plt.xlim(0, 200) #x轴取值范围
plt.xlabel('Training Steps',fontsize=15) #x轴标签
plt.ylabel('Training loss',fontsize=15) #y轴标签
plt.legend(fontsize=16)  #标签的字号
plt.show()

 出图结果:

 

### 回答1: 好的,您想了解如何使用Python读取CSV文件并执行Diana聚类。下面是一个简单的示例: 1. 导入所需的库: ```python import pandas as pd from scipy.cluster.hierarchy import dendrogram, linkage from matplotlib import pyplot as plt ``` 2. 读取CSV文件: ```python data = pd.read_csv('your_file.csv') ``` 3. 对数据进行Diana聚类: ```python Z = linkage(data, 'ward') ``` 4. 绘制Dendrogram: ```python plt.figure(figsize=(15, 5)) dendrogram(Z) plt.show() ``` 这是一个简单的示例,您可以根据您的具体需求进行调整。希望对您有所帮助! ### 回答2: Python 是一种功能强大的编程语言,可以用来读取和处理各种类型的文件,包括 CSV 文件。在读取 CSV 文件时,我们可以使用 pandas 库提供的函数。 首先,我们需要先安装 pandas 库。通过在终端或命令提示符中运行以下命令来安装 pandas: `pip install pandas` 接下来,我们可以导入 pandas 库并使用 `pandas.read_csv()` 函数来读取 CSV 文件。我们需要提供 CSV 文件的路径作为该函数的参数。 假设我们的 CSV 文件名为 `data.csv`,并且它位于与 Python 代码相同的目录中,我们可以使用以下代码读取它: ```python import pandas as pd # 读取 CSV 文件 data = pd.read_csv('data.csv') # 打印数据 print(data) ``` 接下来,我们可以使用 diana 聚类算法来对数据进行聚类。diana 聚类是一种层次聚类算法,它根据数据之间的距离或相似性将数据不同的聚类。 首先,我们需要导入 diana 聚类算法的实现。我们可以使用 `sklearn.cluster.diana` 来导入该算法的实现。 然后,我们可以创建 diana 聚类算法的实例并拟合我们的数据。假设我们要聚类的数据存储在 `x` 变量中,我们可以使用以下代码: ```python from sklearn.cluster import diana # 创建 diana 聚类算法实例 diana_cluster = diana.DIANA() # 拟合数据 diana_cluster.fit(x) # 获取聚类结果 labels = diana_cluster.labels_ ``` 上述代码将在 `labels` 变量中存储聚类结果,每个数据点将被分配到一个聚类中。 最后,我们可以将聚类结果写入 CSV 文件。我们可以使用 `pandas.DataFrame.to_csv()` 函数将数据和对应的聚类标签写入到新的 CSV 文件中。 ```python # 将聚类结果写入到新的 CSV 文件 data['cluster'] = labels data.to_csv('clustered_data.csv', index=False) ``` 上述代码将在名为 `clustered_data.csv` 的文件中写入聚类结果,并排除索引列。 综上所述,我们可以使用 Python 读取 CSV 文件,并使用 diana 聚类算法对数据进行聚类,并将聚类结果写入到新的 CSV 文件中。 ### 回答3: Python可以使用 pandas 库来读取和处理 CSV 文件。而聚类算法可以使用 scikit-learn 库中的 KMeans 方法来进行。下面是一个示例代码,演示如何使用 Python 读取 CSV 文件并进行 Diana 聚类: ```python import pandas as pd from sklearn.cluster import AgglomerativeClustering # 读取CSV文件 data = pd.read_csv('data.csv') # 提取需要的特征列(假设数据中有两列特征) features = data[['feature1', 'feature2']] # 创建并训练聚类模型 model = AgglomerativeClustering(n_clusters=3, linkage='ward') model.fit(features) # 将聚类结果添加到数据集中 data['cluster'] = model.labels_ # 输出聚类结果 print(data) ``` 在代码中,首先我们使用 pandas 的 `read_csv` 方法读取 CSV 文件,将其存储在一个 DataFrame 对象中。然后我们提取出其中需要的特征列,创建了一个含有两个特征的数据集。接下来,我们使用 `AgglomerativeClustering` 方法创建了聚类模型,指定了聚类的类别数和链接方式。然后,我们使用 `fit` 方法对数据集进行训练,并将聚类结果存储在一个新的列 `cluster` 中。最后,我们输出带有聚类结果的数据集。 请注意,以上示例中假设了数据集中有两个特征,你需要根据实际情况修改特征列的名字和聚类的类别数。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值