Оптимизация гиперпараметров в CNN - PullRequest
0 голосов
/ 17 апреля 2020

РЕДАКТИРОВАТЬ: я скорректировал модель, как предложено. Это означает, что я включил lr и dropout в качестве аргументов в функцию Con vNet.

Я новичок в нейронных сетях и CNN и столкнулся с проблемой, касающейся Оптимизация гиперпараметров . Итак, теперь я объясню свой процесс до сих пор: с помощью различных отличных постов в блоге я смог создать CNN, который работает для моего проекта. В моем проекте я пытаюсь предсказать VIX и S & P 500 с помощью отчетов о заседаниях FOM C. Таким образом, в основном я имею текстовые данные с одной стороны и финансовые данные (возвраты) с другой стороны. После предварительной обработки и применения предварительно обученных встраиваний Word Googles Word2Ve c я построил следующую сверточную сеть:

def ConvNet(embeddings, max_sequence_length, num_words, embedding_dim, trainable=False, extra_conv=True,
            lr=0.001, dropout=0.5):
    embedding_layer = Embedding(num_words,
                                embedding_dim,
                                weights=[embeddings],
                                input_length=max_sequence_length,
                                trainable=trainable)

    sequence_input = Input(shape=(max_sequence_length,), dtype='int32')
    embedded_sequences = embedding_layer(sequence_input)

    convs = []
    filter_sizes = [3, 4, 5]

    for filter_size in filter_sizes:
        l_conv = Conv1D(filters=128, kernel_size=filter_size, activation='relu')(embedded_sequences)
        l_pool = MaxPooling1D(pool_size=3)(l_conv)
        convs.append(l_pool)

    l_merge = concatenate([convs[0], convs[1], convs[2]], axis=1)

    # add a 1D convnet with global maxpooling, instead of Yoon Kim model
    conv = Conv1D(filters=128, kernel_size=3, activation='relu')(embedded_sequences)
    pool = MaxPooling1D(pool_size=3)(conv)

    if extra_conv == True:
        x = Dropout(dropout)(l_merge)
    else:
        # Original Yoon Kim model
        x = Dropout(dropout)(pool)
    x = Flatten()(x)
    x = Dense(128, activation='relu')(x)
    preds = Dense(1, activation='linear')(x)

    model = Model(sequence_input, preds)
    sgd = SGD(learning_rate = lr, momentum= 0.8)
    model.compile(loss='mean_squared_error',
                  optimizer= sgd,
                  metrics=['mean_squared_error'])
    model.summary()
    return model

Моя архитектура модели выглядит следующим образом:

__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_1 (InputLayer)            (None, 1086)         0                                            
__________________________________________________________________________________________________
embedding_1 (Embedding)         (None, 1086, 300)    532500      input_1[0][0]                    
__________________________________________________________________________________________________
conv1d_1 (Conv1D)               (None, 1084, 128)    115328      embedding_1[0][0]                
__________________________________________________________________________________________________
conv1d_2 (Conv1D)               (None, 1083, 128)    153728      embedding_1[0][0]                
__________________________________________________________________________________________________

conv1d_3 (Conv1D)               (None, 1082, 128)    192128      embedding_1[0][0]                


__________________________________________________________________________________________________
max_pooling1d_1 (MaxPooling1D)  (None, 361, 128)     0           conv1d_1[0][0]                   
__________________________________________________________________________________________________
max_pooling1d_2 (MaxPooling1D)  (None, 361, 128)     0           conv1d_2[0][0]                   
__________________________________________________________________________________________________
max_pooling1d_3 (MaxPooling1D)  (None, 360, 128)     0           conv1d_3[0][0]                   
__________________________________________________________________________________________________
concatenate_1 (Concatenate)     (None, 1082, 128)    0           max_pooling1d_1[0][0]            
                                                                 max_pooling1d_2[0][0]            
                                                                 max_pooling1d_3[0][0]            
__________________________________________________________________________________________________
dropout_2 (Dropout)             (None, 1082, 128)    0           concatenate_1[0][0]              
__________________________________________________________________________________________________
flatten_1 (Flatten)             (None, 138496)       0           dropout_2[0][0]                  
__________________________________________________________________________________________________
dense_3 (Dense)                 (None, 128)          17727616    flatten_1[0][0]                  
__________________________________________________________________________________________________
dense_4 (Dense)                 (None, 1)            129         dense_3[0][0]                    
==================================================================================================
Total params: 18,721,429
Trainable params: 18,188,929
Non-trainable params: 532,500

Итак, теперь Я сталкиваюсь со следующей большой проблемой, и у меня действительно заканчиваются идеи, как ее решить: Оптимизация гиперпараметров

