Я построил автоэнкодер, и я пытаюсь извлечь часть декодирования, чтобы я мог визуализировать «собственные лица», давая скрытый слой (или входной слой в декодере), который назначает 1 одному узлу, и0 к остальным.Я делаю что-то не так в своем коде, и я не могу понять, что.
Я уже пробовал некоторые другие вещи, такие как попытка получить выходные данные 0-го слоя, но яочевидно, не все правильно.
def build_linear_autoencoder(model_name: str, x_tr: np.ndarray, x_va:
np.ndarray, encoding_dim=32, epochs=100) -> \
(Sequential, Sequential, float):
"""
Build a linear autoencoder.
:param model_name: name used in file creation
:param x_tr: training images
:param x_va: validation images
:param encoding_dim: number of nodes in encoder layer (i.e. the bottleneck)
:return: autoencoder model, encoder model, compression factor
"""
# Get image dimension
image_dim = x_tr.shape[1]
# Full model name for file output
full_model_name = model_name + '_im_dim' + str(image_dim) + '-en_dim' + str(encoding_dim)
# Build model path
model_path = os.path.join(os.pardir, "models", full_model_name + ".h5")
plot_path = os.path.join(os.pardir, "models", full_model_name + ".png")
# Try loading the model, ...
try:
autoencoder = load_model(model_path)
log("Found model \'", model_name, "\' locally.", lvl=3)
# ... otherwise create it
except:
log("Training linear autoencoder.", lvl=2)
# Flatten
x_tr = x_tr.reshape((len(x_tr), image_size))
x_va = x_va.reshape((len(x_va), image_size))
input_shape = (image_size,)
# Build model
autoencoder = Sequential()
autoencoder.add(Dense(encoding_dim, input_shape=input_shape, activation='linear',
kernel_initializer='random_uniform', bias_initializer='zeros'))
autoencoder.add(Dense(image_size, activation='linear',
kernel_initializer='random_uniform', bias_initializer='zeros'))
# Build encoder part
'''input_img = Input(shape=input_shape)
encoder_layer = autoencoder.layers[0]
encoder = Model(input_img, encoder_layer(input_img))'''
# Train model
autoencoder.compile(optimizer='adam', loss='mean_squared_error')
autoencoder.fit(x_tr, x_tr,
epochs=epochs,
batch_size=32,
verbose=1,
validation_data=(x_va, x_va),
callbacks=[TensorBoard(log_dir='/tmp/autoencoder')])
# Save model
autoencoder.save(model_path)
# Visual aid
plot_model(autoencoder, to_file=plot_path, show_layer_names=True, show_shapes=True)
# Get intermediate output at encoded layer
encoder = Model(inputs=autoencoder.input, outputs=autoencoder.get_layer(index=0).output)
# See effect of encoded representations on output (eigenfaces?)
decoder = Model(inputs=Input(shape=(encoding_dim,)), outputs=autoencoder.get_layer(index=1).output)
plot_model(autoencoder, to_file=os.path.join(os.pardir, "models", "decoder.png"), show_layer_names=True, show_shapes=True)
# Size of encoded representation
compression_factor = np.round(float(image_size / encoding_dim), decimals=2)
log("Compression factor is {}".format(compression_factor), lvl=3)
return autoencoder, encoder, decoder, compression_factor
Это вся функция для автоматического кодера.Проблема в линии декодера.Ошибка с этим конкретным кодом:
ValueError: График отключен: невозможно получить значение для тензорного тензора ("dens_1_input: 0", shape = (?, 768), dtype = float32) на уровне "dense_1_input».Следующие предыдущие слои были доступны без проблем: []