首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >预输入层到预训练模型

预输入层到预训练模型
EN

Data Science用户
提问于 2017-07-22 03:16:08
回答 1查看 6.4K关注 0票数 8

我正在尝试将形状(1036800 )--最初的形状图像(480,720,3) --输入到经过预先训练的VGG16模型中,以预测连续值。

我尝试了以下几种代码的变体:

代码语言:javascript
复制
input = Input(shape=(1036800,), name='image_input')
initial_model = VGG16(weights='imagenet', include_top=False)
x = Flatten()(initial_model(input).output)
x = Dense(200, activation='relu')(x)
x = Dense(1)(x)
model = Model(inputs=input, outputs=x)

上述代码的先前变体产生了与输入相关的错误,即错误的维度,input_shape需要有3个通道(在VGG16初始化时使用(1036800 )该参数),运行上述代码导致的最新错误如下:

代码语言:javascript
复制
Traceback (most recent call last):
  File "model_alex.py", line 57, in <module>
    model = initialize_model()
  File "model_alex.py", line 20, in initialize_model
    x = Flatten()(initial_model(input).output)
  File "/home/aicg2/.local/lib/python2.7/site-packages/keras/engine/topology.py", line 596, in __call__
    output = self.call(inputs, **kwargs)
  File "/home/aicg2/.local/lib/python2.7/site-packages/keras/engine/topology.py", line 2061, in call
    output_tensors, _, _ = self.run_internal_graph(inputs, masks)
  File "/home/aicg2/.local/lib/python2.7/site-packages/keras/engine/topology.py", line 2212, in run_internal_graph
    output_tensors = _to_list(layer.call(computed_tensor, **kwargs))
  File "/home/aicg2/.local/lib/python2.7/site-packages/keras/layers/convolutional.py", line 164, in call
    dilation_rate=self.dilation_rate)
  File "/home/aicg2/.local/lib/python2.7/site-packages/keras/backend/tensorflow_backend.py", line 3156, in conv2d
    data_format='NHWC')
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/nn_ops.py", line 639, in convolution
    input_channels_dim = input.get_shape()[num_spatial_dims + 1]
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/tensor_shape.py", line 500, in __getitem__
    return self._dims[key]
IndexError: list index out of range

这是全码。下面是脚本中使用的样本数据文件

解决这一问题的可能方法之一是将原始图像文件的大小调整为224x224,并将它们转换为形状为numpy的数组(224、224、3),以便将它们插入经过预先训练的模型的第一层。然而,我不想扭曲图像或浪费另一个晚上的预处理数据,而我应该已经在训练。

除此之外,我所能做的就是谷歌我的问题,试着去适应找到的解决方案,或者毫无目标地调整各种形状相关的参数和功能--在过去的4小时里,这两种方法都没有给我带来多大的帮助。

EN

回答 1

Data Science用户

回答已采纳

发布于 2017-07-22 11:11:07

问题是,您不应该将图像压平成一维矢量,因为VGG16包含2D卷积层(例如,图像上的空间卷积),这需要输入具有(number_of_images, image_height, image_width, image_channels)形状,因为keras.backend.image_data_format()返回'channels_last'。如果您的image_data_format'channels_first',则将输入数据形状更改为(number_of_images, image_channels, image_height, image_width)

下面是您的固定代码(用Keras2.0.4测试):

代码语言:javascript
复制
x_train = x_train.reshape((x_train.shape[0], 480, 720, 3))
x_test = x_test.reshape((x_test.shape[0], 480, 720, 3))

initial_model = VGG16(weights='imagenet', include_top=False)
input = Input(shape=(480, 720, 3), name='image_input')
x = Flatten()(initial_model(input))
x = Dense(200, activation='relu')(x)
x = BatchNormalization()(x)
x = Dropout(0.5)(x)
x = Dense(1)(x)
model = Model(inputs=input, outputs=x)
model.compile(loss='mse', optimizer='adam')

model.fit(x_train, y_train, epochs=20, batch_size=16)
score = model.evaluate(x_test, y_test, batch_size=16)
票数 5
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/21610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档