我有一个现有的模型,我在其中加载一些预训练的权重,然后在 pytorch 中进行预测(一次一张图像)。我正在尝试将其基本上转换为 pytorch 闪电模块,并且对一些事情感到困惑。
所以目前,我__init__
的模型方法如下所示:
self._load_config_file(cfg_file)
# just creates the pytorch network
self.create_network()
self.load_weights(weights_file)
self.cuda(device=0) # assumes GPU and uses one. This is probably suboptimal
self.eval() # prediction mode
我可以从闪电文档中收集到的信息,我几乎可以做同样的事情,除了不cuda()
打电话。所以像:
self.create_network()
self.load_weights(weights_file)
self.freeze() # prediction mode
所以,我的第一个问题是这是否是使用闪电的正确方法?闪电如何知道它是否需要使用 GPU?我猜这需要在某处指定。
现在,对于预测,我有以下设置:
def infer(frame):
img = transform(frame) # apply some transformation to the input
img = torch.from_numpy(img).float().unsqueeze(0).cuda(device=0)
with torch.no_grad():
output = self.__call__(Variable(img)).data.cpu().numpy()
return output
这是让我感到困惑的一点。我需要重写哪些函数才能进行与闪电兼容的预测?
此外,目前,输入是一个 numpy 数组。这是闪电模块可以实现的,还是总是需要使用某种数据加载器?
在某些时候,我想扩展这个模型实现来进行训练,所以想确保我做对了,但是虽然大多数例子都集中在训练模型上,一个简单的例子是在生产时对单个图像进行预测/数据点可能有用。
我在 GPU 上使用 0.7.5 和 pytorch 1.4.0 和 cuda 10.1