Как использовать слой слияния Keras для автоэнкодера с двумя выходами - PullRequest
0 голосов
/ 21 сентября 2018

Предположим, у меня есть два ввода: X и Y, и я хочу спроектировать и объединить автоэнкодер для реконструкции X' и Y'.

, как на рисунке, X - это аудиовход, а Y - видеовход.Эта глубокая архитектура хороша тем, что имеет два входа с двумя выходами.Более того, они разделяют некоторый слой посередине.Мой вопрос: как использовать Keras для написания этого автоэнкодера.Предположим, что каждый слой полностью связан, кроме общего слоя в середине.

Вот мой код следующим образом:

 from keras.layers import Input, Dense
 from keras.models import Model
 import numpy as np

 X = np.random.random((1000, 100))
 y = np.random.random((1000, 300))  # x and y can be different size

 # the X autoencoder layer 

 Xinput = Input(shape=(100,))

 encoded = Dense(50, activation='relu')(Xinput)
 encoded = Dense(20, activation='relu')(encoded)
 encoded = Dense(15, activation='relu')(encoded)

 decoded = Dense(20, activation='relu')(encoded)
 decoded = Dense(50, activation='relu')(decoded)
 decoded = Dense(100, activation='relu')(decoded)



 # the Y autoencoder layer 
 Yinput = Input(shape=(300,))

 encoded = Dense(120, activation='relu')(Yinput)
 encoded = Dense(50, activation='relu')(encoded)
 encoded = Dense(15, activation='relu')(encoded)

 decoded = Dense(50, activation='relu')(encoded)
 decoded = Dense(120, activation='relu')(decoded)
 decoded = Dense(300, activation='relu')(decoded)

Я просто середина имеет 15 узлов для Xи Y.У меня вопрос как обучить этот совместный автоэнкодер с функцией потерь \|X-X'\|^2 + \|Y-Y'\|^2?

Спасибо

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

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

Xinput = Input(shape=(100,))
Yinput = Input(shape=(300,))

Xencoded = Dense(50, activation='relu')(Xinput)
Xencoded = Dense(20, activation='relu')(Xencoded)


Yencoded = Dense(120, activation='relu')(Yinput)
Yencoded = Dense(50, activation='relu')(Yencoded)

shared_input = Concatenate()([Xencoded, Yencoded])
shared_output = Dense(15, activation='relu')(shared_input)

Xdecoded = Dense(20, activation='relu')(shared_output)
Xdecoded = Dense(50, activation='relu')(Xdecoded)
Xdecoded = Dense(100, activation='relu')(Xdecoded)

Ydecoded = Dense(50, activation='relu')(shared_output)
Ydecoded = Dense(120, activation='relu')(Ydecoded)
Ydecoded = Dense(300, activation='relu')(Ydecoded)

Теперь у вас есть два отдельных выхода.Таким образом, вам нужны две отдельные функции потерь, которые будут добавлены так или иначе для компиляции модели:

model = Model([Xinput, Yinput], [Xdecoded, Ydecoded])
model.compile(optimizer='adam', loss=['mse', 'mse'], loss_weights=[1., 1.])

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

model.fit([X_input, Y_input], [X_label, Y_label])
0 голосов
/ 21 сентября 2018

Позвольте мне кое-что прояснить, вам нужно два входных слоя и два выходных слоя с общими слоями в одной модели, верно?

Думаю, это может дать вам представление:

from keras.layers import Input, Dense, Concatenate
from keras.models import Model
import numpy as np

X = np.random.random((1000, 100))
y = np.random.random((1000, 300))  # x and y can be different size

# the X autoencoder layer 
Xinput = Input(shape=(100,))

encoded_x = Dense(50, activation='relu')(Xinput)
encoded_x = Dense(20, activation='relu')(encoded_x)

# the Y autoencoder layer 
Yinput = Input(shape=(300,))

encoded_y = Dense(120, activation='relu')(Yinput)
encoded_y = Dense(50, activation='relu')(encoded_y)

# concatenate encoding layers
c_encoded = Concatenate(name="concat", axis=1)([encoded_x, encoded_y])
encoded = Dense(15, activation='relu')(c_encoded)

decoded_x = Dense(20, activation='relu')(encoded)
decoded_x = Dense(50, activation='relu')(decoded_x)
decoded_x = Dense(100, activation='relu')(decoded_x)

out_x = SomeOuputLayers(..)(decoded_x)

decoded_y = Dense(50, activation='relu')(encoded)
decoded_y = Dense(120, activation='relu')(decoded_y)
decoded_y = Dense(300, activation='relu')(decoded_y)

out_y = SomeOuputLayers(..)(decoded_y)

# Now you have two input and two output with shared layer
model = Model([Xinput, Yinput], [out_x, out_y])
...