Я пытаюсь создать свои первые ансамблевые модели в Керасе. У меня есть 3 входных значения и одно выходное значение в моем наборе данных.
from keras.optimizers import SGD,Adam
from keras.layers import Dense,Merge
from keras.models import Sequential
model1 = Sequential()
model1.add(Dense(3, input_dim=3, activation='relu'))
model1.add(Dense(2, activation='relu'))
model1.add(Dense(2, activation='tanh'))
model1.compile(loss='mse', optimizer='Adam', metrics=['accuracy'])
model2 = Sequential()
model2.add(Dense(3, input_dim=3, activation='linear'))
model2.add(Dense(4, activation='tanh'))
model2.add(Dense(3, activation='tanh'))
model2.compile(loss='mse', optimizer='SGD', metrics=['accuracy'])
model3 = Sequential()
model3.add(Merge([model1, model2], mode = 'concat'))
model3.add(Dense(1, activation='sigmoid'))
model3.compile(loss='binary_crossentropy', optimizer='Adam', metrics=['accuracy'])
model3.input_shape
Модель ансамбля (model3) компилируется без ошибок, но при подгонке модели я должен передать один и тот же вход два раза model3.fit([X,X],y)
. Который я считаю ненужным шагом, и вместо того, чтобы дважды вводить ввод, я хочу иметь общие узлы ввода для моей модели ансамбля. Как мне это сделать?
3 ответа
Функциональный API-интерфейс Keras , по-видимому, лучше подходит для вашего случая использования, так как это обеспечивает большую гибкость в графе вычислений. например.:
from keras.layers import concatenate
from keras.models import Model
from keras.layers import Input, Merge
from keras.layers.core import Dense
from keras.layers.merge import concatenate
# a single input layer
inputs = Input(shape=(3,))
# model 1
x1 = Dense(3, activation='relu')(inputs)
x1 = Dense(2, activation='relu')(x1)
x1 = Dense(2, activation='tanh')(x1)
# model 2
x2 = Dense(3, activation='linear')(inputs)
x2 = Dense(4, activation='tanh')(x2)
x2 = Dense(3, activation='tanh')(x2)
# merging models
x3 = concatenate([x1, x2])
# output layer
predictions = Dense(1, activation='sigmoid')(x3)
# generate a model from the layers above
model = Model(inputs=inputs, outputs=predictions)
model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy'])
# Always a good idea to verify it looks as you expect it to
# model.summary()
data = [[1,2,3], [1,1,3], [7,8,9], [5,8,10]]
labels = [0,0,1,1]
# The resulting model can be fit with a single input:
model.fit(data, labels, epochs=50)
Примечания:
- Могут быть небольшие различия в API между версиями Keras (до и после версии 2)
- В приведенном выше примере указаны разные функции оптимизатора и потерь для каждой из моделей. Однако, так как fit () вызывается только один раз (для модели 3), те же настройки - те же, что и для модели 3 - будут применяться ко всей модели. Чтобы иметь разные настройки при обучении подмоделей, они должны быть приспособлены () отдельно - см. Комментарий @Daniel.
РЕДАКТИРОВАТЬ: обновленные заметки на основе комментариев
Ответ Этова - отличный вариант.
Но предположим, что у вас уже есть готовые model1
и model2
и вы не хотите их менять, вы можете создать третью модель следующим образом:
singleInput = Input((3,))
out1 = model1(singleInput)
out2 = model2(singleInput)
#....
#outN = modelN(singleInput)
out = Concatenate()([out1,out2]) #[out1,out2,...,outN]
out = Dense(1, activation='sigmoid')(out)
model3 = Model(singleInput,out)
И если у вас уже есть все готовые модели и вы не хотите их менять, вы можете получить что-то вроде этого (не проверено):
singleInput = Input((3,))
output = model3([singleInput,singleInput])
singleModel = Model(singleInput,output)
Определите новый входной слой и используйте выходные данные модели напрямую (работает в функциональном API):
assert model1.input_shape == model2.input_shape # make sure they got same shape
inp = tf.keras.layers.Input(shape=model1.input_shape[1:])
model = tf.keras.models.Model(inputs=[inp], outputs=[model1(inp), model2(inp)])
Похожие вопросы
Связанные вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.