Керас: изменить скорость обучения - PullRequest
2 голосов
/ 14 января 2020

Я пытаюсь изменить скорость обучения моей модели после обучения с другой скоростью обучения.

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

Я пытался:

model.optimizer.learning_rate.set_value(0.1)
model.optimizer.lr = 0.1
model.optimizer.learning_rate = 0.1
K.set_value(model.optimizer.learning_rate, 0.1)
K.set_value(model.optimizer.lr, 0.1)
model.optimizer.lr.assign(0.1)

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

РЕДАКТИРОВАТЬ: Рабочий пример

Вот рабочий пример того, что я хотел бы сделать:

from keras.models import Sequential
from keras.layers import Dense
import keras
import numpy as np

model = Sequential()

model.add(Dense(1, input_shape=(10,)))

optimizer = keras.optimizers.Adam(lr=0.01)
model.compile(loss='mse',
              optimizer=optimizer)

model.fit(np.random.randn(50,10), np.random.randn(50), epochs=50)

# Change learning rate to 0.001 and train for 50 more epochs

model.fit(np.random.randn(50,10), np.random.randn(50), initial_epoch=50, epochs=50)

Ответы [ 4 ]

3 голосов
/ 14 января 2020

Вы можете изменить lr во время тренировки с помощью

from keras.callbacks import LearningRateScheduler

# This is a sample of a scheduler I used in the past
def lr_scheduler(epoch, lr):
    decay_rate = 0.85
    decay_step = 1
    if epoch % decay_step == 0 and epoch:
        return lr * pow(decay_rate, np.floor(epoch / decay_step))
    return lr

Применить планировщик к вашей модели

callbacks = [LearningRateScheduler(lr_scheduler, verbose=1)]

model = build_model(pretrained_model=ka.InceptionV3, input_shape=(224, 224, 3))
history = model.fit(train, callbacks=callbacks, epochs=EPOCHS, verbose=1)
2 голосов
/ 26 февраля 2020

Есть еще один способ, вам нужно найти переменную, которая содержит скорость обучения, и присвоить ей другое значение.

optimizer = tf.keras.optimizers.Adam(0.001)
optimizer.learning_rate.assign(0.01)
print(optimizer.learning_rate)

вывод:

<tf.Variable 'learning_rate:0' shape=() dtype=float32, numpy=0.01>
2 голосов
/ 14 января 2020

Вы должны определить это в функции компиляции:

optimizer = keras.optimizers.Adam(lr=0.01)
model.compile(loss='mse',
              optimizer=optimizer,
              metrics=['categorical_accuracy'])

Глядя на свой комментарий, если вы хотите изменить скорость обучения после начала, вам нужно использовать планировщик: ссылка

Изменить с помощью кода и планировщика:

from keras.models import Sequential
from keras.layers import Dense
import keras
import numpy as np

def lr_scheduler(epoch, lr):
    if epoch > 50:
        lr = 0.001
        return lr
    return lr

model = Sequential()

model.add(Dense(1, input_shape=(10,)))

optimizer = keras.optimizers.Adam(lr=0.01)
model.compile(loss='mse',
              optimizer=optimizer)

callbacks = [keras.callbacks.LearningRateScheduler(lr_scheduler, verbose=1)]

model.fit(np.random.randn(50,10), np.random.randn(50), epochs=100, callbacks=callbacks)

0 голосов
/ 14 января 2020

Предположим, что вы используете оптимизатор Adam в keras , вы хотите определить свой оптимизатор, прежде чем скомпилировать свою модель с ним.

Например, вы можете определить

myadam = keras.optimizers.Adam(learning_rate=0.1)

Затем вы скомпилируете свою модель с этим оптимизатором.

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

Надежда это помогает!

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