Моя проблема в том, что все примеры кода, которые я нашел до сих пор, применяются Оптимизация гиперпараметров относится к архитектуре:

model = Sequential()
embedding = model.add(layers.Embedding(MAX_VOCAB_SIZE, EMBEDDING_DIM, input_length=MAX_SEQUENCE_LENGTH))
model.add(layers.Conv1D(filters=128, kernel_size=5, activation='relu'))
model.add(layers.MaxPool1D(pool_size=3))
model.add(Dropout(0.25))

Поэтому мой конкретный c вопрос заключается в том, как выполнить оптимизацию гиперпараметров, потому что всякий раз, когда я что-то изменяю в своем Con vNet, я получаю Как я уже сказал, все ошибки, которые я могу найти, применяются к модели = Sequential ().

Новое сообщение об ошибке:

__________________________________________________________________________________________________
  0%|          | 0/100 [00:00<?, ?trial/s, best loss=?]
job exception: 'Model' object is not subscriptable

Traceback (most recent call last):
  File "/Users/lukaskoston/Desktop/MasterarbeitFOMCAnalysis/07_Regression/CNN regression neu.py", line 262, in <module>
    max_evals=100)
  File "/Users/lukaskoston/.local/lib/python3.7/site-packages/hyperopt/fmin.py", line 482, in fmin
    show_progressbar=show_progressbar,
  File "/Users/lukaskoston/.local/lib/python3.7/site-packages/hyperopt/base.py", line 686, in fmin
    show_progressbar=show_progressbar,
  File "/Users/lukaskoston/.local/lib/python3.7/site-packages/hyperopt/fmin.py", line 509, in fmin
    rval.exhaust()
  File "/Users/lukaskoston/.local/lib/python3.7/site-packages/hyperopt/fmin.py", line 330, in exhaust
    self.run(self.max_evals - n_done, block_until_done=self.asynchronous)
  File "/Users/lukaskoston/.local/lib/python3.7/site-packages/hyperopt/fmin.py", line 286, in run
    self.serial_evaluate()
  File "/Users/lukaskoston/.local/lib/python3.7/site-packages/hyperopt/fmin.py", line 165, in serial_evaluate
    result = self.domain.evaluate(spec, ctrl)
  File "/Users/lukaskoston/.local/lib/python3.7/site-packages/hyperopt/base.py", line 894, in evaluate
    rval = self.fn(pyll_rval)
  File "/Users/lukaskoston/Desktop/MasterarbeitFOMCAnalysis/07_Regression/CNN regression neu.py", line 248, in train_and_score
    return hist['val_loss'][-1]
TypeError: 'Model' object is not subscriptable

Заранее спасибо, Лукас

1 Ответ

0 голосов
/ 17 апреля 2020

Вы должны задать аргументы гиперпараметров для вашего метода.

def ConvNet(embeddings, max_sequence_length, num_words, embedding_dim, trainable=False, extra_conv=True
            lr=1.0, dropout=0.5):
   # ...

Затем вы можете обновить свой код, чтобы использовать эти значения вместо фиксированных значений или значений по умолчанию Keras.

if extra_conv == True:
    x = Dropout(dropout)(l_merge)
else:
    # Original Yoon Kim model
    x = Dropout(dropout)(pool)

И:

model.compile(loss='mean_squared_error',
              optimizer=keras.optimizers.Adadelta(learning_rate=lr).
              metrics=['mean_squared_error'])

Я бы начал с этих двух, и оставил бы размер партии и количество эпох на потом. Они могут оказать большое влияние на время выполнения, что трудно объяснить при оптимизации гиперпараметров.

Затем вы можете оптимизировать с помощью библиотеки, такой как hyperopt .

from hyperopt import fmin, hp, tpe, space_eval

def train_and_score(args):
    # Train the model the fixed params plus the optimization args.
    # Note that this method should return the final History object.
    hist = ConvNet(embeddings, max_sequence_length, num_words,
                   embedding_dim, trainable=False, extra_conv=True,
                   lr=args['lr'], dropout=args['dropout'])

    # Unpack and return the last validation loss from the history.
    return hist['val_loss'][-1]

# Define the space to optimize over.
space = {
    'lr': hp.loguniform('lr', np.log(0.1), np.log(10.0)),
    'dropout': hp.uniform('dropout', 0, 1),
}

# Minimize the training score over the space.
trials = Trials()
best = fmin(train_and_score, space, trials=trials, algo=tpe.suggest, max_evals=100)

# Print details about the best results and hyperparameters.
print(best)
print(space_eval(space, best))

Существуют также библиотеки, которые помогут вам напрямую интегрировать это с Keras. Популярный выбор - Гипера . В этом случае вы бы изменили свою функцию, чтобы использовать некоторые шаблоны вместо параметров, но в остальном она очень похожа.

...