ValueError: операнды не могут передаваться вместе с фигурами (50,50,512) (3,) (50,50,512) при преобразовании тензора в изображение в pytorch - PullRequest
1 голос
/ 21 марта 2019

Я делаю перевод в нейронном стиле.Я пытаюсь восстановить вывод сверточного слоя conv4_2 сети VGG19.

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 - это диктовка, которая содержит выходные данные каждого слоя.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

Как это исправить?Есть ли другой способ восстановить изображение из слоя свертки?

1 Ответ

0 голосов
/ 21 марта 2019

Ваш метод tensor_to_image работает только для 3-канальных изображений.Ваш вход в сеть состоит из 3 каналов, так что окончательный вывод, поэтому он работает нормально.Но вы не можете сделать то же самое при внутренней многомерной активации.

По сути, проблема в том, что вы пытаетесь применить канальную нормализацию, но у вас есть параметры только для трех каналов, поэтому эта конкретная линия дает сбой.Вам понадобится 512 элементов вектора средних и стандартных отклонений.Так, например, это будет работать:

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

Однако фундаментальная проблема по-прежнему заключается в том, что вы пытаетесь визуализировать 512-канальное изображение большого размера вместо традиционного 3-канального (RGB) изображения.Вы можете попытаться визуализировать каналы отдельно или группами по 3, но все же это может быть не очень полезно.

...