存放torch tensor的列表执行remove操作触发RuntimeError的原因及解决方案
报错原因与触发环节
Python原生列表的remove()方法会遍历列表所有元素,依次和待删除元素执行==相等比较,当比较结果为真时删除对应元素。
当列表元素为PyTorch张量时,两个张量的==运算返回的是逐元素比较的布尔张量,而非单个布尔值。remove()方法需要把比较结果转为单个布尔值判断是否匹配,这个强制转换就是报错的触发环节。你的单元素张量维度为1 64 3 1080 1920,包含大量数值,自然无法被转换为单个布尔值,因此触发RuntimeError。
转成张量后仍可使用的操作方法
方法1:按索引删除(优先推荐)
你是直接从train_data中取出的目标元素,取出时可以直接记录对应索引,调用列表的pop()方法按索引删除,全程不会触发张量相等比较,性能更高也不会报错:
# 示例:取出索引为2的元素移动到验证集 target_idx = 2 element = train_data[target_idx] validation_data.append(element) # 直接按索引删除,无需比较张量 train_data.pop(target_idx)
方法2:按张量值匹配删除
如果确实不知道目标元素的索引,可自行遍历列表,调用张量内置的equal()方法判断是否完全匹配,该方法会直接返回单个布尔值,不会触发报错:
for idx in range(len(train_data)): if train_data[idx].equal(element): del train_data[idx] break
内容的提问来源于stack exchange,提问作者SGKlee
相关产品推荐
相关产品推荐

