Keras: повторно использовать обученные веса в новом эксперименте - PullRequest
0 голосов
/ 03 февраля 2019

Я совершенно новичок в Керасе, поэтому заранее извиняюсь за любые глупые ошибки.В настоящее время я пытаюсь попробовать какое-то старое доброе междоменное обучение переносу между двумя наборами данных.У меня есть модель, которая обучается и выполняется на сгенерированном наборе данных распознавания голоса (код находится в нижней части этого вопроса, потому что он довольно длинный)

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

Интересно, можно ли тренировать модель_1 и модель_2, и это бит, который я не знаю как сделать;могу ли я взять два плотных слоя 256 и 128 из model_1 (с обученными весами) и использовать их в качестве отправных точек для model_3 - набора данных 2 с начальным распределением веса из model_1?

Итак, в конце, У меня есть следующее:

  1. Model_1 , которое начинается со случайного распределения и обучается на наборе данных 1
  2. Model_2 , который начинается со случайного распределения и обучается на наборе данных 2
  3. Model_3 , который начинается с распределения, обученного в Model_1, и обучается на наборе данных 2 .

Мой вопрос: как бы я выполнил шаг 3, описанный выше?Я не хочу замораживать веса, я просто хочу начальное распределение для обучения из прошлого эксперимента

Любая помощь будет принята с благодарностью.Спасибо!Извиняюсь, если я не совсем ясно дал понять, что я собираюсь

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

import numpy
import pandas
from keras.models import Sequential
from keras.layers import Dense
from keras.callbacks import EarlyStopping
from keras.wrappers.scikit_learn import KerasClassifier
from sklearn.model_selection import cross_val_score
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import KFold
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
import matplotlib.pyplot as plt
from keras.utils import np_utils
from keras.layers.normalization import BatchNormalization

import time
start = time.clock()



# fix random seed for reproducibility
seed = 1
numpy.random.seed(seed)

# load dataset
dataframe = pandas.read_csv("voice.csv", header=None)
dataset = dataframe.values
# split into input (X) and output (Y) variables
numVars = len(dataframe.columns) - 1
numClasses  =  dataframe[numVars].nunique()
X = dataset[:,0:numVars].astype(float)
Y = dataset[:,numVars]


print("THERE ARE " + str(numVars) + " ATTRIBUTES")
print("THERE ARE " + str(numClasses) + " UNIQUE CLASSES")




# encode class values as integers
encoder = LabelEncoder()
encoder.fit(Y)
encoded_Y = encoder.transform(Y)

# convert integers to dummy variables (i.e. one hot encoded)
dummy_y = np_utils.to_categorical(encoded_Y)


calls = [EarlyStopping(monitor='acc', min_delta=0.0001, patience=100, verbose=2, mode='max', restore_best_weights=True)]

# define baseline model
def baseline_model():
    # create model

    model = Sequential()

    model.add(BatchNormalization())

    model.add(Dense(256, input_dim=numVars, activation='sigmoid'))

    model.add(Dense(128, activation='sigmoid'))

    model.add(Dense(numClasses, activation='softmax'))
    # Compile model
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model


estimator = KerasClassifier(build_fn=baseline_model, epochs=2000, batch_size=1000, verbose=1)
kfold = KFold(n_splits=10, shuffle=True, random_state=seed)
results = cross_val_score(estimator, X, dummy_y, cv=kfold, fit_params={'callbacks':calls})
print("Baseline: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100))
#your code here    
print (time.clock() - start)

PS: все входные атрибуты и выходные данные будутто же самое между двумя наборами данных, все, что изменится, это значения атрибутов.Мне любопытно, можно ли это сделать, если два набора данных имеют разное количество выходных классов?

1 Ответ

0 голосов
/ 03 февраля 2019

Короче говоря, для точной настройки Model_3 из Model_1, просто позвоните model.load_weights('/path/to/model_1.h5', by_name=True) после model.compile(...).Конечно, вы должны сначала сохранить обученную Model_1.

Если я правильно понял, у вас одинаковое количество функций и классов среди двух наборов данных, поэтому вам даже не нужно переделывать вашу модель.Если у вас был другой набор классов, вам пришлось бы присвоить разные имена последним слоям Model_1 и Model_3:

model.add(Dense(numClasses, activation='softmax', name='some_unique_name'))
...