Оптимизация гиперпараметров с помощью grid_search в keras и flow_from_directory - PullRequest
1 голос
/ 06 апреля 2019

Я пытался оптимизировать гиперпараметры в моих кератах, созданных CNN для классификации изображений. Я решил использовать поиск по сетке от sklearn. Я преодолел фундаментальные трудности с созданием x и y из keras flow_from_directory, но он все еще не работает. Ошибка в последней строке ValueError: dropout is not a legal parameter

def grid_model(optimizer='adam',
                     kernel_initializer='random_uniform', 
                     dropout=0.2,
                    loss='categorical_crossentropy'):

    model = Sequential()

    model.add(Conv2D(6,(5,5),activation="relu",padding="same",
                     input_shape=(img_width, img_height, 3)))
    model.add(MaxPooling2D((2,2)))
    model.add(Dropout(dropout))

    model.add(Conv2D(16,(5,5),activation="relu"))
    model.add(MaxPooling2D((2,2)))
    model.add(Dropout(dropout))

    model.add(Flatten())

    model.add(Dense(120, activation='relu', kernel_initializer=kernel_initializer))
    model.add(Dropout(dropout))
    model.add(Dense(84, activation='relu', kernel_initializer=kernel_initializer))
    model.add(Dropout(dropout))
    model.add(Dense(10, activation='softmax'))

    model.compile(loss=loss,
                optimizer=optimizer,
                metrics=['accuracy'])
    return model

train_generator = ImageDataGenerator(rescale=1/255)

validation_generator = ImageDataGenerator(rescale=1/255)

# Retrieve images and their classes for train and validation sets
train_flow = train_generator.flow_from_directory(directory=train_data_dir, 
                                                 batch_size=batch_size, 
                                                 target_size=(img_height,img_width))

validation_flow = validation_generator.flow_from_directory(directory=validation_data_dir, 
                                                           batch_size=batch_size,
                                                           target_size=(img_height,img_width),
                                                            shuffle = False)

clf = KerasClassifier(build_fn=grid_model(), epochs=epochs, verbose=0)

param_grid = {
    'clf__optimizer':['adam', 'Nadam'],
    'clf__epochs':[100, 200],
    'clf__dropout':[0.1, 0.2, 0.5],
    'clf__kernel_initializer':['normal','uniform'],
    'clf__loss':['categorical_crossentropy', 
                     'sparse_categorical_crossentropy', 
                     'kullback_leibler_divergence']
}

pipeline = Pipeline([('clf',clf)])

(X_train, Y_train) = train_flow.next()

grid = GridSearchCV(pipeline, cv=2, param_grid=param_grid)
grid.fit(X_train, Y_train)

1 Ответ

1 голос
/ 08 апреля 2019

Проблема в этой строке:

clf = KerasClassifier(build_fn=grid_model(), epochs=epochs, verbose=0)

изменить его на

clf = KerasClassifier(build_fn=grid_model, epochs=epochs, verbose=0)

Метод grid_model не должен вызываться, но должна быть передана ссылка на него.

Кроме того, в списке потерь «sparse_categorical_crossentropy» (целое число) нельзя использовать, поскольку требуемая форма вывода модели несовместима с формой «categoryor_crossentropy» («горячая»).

...