ValueError:操作数不能与形状(50,50,512)(3,)(50,50,512)一起广播,同时将张量转换为Py



我正在进行神经样式转移。我正在尝试重建VGG19网络的卷积层Conv4_2的输出。

def get_features(image, model):
    layers = {'0': 'conv1_1', '5': 'conv2_1',  '10': 'conv3_1', 
              '19': 'conv4_1', '21': 'conv4_2', '28': 'conv5_1'}
    x = image
    features = {}
    for name, layer in model._modules.items():
        x = layer(x)
        if name in layers:
            features[layers[name]] = x   
    return features
content_img_features = get_features(content_img, vgg)
style_img_features   = get_features(style_img, vgg)
target_content = content_img_features['conv4_2']

content_img_features是包含每一层输出的dict。target_content是形状torch.Size([1, 512, 50, 50])

的张量

这是我使用张量来绘制图像的方法。它适用于输入图像以及最终输出。

def tensor_to_image(tensor):
    image = tensor.clone().detach()
    image = image.numpy().squeeze()
    image = image.transpose(1, 2, 0)
    image *= np.array((0.22, 0.22, 0.22))+ np.array((0.44, 0.44, 0.44))
    image = image.clip(0, 1)
    return image
image = tensor_to_image(target_content)
fig = plt.figure()
plt.imshow(image)

但这引发了错误,

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-188-a75a5f0743bb> in <module>()
      1 
----> 2 image = tensor_to_image(target_content)
      3 fig = plt.figure()
      4 plt.imshow(image)
<ipython-input-186-e9385dbc4a85> in tensor_to_image(tensor)
      3     image = image.numpy().squeeze()
      4     image = image.transpose(1, 2, 0)
----> 5     image *= np.array((0.22, 0.22, 0.22))+ np.array((0.44, 0.44, 0.44))
      6     image = image.clip(0, 1)
      7     return image
ValueError: operands could not be broadcast together with shapes (50,50,512) (3,) (50,50,512) 

这是我在传递到CNN层之前应用于图像的初始转换,

def transformation(img):
    tasks = tf.Compose([tf.Resize(400), tf.ToTensor(),
            tf.Normalize((0.44,0.44,0.44),(0.22,0.22,0.22))])
    img = tasks(img)[:3,:,:].unsqueeze(0)    
    return img

我该如何解决?有其他方法可以从卷积层重建图像吗?

您的tensor_to_image方法仅适用于3个频道图像。您对网络的输入是3个通道,最终输出也是如此,因此在那里工作正常。但是您不能在内部高维激活下进行相同的操作。

本质上,问题是您尝试应用一个通渠道的归一化,但是您只有三个频道的参数,这就是为什么该特定行失败的原因。您需要一个512元素向量和标准偏差的元素向量。因此,例如这将有效:

image *= np.random.random([512]) + np.random.random([512])

但是,基本问题仍然是您尝试可视化高维512通道图像,而不是传统的3通道(RGB)图像。您可以尝试单独可视化频道,或者以3个组的形式可视化,但仍然没有真正有用的。

相关内容

  • 没有找到相关文章

最新更新