Machine learning 运行时错误:形状为[512]的输出不';使用pytorch提取特征向量时,t匹配广播形状[1,512,1,512]

Machine learning 运行时错误:形状为[512]的输出不';使用pytorch提取特征向量时,t匹配广播形状[1,512,1,512],machine-learning,image-processing,deep-learning,neural-network,Machine Learning,Image Processing,Deep Learning,Neural Network,我无法解决此错误。此代码取自 错误:- --------------------------------------------------------------------------- RuntimeError Traceback (most recent call last) <ipython-input-41-ca2d66de2d9c> in <module>() ----> 1 pic_one_v

我无法解决此错误。此代码取自

错误:-

---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-41-ca2d66de2d9c> in <module>()
----> 1 pic_one_vector = get_vector(pic_one)
      2 pic_two_vector = get_vector(pic_two)

5 frames
<ipython-input-40-a45affe9d8f7> in get_vector(image_name)
     13     h = layer.register_forward_hook(copy_data)
     14     # 6. Run the model on our transformed image
---> 15     model(t_img)
     16     # 7. Detach our copy function from the layer
     17     h.remove()

/usr/local/lib/python3.6/dist-packages/torch/nn/modules/module.py in __call__(self, *input, **kwargs)
    548             result = self._slow_forward(*input, **kwargs)
    549         else:
--> 550             result = self.forward(*input, **kwargs)
    551         for hook in self._forward_hooks.values():
    552             hook_result = hook(self, input, result)

/usr/local/lib/python3.6/dist-packages/torchvision/models/resnet.py in forward(self, x)
    218 
    219     def forward(self, x):
--> 220         return self._forward_impl(x)
    221 
    222 

/usr/local/lib/python3.6/dist-packages/torchvision/models/resnet.py in _forward_impl(self, x)
    211         x = self.layer4(x)
    212 
--> 213         x = self.avgpool(x)
    214         x = torch.flatten(x, 1)
    215         x = self.fc(x)

/usr/local/lib/python3.6/dist-packages/torch/nn/modules/module.py in __call__(self, *input, **kwargs)
    550             result = self.forward(*input, **kwargs)
    551         for hook in self._forward_hooks.values():
--> 552             hook_result = hook(self, input, result)
    553             if hook_result is not None:
    554                 result = hook_result

<ipython-input-40-a45affe9d8f7> in copy_data(m, i, o)
      9     # 4. Define a function that will copy the output of a layer
     10     def copy_data(m, i, o):
---> 11         my_embedding.copy_(o.data)
     12     # 5. Attach that function to our selected layer
     13     h = layer.register_forward_hook(copy_data)

RuntimeError: output with shape [512] doesn't match the broadcast shape [1, 512, 1, 512]
---------------------------------------------------------------------------
运行时错误回溯(上次最近调用)
在()
---->1 pic_one_vector=获取向量(pic_one)
2 pic_two_vector=获取向量(pic_two)
5帧
在获取向量(图像名称)中
13 h=层。寄存器前向钩子(复制数据)
14     # 6. 在转换后的图像上运行模型
--->15型(t_img)
16     # 7. 将复制功能从层中分离
17 h.删除()
/usr/local/lib/python3.6/dist-packages/torch/nn/modules/module.py in_u_________(self,*input,**kwargs)
548结果=self.\u slow\u forward(*输入,**kwargs)
549其他:
-->550结果=自转发(*输入,**kwargs)
551用于钩住自身。\u向前\u钩住.values():
552钩子结果=钩子(自身、输入、结果)
/前进中的usr/local/lib/python3.6/dist-packages/torchvision/models/resnet.py(self,x)
218
219 def前进档(自身,x):
-->220返回自向前执行(x)
221
222
/usr/local/lib/python3.6/dist-packages/torchvision/models/resnet.py in\u forward\u impl(self,x)
211 x=自分层4(x)
212
-->213 x=self.avgpool(x)
214 x=火炬。展平(x,1)
215 x=self.fc(x)
/usr/local/lib/python3.6/dist-packages/torch/nn/modules/module.py in_u_________(self,*input,**kwargs)
550结果=自转发(*输入,**kwargs)
551用于钩住自身。\u向前\u钩住.values():
-->552钩子结果=钩子(自身、输入、结果)
553如果hook_结果不是None:
554结果=挂钩结果
拷贝中的数据(m、i、o)
9     # 4. 定义一个复制图层输出的函数
10 def复制_数据(m、i、o):
--->11我的嵌入。复制(o.data)
12     # 5. 将该功能附加到我们选择的图层
13 h=层。寄存器前向钩子(复制数据)
RuntimeError:形状为[512]的输出与广播形状[1,512,1,512]不匹配
我实际上想做的是从图像中提取特征向量,我想进一步用于构建推荐系统。如果还有其他选择,一定要通知我。
提前感谢

您需要在avgpool之后重塑输出数据:

def copy_数据(m、i、o):
my_embedding.copy_(o.data.reforme(o.data.size(1)))

或者,您可以使用以下函数替换钩子函数,这样您就不必调整输出形状:

# step 3 and 4
my_embedding = None
def my_hook(module_, input_, output_):
    nonlocal my_output
    my_embedding = output_
然后只需调用以下命令

# step 5
h = layer.register_forward_hook(my_hook)

感谢@Vlad Rusu提供的有用答案。成功了!!!!谢谢@GreasyGoose!!!!
# step 5
h = layer.register_forward_hook(my_hook)