输入0与flatten_2层不兼容:期望的最小维数为3,但实际维数为2。

4
我有一个Keras模型,其中我试图将图像输入与数字值的特征向量进行合并,但出现以下错误:

ValueError: 输入0与层flatten_2不兼容:期望min_ndim=3,但发现ndim=2

该错误发生在以下语句上:

value_model.add(Flatten(input_shape=(12,)))

你有什么解决办法吗?
image_input = Input((512, 512, 1))
vector_input = Input((12,))

image_model = Sequential()
image_model.add(Convolution2D(32,8,8, subsample=(4,4), input_shape=(512,512,1)))
image_model.add(Activation('relu'))
image_model.add(Convolution2D(64,4,4, subsample=(2,2)))
image_model.add(Activation('relu'))
image_model.add(Convolution2D(64,3,3, subsample=(1,1)))
image_model.add(Activation('relu'))
image_model.add(Flatten())
image_model.add(Dense(512))
image_model.add(Activation('relu'))

value_model = Sequential()
value_model.add(Flatten(input_shape=(12,)))
value_model.add(Dense(16))
value_model.add(Activation('relu'))
value_model.add(Dense(16))
value_model.add(Activation('relu'))
value_model.add(Dense(16))
value_model.add(Activation('relu'))

merged = Concatenate([image_model, value_model])

final_model = Sequential()
final_model.add(merged)
final_model.add(Dense(1, activation='sigmoid'))

model = Model(inputs=[image_input, vector_input], outputs=output)
model.compile(loss='binary_crossentropy', optimizer='adam',metrics=['acc'])
model.fit([images, features], y, epochs=5)

编辑-1

这是完整的脚本:

from keras.layers import Input, Concatenate, Conv2D, Flatten, Dense, Convolution2D, Activation
from keras.models import Model, Sequential
import pandas as pd
import numpy as np
import cv2
import os

def label_img(img):
    word_label = img.split('.')[-3]
    if word_label == 'r':
        return 1
    elif word_label == 'i':
        return 0

train_directory = '/train'
images = []
y = []

dataset = pd.read_csv('results.csv')

dataset = dataset[[ 'first_value',
                    'second_value']]

features = dataset.iloc[:,0:12].values

for root, dirs, files in os.walk(train_directory):
    for file in files:
        image = cv2.imread(root + '/' + file)
        image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        image = cv2.resize(image,(512,512),interpolation=cv2.INTER_AREA)
        image = image/255
        images.append(image)
        label = label_img(file)
        y.append(label)

images = np.asarray(images)
images = images.reshape((-1,512,512,1))

image_input = Input((512, 512, 1))
vector_input = Input((12,))

image_model = Sequential()
image_model.add(Convolution2D(32,8,8, subsample=(4,4), input_shape=(512,512,1)))
image_model.add(Activation('relu'))
image_model.add(Convolution2D(64,4,4, subsample=(2,2)))
image_model.add(Activation('relu'))
image_model.add(Convolution2D(64,3,3, subsample=(1,1)))
image_model.add(Activation('relu'))
image_model.add(Flatten())
image_model.add(Dense(512))
image_model.add(Activation('relu'))

value_model = Sequential()
#value_model.add(Flatten(input_shape=(12,)))
value_model.add(Dense(16))
value_model.add(Activation('relu'))
value_model.add(Dense(16))
value_model.add(Activation('relu'))
value_model.add(Dense(16))
value_model.add(Activation('relu'))

merged = Concatenate([image_model, value_model])

final_model = Sequential()
final_model.add(merged)
final_model.add(Dense(1, activation='sigmoid'))

model = Model(inputs=[image_input, vector_input], outputs=output)
model.compile(loss='binary_crossentropy', optimizer='adam',metrics=['acc'])
model.fit([images, features], y, epochs=5)

编辑-2

当我执行以下操作时:

output = final_model.add(Dense(1, activation='sigmoid'))

我仍然收到了相同的错误。

1
为什么这里需要展平?如果您的输入是(12,),那么它已经被展平了。展平的目的是将输入特征展平成一个单维特征向量。 - Luke DeLuccia
@gorjan 感谢您的回复。是的,输出应该是“0”或“1”。 - Simplicity
你能提供输出吗?也就是说,你能提供指定输出的代码部分,这样我就可以重现你所遇到的所有错误吗? - gorjan
@gorjan 当然,我已经在 EDIT 下列出了完整的脚本。 - Simplicity
我还有点困惑,在这一行代码中:model = Model(inputs=[image_input, vector_input], outputs=output),输出变量output在代码中从未被定义? - gorjan
显示剩余4条评论
1个回答

5
您可以根据以下示例更改您的代码以反映新的Keras 2 API。在您的代码中,您正在尝试旧的keras API和Keras 2 API的混合方法。
我还建议在使用Keras 2 API时使用新的Conv2D层,而不是Convolution2D层。在Conv2D中,“subsample”参数现在称为“strides”。
image_input = Input((512, 512, 1))
vector_input = Input((12,))

image_model = Conv2D(32,(8,8), strides=(4,4))(image_input)
image_model = Activation('relu')(image_model)
image_model = Conv2D(64,(4,4), strides=(2,2))(image_model)
image_model = Activation('relu')(image_model)
image_model = Conv2D(64,(3,3), strides=(1,1))(image_model)
image_model = Activation('relu')(image_model)
image_model = Flatten()(image_model)
image_model = Dense(512)(image_model)
image_model = Activation('relu')(image_model)

value_model = Dense(16)(vector_input)
value_model = Activation('relu')(value_model)
value_model = Dense(16)(value_model)
value_model = Activation('relu')(value_model)
value_model = Dense(16)(value_model)
value_model = Activation('relu')(value_model)

merged = concatenate([image_model, value_model])

output = Dense(1, activation='sigmoid')(merged)

model = Model(inputs=[image_input, vector_input], outputs=output)

model.compile(loss='binary_crossentropy', optimizer='adam')

考虑一个小数据集,
I = np.random.rand(100, 512, 512, 1)
V = np.random.rand(100, 12, )

y = np.random.rand(100, 1, )

培训,

model.fit([I, V], y, epochs=10, verbose=1)


Epoch 1/10
100/100 [==============================] - 9s 85ms/step - loss: 3.4615
Epoch 2/10
 32/100 [========>.....................] - ETA: 4s - loss: 0.9696

您能否看一下这个链接中的内容? - bit_scientist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接