【问题标题】:Error sending multiple input to keras network向 keras 网络发送多个输入时出错
【发布时间】:2019-01-27 11:46:29
【问题描述】:

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

【问题讨论】:

    标签: python keras deep-learning keras-layer


    【解决方案1】:

    您应该查看ImageDataGenerator 的文档,尤其是它的flow(...) 方法。它说

    x:输入数据。等级为 4 的 Numpy 数组或元组。如果是元组,第一个 元素应包含图像,第二个元素应包含另一个 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=...   
     ...
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-22
      • 2021-03-04
      • 2018-04-08
      • 1970-01-01
      • 2017-08-02
      • 2018-09-18
      • 2017-01-06
      • 2020-03-16
      相关资源
      最近更新 更多