Как использовать hyperopt для настройки параметров и расчета потерь в тенорных керах? - PullRequest
1 голос
/ 24 июня 2019

Я новичок в углубленном изучении. Я искал способ настройки параметров для моей модели MNIST tensorflow-keras, и я натолкнулся на hyperopt, но это кажется немного сложным для понимания.

Пройдя несколько ядер в kaggle, этот код, приведенный ниже, я собрал, чтобы попробовать.

import tensorflow as tf
from tensorflow.keras.layers import Dense, BatchNormalization, Dropout
from tensorflow.keras.models import Sequential
from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping
from hyperopt import space_eval, Trials, hp, fmin, STATUS_OK, tpe

mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()

x_train = np.reshape(x_train, (x_train.shape[0], 784)) / 255.0
x_test  = np.reshape(x_test, (x_test.shape[0], 784)) / 255.0

y_train = tf.keras.utils.to_categorical(y_train, 10)
y_test  = tf.keras.utils.to_categorical(y_test, 10)

space = {
    'dense_units': hp.choice('Dense Units', [512, 256, 128, 64, 32]),
    'dropout_p': hp.choice('Dropout Percentage', np.arange(0., 1., .1)),
    'activations': hp.choice('Activations', ['relu', 'sigmoid']),
    'kernel_init': hp.choice('Kernal Init', ['glorot_uniform', 'glorot_normal', 
                                             'he_normal', 'he_uniform']),
    'optimizers': hp.choice('Optimizers', ['Adam', 'RMSprop', 'SGD']),
    'batch_size': hp.choice('Batch Size', [16, 32, 64, 128, 256])
}

def objective(params, epochs=100, verbose=1):
    # architecture
    model = Sequential([
        # layer1
        Dense(params['dense_units'], activation= params['activations'], 
              input_shape=(784,), 
              kernel_initializer= params['kernel_init']),
        BatchNormalization(),
        Dropout(params['dropout_p']),
        # layer2
        Dense(params['dense_units'], activation= params['activations'], 
              kernel_initializer= params['kernel_init']),
        BatchNormalization(),
        Dropout(params['dropout_p']),
        # layer3
        Dense(params['dense_units'], activation= params['activations'], 
              kernel_initializer= params['kernel_init']),
        BatchNormalization(),
        Dropout(params['dropout_p']),
        #output    
        Dense(10, activation='softmax')])

    # model compilation
    model.compile(loss='categorical_crossentropy', metrics=['accuracy'], 
                  optimizer=params['optimizers'])
    # callbacks
    e = EarlyStopping(monitor='val_loss', patience=10, mode='min', verbose=verbose)
    m = ModelCheckpoint('best_weights.hdf5', monitor='val_loss', save_best_only=True, 
                         mode='min', verbose=verbose)    
    # fitting the model
    result = model.fit(x_train, y_train, batch_size=params['batch_size'], epochs=epochs,
                       verbose=verbose, validation_split=0.2, callbacks=[e, m])
    # loss
    val_loss = np.amin(result.history['val_loss'])
    return {'loss': val_loss, 'status': STATUS_OK, 'model': model}

result = fmin(objective, space, algo=tpe.suggest, trials=Trials(), max_evals=5)

Я просто хочу знать, правильно ли я рассчитываю потери и все в целевой функции? Есть ли что-то, что я мог бы улучшить здесь?

Также возможно ли посмотреть, какие параметры настраиваются?

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