Мое решение не очень элегантное, и, возможно, есть более лучшие решения, но поскольку никто еще не ответил, я опубликую его (я действительно надеялся, что кто-то сделает так, чтобы я мог улучшить свою собственную реализацию, как вы увидим ниже).
Итак, я построил сеть, которая может принимать вторичный вход непосредственно в скрытое пространство.
К сожалению, оба ввода являются обязательными, поэтому я получаю сеть, в которой требуются фиктивные массивы, заполненные нулями для «нежелательного» ввода (вы увидите через секунду).
Использование функционального API Keras:
image_input = Input(shape=image_shape)
conv1 = Conv2D(...,activation='relu')(image_input)
...
dense_encoder = Dense(...)(<layer>)
z_input = Input(shape=n_latent)
decoder_entry = Dense(...,activation='relu')(Add()([dense_encoder,z_input]))
...
decoder_output = Conv2DTranspose(...)
model = Model(inputs=[image_input,z_input], outputs=decoder_output)
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
encoder = Model(inputs=image_input,outputs=dense_encoder)
decoder = Model(inputs=[z_input,image_input], outputs=decoder_output)
Обратите внимание, что вы не должны компилировать кодер и декодер.
(некоторый код либо пропущен, либо оставлен с ...
, чтобы вы могли заполнить ваши конкретные потребности).
Наконец, для обучения вам нужно будет предоставить один пустой массив. Итак, чтобы обучить весь авто-кодировщик:
изображения - это X в этом контексте
model.fit([images,np.zeros((len(n_latent),...))],images)
И тогда вы можете получить скрытые функции, используя:
latent_features = encoder.predict(images)
Или используйте декодер с скрытыми входными и фиктивными переменными (обратите внимание на порядок входов выше):
decoder.predict([Z_inputs,np.zeros(shape=images.shape)])
Наконец, еще одно решение, которое я не пробовал, - это построение для параллельных моделей с той же архитектурой, с одним авто-кодером, а со вторым только с частью декодера, и затем используйте:
decoder_layer.set_weights(model_layer.get_weights())
Это должно сработать, но я не подтвердил это. У него есть недостаток, заключающийся в том, что он должен копировать веса каждый раз, когда в вашем поезде используется модель автоэнкодера.
Итак, в заключение я знаю о многих проблемах здесь, но опять же, я опубликовал это только потому, что видел, что никто не ответил, и надеялся, что это все равно будет вам полезно.
Пожалуйста, прокомментируйте, если что-то не понятно.