欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

RuntimeError: Output 0 of SelectBackward is a view and is being modified inplace.

程序员文章站 2022-03-04 14:21:27
...

1. 问题背景

今天在浏览一些代码的时候,总是出现了以下的错误描述

RuntimeError: Output 0 of SelectBackward is a view and is being modified inplace. This view is the output of a function that returns multiple views. Such functions do not allow the output views to be modified inplace. You should replace the inplace operation by an out-of-place one.

我发现错误的地方都是循环中直接修改原数组导致的:

for next_token_logit in next_token_logits:
	next_token_logit[tokenizer.convert_tokens_to_ids('[UNK]')] = -float('Inf')

解释:

在for循环运行的过程中,next_token_logit 中的元素会被修改,然而下一轮循环还会读取next_token_logits并修改,此时Python无法分辨此时:操作原始的next_token_logits还是在循环一轮修改后的next_token_logits?

2. 解决方案

将最开始的直接修改方法改成对数组的索引,然后根据索引直接修改数组对应的位置,例如

for i in range(len(next_token_logits)):
	next_token_logits[i][tokenizer.convert_tokens_to_ids('[UNK]')] = -float('Inf')

最后这样就大功告成啦!!

相关标签: Python学习 python