输入:
python /home/pipi/slowfast/tools/run_net.py --cfg /home/pipi/slowfast/demo/AVA/SLOWFAST_32x2_R101_50_50.yaml
报错显示:
self.class_names, _, _ = get_class_names(class_names_path, None, None)
TypeError: cannot unpack non-iterable NoneType object
情况:使用pytorch训练模型,问题出现在 loss.backward()
这一行代码
网上查了很多资料,大家相同的错误来源不同,别人的解决方式没法解决我的问题。
没有系统学习 pytorch 语法就直接上手写代码,着实难受,所以放下bug,去学习了一下语法知识。
分享一篇不错的文章
原代码:
# Train and evaluate
model = HeteroRGCN(G, 8, 8, 8)
opt = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=5e-4)
user_embedding, item_embedding = model(G)
for epoch in range(100):
for data in dataloader:
user, item_p, item_n = data
···
修改后:
# Train and evaluate
model = HeteroRGCN(G, 8, 8, 8)
opt = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=5e-4)
for epoch in range(2):
for data in dataloader:
user_embedding, item_embedding = model(G)
user, item_p, item_n = data
···
关键:修改了 user_embedding, item_embedding = model(G)
的位置
执行 model = HeteroRGCN(G, 8, 8, 8) 这一行代码的时候,是对模型进行初始化,即执行模型的 init 函数部分,
执行 user_embedding, item_embedding = model(G) 这一行代码的时候,是对模型进行前向传播,
(所以把他放在外面的时候,反向反向传播就认为是 NoneType 对象???)
根据参考资料中的错误信息和代码示例,可以看出报错的原因是在运行slowfast时,执行了一行代码"model(G)",但出现了TypeError。根据参考资料中的修改后的代码,可以看出解决方法是将"user_embedding, item_embedding = model(G)"这一行代码放在前面的for循环内部执行。
在回答问题之前,需要知道哪个slowfast项目是指的。由于问题描述中没有提供具体的slowfast项目,我无法准确回答你输入的命令是什么以及运行之前需要做哪些准备工作。
然而,根据错误信息和参考资料的代码示例,我可以给出解决TypeError报错的示例代码和一般解决方法:
解决方法: 首先,根据报错信息"TypeError: cannot unpack non-iterable NoneType object"得知,该错误是由于尝试对非可迭代的NoneType对象进行解包导致的。因此,我们需要找到这行代码:"user_embedding, item_embedding = model(G)"并对其进行修改。
错误示例代码:
user_embedding, item_embedding = model(G)
修改后的示例代码:
for data in dataloader:
user, item_p, item_n = data
user_embedding, item_embedding = model(G)
将"user_embedding, item_embedding = model(G)"代码放在内部的for循环中,确保在每个迭代步骤中,先执行了对模型进行前向传播的操作,再解包用户和项目嵌入的数据。
至于你所使用的具体slowfast项目,需要提供更多的信息以便我能够给出更准确的解答。