向Keras网络发送多个输入时出错

时间:2018-08-21 09:56:33

标签: python keras deep-learning keras-layer

我正在尝试构建一个包含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)

1 个答案:

答案 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=...   
 ...
)