TypeError: only integer tensors of a single element can be converted to an index

Ula ·
更新时间:2024-09-21
· 855 次阅读

在调整loss计算的时候遇到了TypeError: only integer tensors of a single element can be converted to an index这个问题,原来的计算公式为:

self.loss_D = (self.loss_D_fake + self.loss_D_real) * 0.5

调整后的公式为:

# train.lcf[train.lcfCountD]为修正系数 self.loss_D = (self.loss_D_fake + self.loss_D_real) * 0.5 * train.lcf[train.lcfCountD]

但是运行时遇到报错:

Traceback (most recent call last): File "train.py", line 59, in model.optimize_parameters() # calculate loss functions, get gradients, update network weights File "E:\imageProcessing\pix2pix_model.py", line 130, in optimize_parameters self.backward_D() # calculate gradients for D File "E:\imageProcessing\pix2pix_model.py", line 107, in backward_D self.loss_D = (self.loss_D_fake + self.loss_D_real) * 0.5 * train.lcf[train.lcfCountD] TypeError: only integer tensors of a single element can be converted to an index

但通过:

print(train.lcf[train.lcfCountD])

得知train.lcf[train.lcfCountD]的值为:

2.694736842105263

和前面乘的0.5是一样的,这是什么原因呢?再检查数据类型:

print(self.loss_D_fake + self.loss_D_real) print((self.loss_D_fake + self.loss_D_real) * 0.5) print(type(0.5)) print(type(train.lcf[train.lcfCountD]))

结果发现:

tensor(6.8438, device='cuda:0', grad_fn=) tensor(3.4219, device='cuda:0', grad_fn=)

train.lcf[train.lcfCountD]数据居然是字符串!!!
通过强制类型转换:

print(type(train.lcf[train.lcfCountD])) train.lcf[train.lcfCountD] = float(train.lcf[train.lcfCountD]) print(type(train.lcf[train.lcfCountD]))

结果终于正确:

至此这个问题已解决。
但是好奇为什么train.lcf[train.lcfCountD]是str呢,回溯它的来源:
引自train.py文件:

global lcf, lcfCountD, lcfCountG lossCorrectFile = open('good_num_file.txt', 'r') lcf = lossCorrectFile.readlines() lcfCountD = 0 lcfCountG = 0

原来是文本读入的数据就是str型的,所以告诫了以后进行文本读写操作时,一定要注意数据类型啊!

DBzs 原创文章 9获赞 9访问量 599 关注 私信 展开阅读全文
作者:DBzs



single INTEGER INDEX TO element

需要 登录 后方可回复, 如果你还没有账号请 注册新账号
相关文章