Перенос обучения с использованием сохраненных значений узких мест (вывод с полной моделью) - PullRequest
0 голосов
/ 12 мая 2018

Я использую последние Keras с бэкэндом тензорного потока.

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

# Save  bottleneck values

from keras.applications.xception import Xception
base_model = Xception(weights='imagenet', include_top=False)
prediction =  base_model.predict(x)
** SAVE bottleneck data***

Теперь предположим, что моя полная модель выглядит примерно так:

base_model = Xception(weights='imagenet', include_top=False)
x = base_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(1024, activation='relu')(x)
predictions = Dense(classes, activation='softmax')(x)
model = Model(input=base_model.input, output=predictions)

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

bottleneck_input = Input(shape = bottleneck_shape)
x = GlobalAveragePooling2D() (bottleneck_input)
x = Dense(1024, activation='relu')(x)
predictions = Dense(classes, activation='softmax')(x)
model = Model(input= bottleneck_input, output=predictions)
save_full_model() #save model

После обучения этой меньшей модели я хочу выполнить вывод по полной модели.Поэтому мне нужно собрать базовую модель и меньшую модель.Не уверен, что это лучший способ сделать это.

base_model = Xception(weights='imagenet', include_top=False)
#x = base_model.output

loaded_model = load_model() # load bottleneck model

#now to combine both models (something like this?)
Model(inputs = base_model.inputs, outputs = loaded_model.outputs)

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

1 Ответ

0 голосов
/ 12 мая 2018

Каждая модель - это слой с дополнительными свойствами, такими как функция потерь и т. Д. Таким образом, вы можете использовать их как слой в функциональном API. В вашем случае это может выглядеть так:

input = Input(...)
base_model = Xception(weights='imagenet', include_top=False)
# Apply model to input like layer
base_output = base_model(input)
loaded_model = load_model()
# Now the bottleneck model
out = loaded_model(base_output)
final_model = Model(input, out) # New computation graph
...