Как использовать слой слияния Keras для автоэнкодера с двумя выходами

1

Предположим, у меня есть два входа: 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?

Спасибо

Теги:
keras
deep-learning
autoencoder

2 ответа

0
Лучший ответ

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

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

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

Я думаю, это может дать вам идею:

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])

Ещё вопросы

Сообщество Overcoder
Наверх
Меню