Каково значение слияния моделей в Керасе?

10

Я узнал, что Keras обладает функциональностью для «объединения» двух моделей в соответствии со следующим:

from keras.layers import Merge

left_branch = Sequential()
left_branch.add(Dense(32, input_dim=784))

right_branch = Sequential()
right_branch.add(Dense(32, input_dim=784))

merged = Merge([left_branch, right_branch], mode='concat')

Какой смысл в NN Mergint, в каких ситуациях это полезно? Это своего рода ансамблевое моделирование? В чем разница между несколькими «режимами» (concat, avg, dot и т. Д.) В смысле производительности?

Хендрик
источник

Ответы:

14

Он используется по нескольким причинам, в основном он используется для объединения нескольких сетей. Хорошим примером будет то, где у вас есть два типа ввода, например, теги и изображение. Вы можете построить сеть, которая, например, имеет:

ИЗОБРАЖЕНИЕ -> Conv -> Max Pooling -> Conv -> Max Pooling -> Плотный

TAG -> Встраивание -> Плотный слой

Чтобы объединить эти сети в одно предсказание и обучить их вместе, вы можете объединить эти плотные слои перед окончательной классификацией.

Сети, в которых у вас есть несколько входов, являются наиболее «очевидным» их использованием. Вот картинка, которая объединяет слова с изображениями внутри RNN, мультимодальная часть - это место, где объединяются два входа:

Мультимодальная нейронная сеть

Другим примером является начальный уровень Google, где у вас есть различные свертки, которые складываются вместе перед переходом на следующий уровень.

Для подачи нескольких входов в Keras вы можете передать список массивов. В примере слова / изображения у вас будет два списка:

x_input_image = [image1, image2, image3]
x_input_word = ['Feline', 'Dog', 'TV']
y_output = [1, 0, 0]

Тогда вы можете соответствовать следующим образом:

model.fit(x=[x_input_image, x_input_word], y=y_output]
Ян ван дер Вегт
источник
Извините, я не вижу смысла в создании отдельных сетей как для обучающих экземпляров, так и для ярлыков, в то время как есть возможность подать их в одну сеть на этапе настройки, который в любом случае выполняет свою работу. Я вижу, что слияние возможно, но не является преимуществом перед «не слиянием».
Хендрик
Как вы кормите их в фазе подгонки? Входные данные всегда раздельные, вы не можете использовать свой слой свертки на своих ярлыках, поэтому эти слои нужно как-то объединить.
Ян ван дер Вегт
В Keras model.fit()для подгонки принимаются X и y, и modelв этом случае модель также может быть «не слитой». Очень похоже на другие модели моделей в Sklearn, например.
Хендрик
3
Метки могут быть плохо выбранным именем с моей стороны, скажем, у вас есть картинка и аннотация с этой картинкой, и вы хотите классифицировать, если эта комбинация касается кошек или нет, тогда у вас есть два типа ввода и один двоичный вывод , Чтобы получить синергию между ними, вам нужно где-то объединить слои. Другой пример: у вас есть две картинки: одна сверху и одна снизу, которые вы должны классифицировать вместе
Ян ван дер Вегт
3
@ Хендрик: «Компонентных моделей» нет, есть только одна модель. Это сложный процесс, включаемый функцией объединения слоев. Вы оцениваете его так же, как и для любой отдельной модели, т. Е. С метрикой по отношению к набору данных тестов на вынос (в примере изображения / слова с данными, содержащими изображения, связанный частичный текст и следующее слово в качестве метки для прогнозирования). Если вы хотите, вы можете проверить слои в модели, чтобы увидеть, что они делают - например, анализ особенностей CNN все еще может быть применен к сверточным слоям.
Нил Слэйтер