Функциональный API Keras: «Ошибка при проверке ввода: ожидалось, что input_1 будет иметь 4 измерения, но получил массив с формой (X, Y)» - PullRequest
1 голос
/ 30 октября 2019

Я пытаюсь подогнать модель ConvNet с помощью генератора подгонки Keras, но он не работает при попытке передать данные на входной слой. Он говорит мне, что ожидает трехмерного ввода, но мой ввод только два. Если я добавлю канал в мою форму ввода, он запросит четыре измерения.

Вот точная ошибка, когда я не добавляю параметр канала:

ValueError: Error when checking input: expected input_1 to have 3 dimensions, but got array with shape (1000, 597)

И снова, когда я изменяю форму ввода на (1000, 597, 1):

ValueError: Error when checking input: expected input_1 to have 4 dimensions, but got array with shape (1000, 597)

Вот код для моей модели:

def initialise_model():
    input_layer = Input((1, 1000, 597))
    conv_layer_1 = Conv2D(filters=30, kernel_size=(10, 1), strides=(1, 1), padding="same", activation="relu")(input_layer)
    conv_layer_2 = Conv2D(filters=30, kernel_size=(8, 1), strides=(8, 1), padding="same", activation="relu")(conv_layer_1)
    conv_layer_3 = Conv2D(filters=40, kernel_size=(6, 1), strides=(6, 1), padding="same", activation="relu")(conv_layer_2)
    conv_layer_4 = Conv2D(filters=50, kernel_size=(5, 1), strides=(1, 1), padding="same", activation="relu")(conv_layer_3)
    conv_layer_5 = Conv2D(filters=50, kernel_size=(5, 1), strides=(1, 1), padding="same", activation="relu")(conv_layer_4)
    flatten_layer = Flatten()(conv_layer_5)
    dense_layer = Dense(1024, activation="relu")(flatten_layer)
    label_layer = Dense(1024, activation="relu")(dense_layer)
    output_layer = Dense(1, activation="linear")(label_layer)

    model = Model(inputs=input_layer, outputs=output_layer)

    adam_optimiser = keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08)
    model.compile(optimizer=adam_optimiser, loss="mean_squared_error", metrics=["accuracy", "mean_squared_error"])
    return model

И мой генератор подгонки:

model = initialise_model()
early_stopping = EarlyStopping(monitor="val_loss", min_delta=0, patience=0, verbose=1, restore_best_weights=True)
model.fit_generator(generator, epochs=1, steps_per_epoch=1, verbose=2, callbacks=[early_stopping])

Стоит отметить, что выходная мощность моего генератора соответствует ожидаемой, справильной формы.

Большое спасибо

Ответы [ 3 ]

1 голос
/ 30 октября 2019

установите наш входной слой как

input_layer = Input((1, 1000, 597))

или если каналы настроены на последний

input_layer = Input((1000, 597, 1))

и убедитесь, что ваш генератор выдает данные x_train формы

(batch_size, 1, 1000, 597)

или

(batch_size, 1000, 597, 1)
0 голосов
/ 30 октября 2019

слой conv2D по умолчанию имеет data_format = "channels_last", если вы хотите использовать изображение, имеющее форму (1, 1000, 597), тогда вам нужно установить data_format = "channels_first" или изменить входной тусклый на (1000, 597, 1)

0 голосов
/ 30 октября 2019

Посмотрите документацию Keras для сверточных слоев. Форма ввода должна быть (batch, channels, rows, cols) для двумерных сверток. Это означает, что вам нужно передать (channels, rows, cols) вашему слою Input. На самом деле, насколько я могу судить, нет необходимости в изменении слоя.

Каковы размеры ваших изображений? Я предполагаю, что вы хотите передавать изображения, так как вы используете двумерные свертки, но это выглядит немного больше, как будто вы пытаетесь передать векторы.

Ваша потеря - это MSE, что нормально, но ваша метрика - точность. Почему?

...