Как я могу извлечь часть декодера из автоэнкодера, используя синтаксис, подобный моему примеру? - PullRequest
0 голосов
/ 17 мая 2019

Я построил автоэнкодер, и я пытаюсь извлечь часть декодирования, чтобы я мог визуализировать «собственные лица», давая скрытый слой (или входной слой в декодере), который назначает 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».Следующие предыдущие слои были доступны без проблем: []

...