Я совершенно новичок в Керасе, поэтому заранее извиняюсь за любые глупые ошибки.В настоящее время я пытаюсь попробовать какое-то старое доброе междоменное обучение переносу между двумя наборами данных.У меня есть модель, которая обучается и выполняется на сгенерированном наборе данных распознавания голоса (код находится в нижней части этого вопроса, потому что он довольно длинный)
Если бы я обучал новую модель, скажем, модель_2в другом наборе данных, тогда я получу базовую линию из начального случайного распределения весов.
Интересно, можно ли тренировать модель_1 и модель_2, и это бит, который я не знаю как сделать;могу ли я взять два плотных слоя 256 и 128 из model_1 (с обученными весами) и использовать их в качестве отправных точек для model_3 - набора данных 2 с начальным распределением веса из model_1?
Итак, в конце, У меня есть следующее:
- Model_1 , которое начинается со случайного распределения и обучается на наборе данных 1
- Model_2 , который начинается со случайного распределения и обучается на наборе данных 2
- 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: все входные атрибуты и выходные данные будутто же самое между двумя наборами данных, все, что изменится, это значения атрибутов.Мне любопытно, можно ли это сделать, если два набора данных имеют разное количество выходных классов?