将vgg19层的输出显示为图像

时间:2018-11-22 19:16:19

标签: python tensorflow keras conv-neural-network vgg-net

我正在阅读这篇论文:Neural Style Transfer。在本文中,作者从vgg19层的输出中重建图像。我正在使用Keras。 block1_conv1层的输出大小为(1, 400, 533, 64)。这里1是输入的图像数,400是行数,533列数和64通道数。当我尝试将其重建为图像时,由于图像大小为13644800(不是3的倍数)而出现错误,因此无法在三个通道中显示图像。如何重建这张图片?

我想从图层中重建图像,如下所示: image reconstruction from vgg layers 下面是相同的代码:

from keras.preprocessing.image import load_img, img_to_array
from scipy.misc import imsave
import numpy as np
from keras.applications import vgg19
from keras import backend as K

CONTENT_IMAGE_FN = store image as input here

def preprocess_image(image_path):
    img = load_img(image_path, target_size=(img_nrows, img_ncols))
    img = img_to_array(img)
    img = np.expand_dims(img, axis=0)
    img = vgg19.preprocess_input(img)
    return img

width, height = load_img(CONTENT_IMAGE_FN).size
img_nrows = 400
img_ncols = int(width * img_nrows / height)
base_image = K.variable(preprocess_image(CONTENT_IMAGE_FN))

RESULT_DIR = "generated/"
RESULT_PREFIX = RESULT_DIR + "gen"
if not os.path.exists(RESULT_DIR):
  os.makedirs(RESULT_DIR)
result_prefix = RESULT_PREFIX

# this will contain our generated image
if K.image_data_format() == 'channels_first':
    combination_image = K.placeholder((1, 3, img_nrows, img_ncols))
else:
    combination_image = K.placeholder((1, img_nrows, img_ncols, 3))

x = preprocess_image(CONTENT_IMAGE_FN)

outputs_dict = dict([(layer.name, layer.output) for layer in model.layers])
feature_layers = ['block1_conv1', 'block2_conv1',
                  'block3_conv1', 'block4_conv1',
                  'block5_conv1']
outputs = []
for layer_name in feature_layers:
  outputs.append(outputs_dict[layer_name])
functor = K.function([combination_image], outputs )   # evaluation function

# Testing
test = x
layer_outs = functor([test])
print(layer_outs)

layer_outs[0].reshape(400, -1 , 3) //getting error here

我遇到以下错误:

ValueError: cannot reshape array of size 13644800 into shape (400,newaxis,3)

1 个答案:

答案 0 :(得分:0)

您写道:

  

block1_conv1层的输出大小为(1, 400, 533, 64。这里1   是输入的图像数,400是行数,533是   列和64个通道数”   但这是不正确的。 block1_conv1输出对应1个通道尺寸(第一个通道),400 * 533个图像尺寸和64个过滤器

当您尝试将具有1通道(400 * 533 * 64 = 13644800)的图像输入的VGG19输出的向量整形为对应的向量时,会发生错误到3通道输出。

此外,您还必须传递 3个频道输入:

通过 VGG19 代码:

  

input_shape:可选形状元组,仅可指定               如果include_top为False(否则输入形状               必须为(224, 224, 3)               (采用channels_last数据格式)               或(3, 224, 224)(具有channels_first数据格式)。               它应该有3个输入通道,               宽度和高度不应小于32。               例如。 (200, 200, 3)是一个有效值。

因此,您输入的图像必须为3个通道。如果您甚至想将1个通道(灰度)图像馈送到VGG19,并且如果channels first,则应进行以下操作:

X = np.repeat(X, 3 , axis=0) 

X = np.repeat(X, 3 , axis=2) 

如果channels last 没有批次尺寸

X = np.repeat(X, 3 , axis=3) 

具有批次尺寸

如果您提供有关图像输入矩阵的实际尺寸及其类型(灰度,RGB)的更多信息,我会在需要时为您提供更多帮助。