Предположим, у меня есть два входа: 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
?
Спасибо
Как ваш код у вас есть две отдельные модели. Хотя вы просто можете дважды использовать выходные данные вашего уровня общего представления для двух следующих подсетей, вам необходимо объединить две подсети для ввода:
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])
Позвольте мне кое-что прояснить, вы хотите, чтобы два входных слоя и два выходных слоя с общими слоями в одной модели, не так ли?
Я думаю, это может дать вам идею:
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])