提要
最近我在学习莫烦的神经网络的批训练时,遇到了一个问题,就是在创建dataset时报__init__() got an unexpected keyword argument 'data_tensor'
,我找了很久都没有有效的结果。但是我偶然尝试了一下结果成功了,下面就列出调试过程
原始情况
原始代码
x = torch.linspace(1, 10, 10) # x data (torch tensor)
y = torch.linspace(10, 1, 10) # y data (torch tensor)
# 先转换成 torch 能识别的 Dataset
torch_dataset = Data.TensorDataset(data_tensor=x, target_tensor=y)
报错
初步调试
经过我的一番查找,网上有一种方法是说把data_tensor和target_tensor去掉,即
x = torch.linspace(1, 10, 10) # x data (torch tensor)
y = torch.linspace(10, 1, 10) # y data (torch tensor)
# 先转换成 torch 能识别的 Dataset
torch_dataset = Data.TensorDataset(x, y)
但是这次报错更加夸张,见下图
继续调试
上图只是我截的报错中的一小部分,虽然报错很夸张,但是我们在浏览报错信息的过程中捕捉到了一句话就是
This probably means that you are not using fork to start your child processes and you have forgotten to use the proper idiom in the main module:
if __name__ == '__main__':
freeze_support()
...
这段程序是开了双线程,而上面一段话告诉我们,没办法在当前进程结束以前再开一个新的线程。为什么呢?下面告诉我们说没加开始入口。也就是说我们要给程序加上开始入口。
那么加上继续运行
if __name__ == '__main__':
x = torch.linspace(1, 10, 10)
y = torch.linspace(10, 1, 10)
# 先转换成 torch 能识别的 Dataset
torch_dataset = data.TensorDataset(x, y)
结果
最后反思
好的,我们成功运行出了结果。但是我们依然要回想这次的调试过程,看看问题真的只是出在没加入口上吗?那么,我们不妨再把代码改回去。
if __name__ == '__main__':
x = torch.linspace(1, 10, 10)
y = torch.linspace(10, 1, 10)
# 先转换成 torch 能识别的 Dataset
torch_dataset = data.TensorDataset(data_tensor=x, target_tensor=y)
来,我们运行一下试试看
看,依然报这个错误,看来要解决这个问题,既要加上入口,又要去掉data_tensor和target_tensor。
那么,还有最后一个问题:到底为什么会报__init__() got an unexpected keyword argument 'data_tensor'
,这也是我始终不明白的地方。如果有大佬路过,请留下您的见解。
如果各位看官觉得有帮助,请点个赞哦