с validation_split я получил ошибку, когда натренировал его: список массивов, которые передавались в модель с неправильным размером - PullRequest
0 голосов
/ 13 июня 2019

Я получил следующую ошибку, когда попытался обучить модель в керасе.

ValueError: Ошибка при проверке ввода модели: список массивов Numpy, передаваемых в вашу модель, не соответствует размеру, ожидаемому моделью. Ожидается увидеть 5 массивов, но вместо этого получит следующий список из 1 массивов:

Это форма ввода:

 x_train shape: (231, 244, 1) | y_train shape: (231, 2)
 x_test shape : (432, 244, 1) | y_test shape : (432, 2)
 x_train_1: (231, 61, 1)
 x_train_2: (231, 61, 1)
 x_train_3: (231, 61, 1)
 x_train_4: (231, 61, 1)

Это моя модель:

def input_part(x_train):
    input_shape = x_train[0,:,:].shape
    model_input = Input(shape=input_shape)
    return model_input


def conv_pool(model_input: Tensor) -> training.Model:
    # 3 covs + 1 ave_pool + 3 covs + 1 ave_pool + flatten
    global_x = Dense(128, activation='relu')(x)
    return global_x


def cnn_p1(model_input: Tensor) -> training.Model:
    # 3 covs + 1 ave_pool + 3 covs + 1 ave_pool + flatten
    cnnpart_1 = Dense(128, activation='relu')(x)
    return cnnpart_1


def cnn_p2(model_input: Tensor) -> training.Model:
    # 3 covs + 1 ave_pool + 3 covs + 1 ave_pool + flatten
    cnnpart_2 = Dense(128, activation='relu')(x)
    return cnnpart_2


def cnn_p3(model_input: Tensor) -> training.Model:
    # 3 covs + 1 ave_pool + 3 covs + 1 ave_pool + flatten
    cnnpart_3 = Dense(128, activation='relu')(x)
    return cnnpart_3


def cnn_p4(model_input: Tensor) -> training.Model:
    # 3 covs + 1 ave_pool + 3 covs + 1 ave_pool + flatten
    cnnpart_4 = Dense(128, activation='relu')(x)
    return cnnpart_4


def ensemble(x_train):
    x_train_1, x_train_2, x_train_3, x_train_4 = np.split(x_train, 4, axis=1)

    model_input = input_part(x_train)
    model_input_1 = input_part(x_train_1)
    model_input_2 = input_part(x_train_2)
    model_input_3 = input_part(x_train_3)
    model_input_4 = input_part(x_train_4)


    conv_pool_model = conv_pool(model_input)
    cnn_p1_model = cnn_p1(model_input_1)
    cnn_p2_model = cnn_p1(model_input_2)
    cnn_p3_model = cnn_p1(model_input_3)
    cnn_p4_model = cnn_p1(model_input_4)

    conca = Concatenate(axis=0)([conv_pool_model, cnn_p1_model, cnn_p2_model, cnn_p3_model, cnn_p4_model])
    x = Dropout(0.5)(conca)
    x = Dense(2, activation='softmax')(x)
    model = Model(inputs = [model_input, model_input_1, model_input_2, model_input_3, model_input_4], outputs=x, name='conv_pool_cnn')
    return model

Для обучения

def compile_and_train(model:training.Model, num_epochs: int, x_train, y_train) -> Tuple[History, str]:
    sgd = SGD(lr=0.0001, decay=1e-6, momentum=0.9, nesterov=True)
    model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])
    checkpoint = ModelCheckpoint(filepath, monitor='loss', verbose=0, save_weights_only=True,
                             save_best_only=True, mode='auto', period=1)
    tensor_board = TensorBoard(log_dir='global2/', histogram_freq=0, batch_size=10)
    history = model.fit(x=x_train, y=y_train, batch_size=10, epochs=num_epochs, verbose=1,
                    callbacks=[checkpoint, tensor_board],
                    validation_split=0.2, shuffle=True)
    weight_files = glob.glob(os.path.join(os.getcwd(), 'global/*'))
    weight_file = max(weight_files, key=os.path.getctime)
    return history, weight_file

Где это имеет ошибку выше:

history = model.fit(x=x_train, y=y_train, batch_size=10, epochs=num_epochs, verbose=1,
                    callbacks=[checkpoint, tensor_board],
                    validation_split=0.2, shuffle=True)

Я получаю эту ошибку:

Traceback (most recent call last):

File "D:/Users/11825/source/repos/mutil cnn/ensembling_CNN.py", line 191, in <module>
history, cnn_weight_file = compile_and_train(cnn_pool_model, NUM_EPOCHS, x_train, y_train)  

File "D:/Users/11825/source/repos/mutil cnn/ensembling_CNN.py", line 156, in compile_and_train
validation_split=0.2, shuffle=True)

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 5 array(s), but instead got the following list of 1 arrays: 

Ответы [ 2 ]

0 голосов
/ 13 июня 2019

Поскольку вы используете несколько входов в вашей модели, вы должны представить свой вход в виде списка, который содержит различные части ваших данных. Вы можете изменить свой код в compile_and_train следующим образом, просто добавьте строку перед model.fit.

new_x_train = [x_train[i,:,:] for i in 5]
history = model.fit(x=new_x_train, y=y_train, batch_size=10, epochs=num_epochs, 
                verbose=1,
                callbacks=[checkpoint, tensor_board],
                validation_split=0.2, shuffle=True)
0 голосов
/ 13 июня 2019

Так как вы определили 4 входа в модели.Вам нужно предоставить список из 4 входных данных из x в методе подгонки.Путь может быть

model.fit(x=[x_train_1, x_train_2, x_train_3, x_train_4], ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...