Добавление регуляризатора к существующему слою обученной модели без сброса Весов?
Скажем, я передаю обучение через начало. Я добавляю несколько слоев и тренирую его некоторое время.
Вот как выглядит топология моей модели:
base_model = InceptionV3(weights='imagenet', include_top=False)
x = base_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(1024, activation='relu', name = 'Dense_1')(x)
predictions = Dense(12, activation='softmax', name = 'Predictions')(x)
model = Model(input=base_model.input, output=predictions)
Я тренирую эту модель некоторое время, сохраняю ее и загружаю снова для переподготовки; на этот раз я хочу добавить L2-регуляризатор к Dense_1 без сброса Весов? Возможно ли это?
path = .model.hdf5
from keras.models import load_model
model = load_model(path)
В документах показано только то, что регуляризатор может быть добавлен в качестве параметра при инициализации слоя:
from keras import regularizers
model.add(Dense(64, input_dim=64,
kernel_regularizer=regularizers.l2(0.01),
activity_regularizer=regularizers.l1(0.01)))
Это по существу, создание нового слоя, так что вес моего слоя будет сброшен.
Правка:
Итак, я играю с кодом последние пару дней, и что-то странное происходит с моей потерей, когда я загружаю модель (после небольшой тренировки с новым регуляризатором).
Итак, первый раз, когда я запускаю этот код (первый раз с новым регуляризатором):
from keras.models import load_model
base_model = load_model(path)
x = base_model.get_layer('dense_1').output
predictions = base_model.get_layer('dense_2')(x)
model = Model(inputs = base_model.input, output = predictions)
model.get_layer('dense_1').kernel_regularizer = regularizers.l2(0.02)
model.compile(optimizer=SGD(lr= .0001, momentum=0.90),
loss='categorical_crossentropy',
metrics = ['accuracy'])
Мой тренировочный результат кажется нормальным:
Epoch 43/50
- 2918s - loss: 0.3834 - acc: 0.8861 - val_loss: 0.4253 - val_acc: 0.8723
Epoch 44/50
Epoch 00044: saving model to E:Keras Modelstesting_32018-01-18_44.hdf5
- 2692s - loss: 0.3781 - acc: 0.8869 - val_loss: 0.4217 - val_acc: 0.8729
Epoch 45/50
- 2690s - loss: 0.3724 - acc: 0.8884 - val_loss: 0.4169 - val_acc: 0.8748
Epoch 46/50
Epoch 00046: saving model to E:Keras Modelstesting_32018-01-18_46.hdf5
- 2684s - loss: 0.3688 - acc: 0.8896 - val_loss: 0.4137 - val_acc: 0.8748
Epoch 47/50
- 2665s - loss: 0.3626 - acc: 0.8908 - val_loss: 0.4097 - val_acc: 0.8763
Epoch 48/50
Epoch 00048: saving model to E:Keras Modelstesting_32018-01-18_48.hdf5
- 2681s - loss: 0.3586 - acc: 0.8924 - val_loss: 0.4069 - val_acc: 0.8767
Epoch 49/50
- 2679s - loss: 0.3549 - acc: 0.8930 - val_loss: 0.4031 - val_acc: 0.8776
Epoch 50/50
Epoch 00050: saving model to E:Keras Modelstesting_32018-01-18_50.hdf5
- 2680s - loss: 0.3493 - acc: 0.8950 - val_loss: 0.4004 - val_acc: 0.8787
Однако, если я попытаюсь загрузить модель после этого мини-тренинг (я загружу модель из epoch 00050, поэтому новое значение регуляризатора должно быть уже реализовано, я получаю действительно высокое значение потерь)
Код:
path = r'E:Keras Modelstesting_32018-01-18_50.hdf5' #50th epoch model
from keras.models import load_model
model = load_model(path)
model.compile(optimizer=SGD(lr= .0001, momentum=0.90),
loss='categorical_crossentropy',
metrics = ['accuracy'])
Возвращение:
Epoch 51/65
- 3130s - loss: 14.0017 - acc: 0.8953 - val_loss: 13.9529 - val_acc: 0.8800
Epoch 52/65
Epoch 00052: saving model to E:Keras Modelstesting_32018-01-20_52.hdf5
- 2813s - loss: 13.8017 - acc: 0.8969 - val_loss: 13.7553 - val_acc: 0.8812
Epoch 53/65
- 2759s - loss: 13.6070 - acc: 0.8977 - val_loss: 13.5609 - val_acc: 0.8824
Epoch 54/65
Epoch 00054: saving model to E:Keras Modelstesting_32018-01-20_54.hdf5
- 2748s - loss: 13.4115 - acc: 0.8992 - val_loss: 13.3697 - val_acc: 0.8824
Epoch 55/65
- 2745s - loss: 13.2217 - acc: 0.9006 - val_loss: 13.1807 - val_acc: 0.8840
Epoch 56/65
Epoch 00056: saving model to E:Keras Modelstesting_32018-01-20_56.hdf5
- 2752s - loss: 13.0335 - acc: 0.9014 - val_loss: 12.9951 - val_acc: 0.8840
Epoch 57/65
- 2756s - loss: 12.8490 - acc: 0.9023 - val_loss: 12.8118 - val_acc: 0.8849
Epoch 58/65
Epoch 00058: saving model to E:Keras Modelstesting_32018-01-20_58.hdf5
- 2749s - loss: 12.6671 - acc: 0.9032 - val_loss: 12.6308 - val_acc: 0.8849
Epoch 59/65
- 2738s - loss: 12.4871 - acc: 0.9039 - val_loss: 12.4537 - val_acc: 0.8855
Epoch 60/65
Epoch 00060: saving model to E:Keras Modelstesting_32018-01-20_60.hdf5
- 2765s - loss: 12.3086 - acc: 0.9059 - val_loss: 12.2778 - val_acc: 0.8868
Epoch 61/65
- 2767s - loss: 12.1353 - acc: 0.9065 - val_loss: 12.1055 - val_acc: 0.8867
Epoch 62/65
Epoch 00062: saving model to E:Keras Modelstesting_32018-01-20_62.hdf5
- 2757s - loss: 11.9637 - acc: 0.9061 - val_loss: 11.9351 - val_acc: 0.8883
Обратите внимание на действительно высокие значения
loss. Это нормально? Я понимаю, что регуляризатор l2 приведет к потере (если есть большие веса), но разве это не отразится на первой мини-тренировке (где я впервые реализовал регуляризатор?). Точность, кажется, остается но последовательный. Спасибо.
1 ответ:
Вам нужно сделать 2 вещи:
Добавьте регуляризаторы следующим образом:
model.get_layer('Dense_1').kernel_regularizer = l2(0.01)Перекомпилируйте модель:
model.compile(...)
Comments