我正在尝试构建一个包含3个输入(图像)和1个输出边界框(x0,y0,x1,y1)的网络。该网络由3个VGG16网络组成,并连接为一层,并与4个完全连接的层相连。但是,当我尝试将输入发送到网络时,会产生以下错误:
ValueError: Error when checking model input: the list of Numpy arrays that
you are passing to your model is not the size the model expected. Expected
to see 3 array(s), but instead got the following list of 2 arrays:
但是我正在向网络发送正确数量的输入。在这里需要建议!谢谢你。
代码:构建网络
vgg_conv_1 = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
vgg_conv_2 = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
vgg_conv_3 = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
merged_layer = Concatenate(axis = 3)([vgg_conv_1.output, vgg_conv_2.output, vgg_conv_3.output])
merged_layer = Flatten()(merged_layer)
merged_layer = Dense(units = 1024, activation = "relu")(merged_layer)
merged_layer = Dense(units = 1024, activation = "relu")(merged_layer)
merged_layer = Dense(units = 1024, activation = "relu")(merged_layer)
merged_layer = BatchNormalization()(merged_layer)
merged_layer = Dropout(0.25)(merged_layer)
merged_layer = Dense(units = 4, activation = "sigmoid")(merged_layer)
newModel = Model([vgg_conv_1.input, vgg_conv_2.input, vgg_conv_3.input], merged_layer)
newModel.compile(optimizer = "sgd", loss = l2loss, metrics = ["accuracy"])
代码:加载数据(训练和验证集),标签=(x0,y0,x1,y1)
training_set_1 = []
training_set_2 = []
training_set_3 = []
train_labels = []
with open("train.txt") as f:
for line in f:
lines = line.rstrip("\n")
line_split = lines.split(",")
try:
training_1 = tf.keras.preprocessing.image.load_img(line_split[0], target_size = (224, 224))
x = tf.keras.preprocessing.image.img_to_array(training_1)
x = preprocess(x)
training_set_1.append(x)
training_2 = tf.keras.preprocessing.image.load_img(line_split[1], target_size = (224, 224))
x = tf.keras.preprocessing.image.img_to_array(training_2)
x = preprocess(x)
training_set_2.append(x)
training_3 = tf.keras.preprocessing.image.load_img(line_split[2], target_size = (224, 224))
x = tf.keras.preprocessing.image.img_to_array(training_3)
x = preprocess(x)
training_set_3.append(x)
train_labels.append(np.array([line_split[3],line_split[4],
line_split[5],line_split[6] ]))
except:
pass
代码:培训
traingen = ImageDataGenerator(fill_mode="constant")
valgen = ImageDataGenerator(fill_mode="constant")
newModel.fit_generator( traingen.flow(x = [ np.array(training_set_1),np.array(training_set_2), np.array(training_set_3) ],
y = np.array(train_labels), batch_size = 16),
steps_per_epoch = 8000,
epochs = 10,
validation_data = valgen.flow(x = [ np.array(test_set_1), np.array(test_set_2), np.array(test_set_3) ], y = np.array(test_labels)),
validation_steps = 2000)
答案 0 :(得分:0)
您应该查看ImageDataGenerator
的文档,尤其是其flow(...)
方法的文档。它说
x:输入数据。 Numpy数组,等级4或元组。如果是元组,则第一个 元素应包含图片,第二个元素应包含另一个numpy 数组或numpy数组的列表,这些列表将传递给输出而无需 任何修改。
这意味着x
参数只能是2
项的列表/元组,而不能是3
。如果您想传递3
个项目,则必须这样做:
traingen.flow(
x=(np.array(training_set_1), [np.array(training_set_2), np.array(training_set_3)]),
y=...
...
)