Можно ли создать несколько экземпляров одного и того же CNN, которые получают несколько изображений и объединяются в плотный слой? (Keras) - PullRequest
1 голос
/ 11 ноября 2019

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

enter image description here

Возможно ли это с Keras или даже возможно обучить сеть с нуля с этой архитектурой?

По сути, я хочу обучить модель, которая принимает большее, но фиксированное количество изображений на выборку (то есть 3+ входных изображения с похожими визуальными функциями), но не разбивать количество параметров, обучая несколькоCNNs сразу. Идея состоит в том, чтобы обучить только один CNN, который можно использовать для всех выходов. Важно, чтобы все изображения входили в один и тот же плотный слой, чтобы модель могла выучить ассоциации между несколькими изображениями, которые всегда упорядочены в зависимости от их источника.

1 Ответ

0 голосов
/ 11 ноября 2019

Этого легко достичь, используя функциональный API Keras, следующим образом.

from tensorflow.python.keras import layers, models, applications

# Multiple inputs
in1 = layers.Input(shape=(128,128,3))
in2 = layers.Input(shape=(128,128,3))
in3 = layers.Input(shape=(128,128,3))

# CNN output
cnn = applications.xception.Xception(include_top=False)


out1 = cnn(in1)
out2 = cnn(in2)
out3 = cnn(in3)

# Flattening the output for the dense layer
fout1 = layers.Flatten()(out1)
fout2 = layers.Flatten()(out2)
fout3 = layers.Flatten()(out3)

# Getting the dense output
dense = layers.Dense(100, activation='softmax')

dout1 = dense(fout1)
dout2 = dense(fout2)
dout3 = dense(fout3)

# Concatenating the final output
out = layers.Concatenate(axis=-1)([dout1, dout2, dout3])

# Creating the model
model = models.Model(inputs=[in1,in2,in3], outputs=out)
model.summary()```
...