损失数值 如何放到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])
```
这段代码首先打开文件,然后创建一个`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))
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
==============================================================
如果你想要记录每一个损失值,并且每个损失值都对应一个全局步数(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])
```
这段代码首先打开文件`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
```
这样,你就可以记录每一个损失值及其对应的全局步数了。
==========================================================
如果每一行记录所有咧
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])
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
标签:loss,writer,python,global,step,Pytorch,tensorflow,csv,步数
From: https://blog.51cto.com/u_16120231/11907314