损失数值 如何放到csv中呢 

在Python中,使用`csv`模块将数据写入CSV文件是一种常见的操作。从你提供的代码片段来看,你想要将损失数值写入名为`middle_losse.csv`的文件中。但是,你提供的代码片段中存在一些需要修改的地方,以确保数据能够正确地写入CSV文件。

首先,`csv.writer`对象的`writerows`方法需要一个可迭代对象,例如列表的列表,而不是单个列表。如果你的`last_loss`是一个列表,你不能直接使用`zip(last_loss)`,因为`zip`会尝试将`last_loss`与自身进行配对,这通常不是你想要的结果。

如果你想要将`last_loss`列表中的每个元素作为单独的一行写入CSV文件,你应该这样做:

```python
 import csv# 假设 self.losses 是一个字典,其中包含损失数值的列表
 # 假设 global_step 是一个变量,表示当前的训练步数with open('loss_csv/middle_loss.csv', 'w', newline='') as f:  # 文件名可能有误,应该是 middle_loss.csv 而不是 middle_losse.csv
     writer = csv.writer(f)
     
     # 写入标题行
     writer.writerow(['Global Step', 'Loss'])
     
     # 写入损失数值
     for step, loss in enumerate(self.losses['g'], start=1):  # 假设从第1步开始计数
         writer.writerow([step, loss])
 ```
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

这段代码首先打开文件,然后创建一个`csv.writer`对象。接着,它写入标题行,表示接下来的数据将包含全局步数和损失数值。之后,它遍历`self.losses['g']`列表中的每个元素,并将每个元素与对应的步数一起作为一行写入CSV文件。

请注意,我假设`self.losses['g']`是一个包含损失数值的列表,并且`global_step`是一个表示当前训练步数的变量。如果`global_step`是你想要记录的最后一个步数,你可以相应地调整代码来写入这个特定的值。

=======================================================================

如果这样写法 ,csv输出的是时候 每一行就一个数据的

num_epochs = 25000
progress_bar = trange(num_epochs)

global_step = []
global_loss = []

for epoch in progress_bar:

    # loss = svi.step(x_train, y_train)
    for datax, datay in trainloader:
        # loss += svi.step(datax.view(-1, 32), datay)
        # print(datax)
        # print(datay)
        # loss = svi.step(datax.view(1, -1), datay.view(1, -1))
        # print(datax.shape)
        # print(datay.shape)
        # datax = datax.view(1, -1)
        # datay = datay.view(1, -1)
        # print(datax.shape)
        # print(datay.shape)
        # datax = datax.view(-1, 1)
        # datay = datay.view(-1, 1)
        # print(datax.shape)
        # print(datay.shape)
        loss = svi.step(datax, datay)
        progress_bar.set_postfix(loss=f"{loss / datax.shape[0]:.3f}")

    # 将计算得到的step和loss添加到对应的列表中
    global_step.append(epoch)
    global_loss.append(loss / datax.shape[0])
    with open('loss_csv/middle_loss.csv', 'w', newline='') as f:
        writer = csv.writer(f)
        # 这个运行结果是
        # writer.writerow(['Gloss'])
        # writer.writerow([self.losses['GP'][-1]])
        # writer.writerow(['global_step'])
        # writer.writerow([global_step])
        writer.writerow(['global_loss'])
        writer.writerows(zip(global_loss))
        writer.writerow(['global_step'])
        writer.writerows(zip(global_step))
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
global_loss
10166.450654457323
15605.151778484695
7788.397715842351
6380.42300617788
5724.394193498418
5359.894453747198
5571.510530438274
5492.6588832447305
5959.183144038543
5003.404720528051
4428.47156913206
4251.24302707985
global_step
0
1
2
3
4
5
6
7
8
9
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.

==============================================================
 

如果你想要记录每一个损失值,并且每个损失值都对应一个全局步数(global step),你可以按照以下方式修改代码:

```python
 import csv# 假设 self.losses 是一个字典,其中 'g' 键对应的值是一个列表,包含损失值
 # 假设 global_steps 是一个与 self.losses['g'] 长度相同的列表,包含每个损失值对应的全局步数with open('loss_csv/middle_loss.csv', 'w', newline='') as f:  # 确保文件名正确
     writer = csv.writer(f)
     
     # 写入标题行
     writer.writerow(['Global Step', 'Loss'])    # 假设 global_steps 和 self.losses['g'] 已经按照全局步数排序
     for global_step, loss in zip(global_steps, self.losses['g']):
         writer.writerow([global_step, loss])
 ```
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

这段代码首先打开文件`middle_loss.csv`进行写入,然后创建一个`csv.writer`对象。接着,它写入标题行,表示接下来的数据将包含全局步数和对应的损失值。之后,它使用`zip`函数同时遍历`global_steps`列表和`self.losses['g']`列表,将每个全局步数和对应的损失值作为一行写入CSV文件。

请注意,这里假设`global_steps`是一个列表,包含了每个损失值对应的全局步数,且这个列表与`self.losses['g']`列表的长度相同,并且是按照全局步数排序的。如果`global_steps`列表不存在,你需要根据你的实际情况来生成这个列表。如果每个损失值都对应相同的全局步数,你可以简单地使用一个范围对象来生成步数,例如:

```python
 # 假设损失值的数量
 num_losses = len(self.losses['g'])# 生成全局步数列表
 global_steps = list(range(1, num_losses + 1))# 然后使用上面的代码将数据写入CSV
 ```
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

这样,你就可以记录每一个损失值及其对应的全局步数了。
 

==========================================================

如果每一行记录所有咧

with open('loss_csv/middle_loss.csv', 'w', newline='') as f:
        writer = csv.writer(f)
        # 假设global_loss和global_step已经是按顺序排列好的列表
        # 并且它们的长度相同
        # 写入列名
        writer.writerow(['global_step', 'global_loss'])
        # 遍历步数和损失值列表,每次迭代获取一个步数和一个损失值
        for step, loss in zip(global_step, global_loss):
            # 写入一行数据,包括步数和对应的损失值
            writer.writerow([step, loss])
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
global_step,global_loss
0,6631.609640985727
1,5183.373958203942
2,5322.453822169453
3,4827.54164141044
4,5024.337589444593
5,4474.316665165126
6,4577.467127677053
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.