График отключен: невозможно получить значение для тензорного Кераса Python - PullRequest
0 голосов
/ 12 февраля 2020

Новичок ie здесь! Я пытаюсь изменить код для Variational Autoencoder, заданный здесь , чтобы сделать его условным VAE, что означает добавление меток как на вход кодера, так и на декодер. Вот код -

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

from keras.layers import Lambda, Input, Dense, Concatenate
from keras.models import Model
from keras.datasets import mnist
from keras.losses import mse, binary_crossentropy
from keras.utils import np_utils

import numpy as np
import matplotlib.pyplot as plt
import argparse
import os


# reparameterization trick
# instead of sampling from Q(z|X), sample epsilon = N(0,I)
# z = z_mean + sqrt(var) * epsilon
def sampling(args):
    """Reparameterization trick by sampling from an isotropic unit Gaussian.

    # Arguments
        args (tensor): mean and log of variance of Q(z|X)

    # Returns
        z (tensor): sampled latent vector
    """

    z_mean, z_log_var = args
    batch = K.shape(z_mean)[0]
    dim = K.int_shape(z_mean)[1]
    # by default, random_normal has mean = 0 and std = 1.0
    epsilon = K.random_normal(shape=(batch, dim))
    return z_mean + K.exp(0.5 * z_log_var) * epsilon


def plot_results(models,
                 data,
                 batch_size=128,
                 model_name="vae_mnist"):
    """Plots labels and MNIST digits as a function of the 2D latent vector

    # Arguments
        models (tuple): encoder and decoder models
        data (tuple): test data and label
        batch_size (int): prediction batch size
        model_name (string): which model is using this function
    """

    encoder, decoder = models
    x_test, y_test = data
    os.makedirs(model_name, exist_ok=True)

    filename = os.path.join(model_name, "vae_mean.png")
    # display a 2D plot of the digit classes in the latent space
    z_mean, _, _ = encoder.predict(x_test,
                                   batch_size=batch_size)
    plt.figure(figsize=(12, 10))
    plt.scatter(z_mean[:, 0], z_mean[:, 1], c=y_test)
    plt.colorbar()
    plt.xlabel("z[0]")
    plt.ylabel("z[1]")
    plt.savefig(filename)
    plt.show()

    filename = os.path.join(model_name, "digits_over_latent.png")
    # display a 30x30 2D manifold of digits
    n = 30
    digit_size = 28
    figure = np.zeros((digit_size * n, digit_size * n))
    # linearly spaced coordinates corresponding to the 2D plot
    # of digit classes in the latent space
    grid_x = np.linspace(-4, 4, n)
    grid_y = np.linspace(-4, 4, n)[::-1]

    for i, yi in enumerate(grid_y):
        for j, xi in enumerate(grid_x):
            z_sample = np.array([[xi, yi]])
            x_decoded = decoder.predict(z_sample)
            digit = x_decoded[0].reshape(digit_size, digit_size)
            figure[i * digit_size: (i + 1) * digit_size,
                   j * digit_size: (j + 1) * digit_size] = digit

    plt.figure(figsize=(10, 10))
    start_range = digit_size // 2
    end_range = (n - 1) * digit_size + start_range + 1
    pixel_range = np.arange(start_range, end_range, digit_size)
    sample_range_x = np.round(grid_x, 1)
    sample_range_y = np.round(grid_y, 1)
    plt.xticks(pixel_range, sample_range_x)
    plt.yticks(pixel_range, sample_range_y)
    plt.xlabel("z[0]")
    plt.ylabel("z[1]")
    plt.imshow(figure, cmap='Greys_r')
    plt.savefig(filename)
    plt.show()

# MNIST dataset
(x_train, y_train), (x_test, y_test) = mnist.load_data()

n_classes = 10

y_train_1hot = np_utils.to_categorical(y_train, n_classes)
y_test_1hot = np_utils.to_categorical(y_test, n_classes)

image_size = x_train.shape[1]
original_dim = image_size * image_size
x_train = np.reshape(x_train, [-1, original_dim])
x_test = np.reshape(x_test, [-1, original_dim])
x_train = x_train.astype('float32') / 255
x_test = x_test.astype('float32') / 255

x_train=np.concatenate((x_train,y_train_1hot),axis=1)
x_test=np.concatenate((x_test,y_test_1hot),axis=1)

# network parameters
input_shape = (original_dim+n_classes, )
intermediate_dim = 512
batch_size = 128
latent_dim = 2
epochs = 50


# VAE model Part 1 - Encoder
# build encoder model
inputs = Input(shape=input_shape, name='encoder_input')
x = Dense(intermediate_dim, activation='relu')(inputs)
z_mean = Dense(latent_dim, name='z_mean')(x)
z_log_var = Dense(latent_dim, name='z_log_var')(x)

# use reparameterization trick to push the sampling out as input
# note that "output_shape" isn't necessary with the TensorFlow backend
z = Lambda(sampling, output_shape=(latent_dim,), name='z')([z_mean, z_log_var])

# instantiate encoder model
encoder = Model(inputs, [z_mean, z_log_var, z], name='encoder')
encoder.summary()
#np_utils(encoder, to_file='vae_mlp_encoder.png', show_shapes=True) #ERROR!!


# VAE model Part 2 - Decoder

# build decoder model
latent_inputs = Input(shape=(latent_dim,), name='z_sampling')
label_inputs = Input(shape=(n_classes,), name='labels')
merged=Concatenate(axis=-1)([latent_inputs, label_inputs])

x = Dense(intermediate_dim, activation='relu')(merged)
outputs = Dense(original_dim, activation='sigmoid')(x)
decoder = Model(inputs=[latent_inputs, label_inputs], outputs=[outputs], name='decoder')

decoder.summary()

outputs = decoder([encoder(inputs)[2], label_inputs])

# Putting it together
vae = Model(inputs, outputs, name='vae_mlp')

И это ошибка, которую я получаю -

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-4-aef18381e926> in <module>
    162 
    163 # Putting it together
--> 164 vae = Model(inputs, outputs, name='vae_mlp')
    165 

~\Anaconda3\lib\site-packages\keras\legacy\interfaces.py in wrapper(*args, **kwargs)
     89                 warnings.warn('Update your `' + object_name + '` call to the ' +
     90                               'Keras 2 API: ' + signature, stacklevel=2)
---> 91             return func(*args, **kwargs)
     92         wrapper._original_function = func
     93         return wrapper

~\Anaconda3\lib\site-packages\keras\engine\network.py in __init__(self, *args, **kwargs)
     91                 'inputs' in kwargs and 'outputs' in kwargs):
     92             # Graph network
---> 93             self._init_graph_network(*args, **kwargs)
     94         else:
     95             # Subclassed network

~\Anaconda3\lib\site-packages\keras\engine\network.py in _init_graph_network(self, inputs, outputs, name)
    229         # Keep track of the network's nodes and layers.
    230         nodes, nodes_by_depth, layers, layers_by_depth = _map_graph_network(
--> 231             self.inputs, self.outputs)
    232         self._network_nodes = nodes
    233         self._nodes_by_depth = nodes_by_depth

~\Anaconda3\lib\site-packages\keras\engine\network.py in _map_graph_network(inputs, outputs)
   1441                                          'The following previous layers '
   1442                                          'were accessed without issue: ' +
-> 1443                                          str(layers_with_complete_input))
   1444                 for x in node.output_tensors:
   1445                     computable_tensors.append(x)

ValueError: Graph disconnected: cannot obtain value for tensor Tensor("labels_3:0", shape=(?, 10), dtype=float32) at layer "labels". The following previous layers were accessed without issue: ['encoder_input', 'encoder']

Может кто-нибудь, пожалуйста, укажите мне в правильном направлении! Спасибо!

1 Ответ

0 голосов
/ 12 февраля 2020

Следующее сработало! Я не передал метку-заполнитель.


from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

from keras.layers import Lambda, Input, Dense, Concatenate
from keras.models import Model
from keras.datasets import mnist
from keras.losses import mse, binary_crossentropy
from keras.utils import np_utils

from keras import backend as K

import numpy as np
import matplotlib.pyplot as plt
import argparse
import os



# reparameterization trick
# instead of sampling from Q(z|X), sample epsilon = N(0,I)
# z = z_mean + sqrt(var) * epsilon
def sampling(args):
    """Reparameterization trick by sampling from an isotropic unit Gaussian.

    # Arguments
        args (tensor): mean and log of variance of Q(z|X)

    # Returns
        z (tensor): sampled latent vector
    """

    z_mean, z_log_var = args
    batch = K.shape(z_mean)[0]
    dim = K.int_shape(z_mean)[1]
    # by default, random_normal has mean = 0 and std = 1.0
    epsilon = K.random_normal(shape=(batch, dim))
    return z_mean + K.exp(0.5 * z_log_var) * epsilon


def plot_results(models,
                 data,
                 batch_size=128,
                 model_name="vae_mnist"):
    """Plots labels and MNIST digits as a function of the 2D latent vector

    # Arguments
        models (tuple): encoder and decoder models
        data (tuple): test data and label
        batch_size (int): prediction batch size
        model_name (string): which model is using this function
    """

    encoder, decoder = models
    x_test, y_test = data
    os.makedirs(model_name, exist_ok=True)

    filename = os.path.join(model_name, "vae_mean.png")
    # display a 2D plot of the digit classes in the latent space
    z_mean, _, _ = encoder.predict(x_test,
                                   batch_size=batch_size)
    plt.figure(figsize=(12, 10))
    plt.scatter(z_mean[:, 0], z_mean[:, 1], c=y_test)
    plt.colorbar()
    plt.xlabel("z[0]")
    plt.ylabel("z[1]")
    plt.savefig(filename)
    plt.show()

    filename = os.path.join(model_name, "digits_over_latent.png")
    # display a 30x30 2D manifold of digits
    n = 30
    digit_size = 28
    figure = np.zeros((digit_size * n, digit_size * n))
    # linearly spaced coordinates corresponding to the 2D plot
    # of digit classes in the latent space
    grid_x = np.linspace(-4, 4, n)
    grid_y = np.linspace(-4, 4, n)[::-1]

    for i, yi in enumerate(grid_y):
        for j, xi in enumerate(grid_x):
            z_sample = np.array([[xi, yi]])
            x_decoded = decoder.predict(z_sample)
            digit = x_decoded[0].reshape(digit_size, digit_size)
            figure[i * digit_size: (i + 1) * digit_size,
                   j * digit_size: (j + 1) * digit_size] = digit

    plt.figure(figsize=(10, 10))
    start_range = digit_size // 2
    end_range = (n - 1) * digit_size + start_range + 1
    pixel_range = np.arange(start_range, end_range, digit_size)
    sample_range_x = np.round(grid_x, 1)
    sample_range_y = np.round(grid_y, 1)
    plt.xticks(pixel_range, sample_range_x)
    plt.yticks(pixel_range, sample_range_y)
    plt.xlabel("z[0]")
    plt.ylabel("z[1]")
    plt.imshow(figure, cmap='Greys_r')
    plt.savefig(filename)
    plt.show()

# MNIST dataset
(x_train, y_train), (x_test, y_test) = mnist.load_data()

n_classes = 10

y_train_1hot = np_utils.to_categorical(y_train, n_classes)
y_test_1hot = np_utils.to_categorical(y_test, n_classes)

image_size = x_train.shape[1]
original_dim = image_size * image_size
x_train = np.reshape(x_train, [-1, original_dim])
x_test = np.reshape(x_test, [-1, original_dim])
x_train = x_train.astype('float32') / 255
x_test = x_test.astype('float32') / 255

#x_train=np.concatenate((x_train,y_train_1hot),axis=1)
#x_test=np.concatenate((x_test,y_test_1hot),axis=1)

# network parameters
input_shape = (original_dim, )
intermediate_dim = 512
batch_size = 128
latent_dim = 2
epochs = 50


# VAE model Part 1 - Encoder
# build encoder model
inputs = Input(shape=input_shape, name='encoder_input')
label_inputs = Input(shape=(n_classes,), name='encoder_labels')
merged=Concatenate(axis=-1)([inputs, label_inputs])

x = Dense(intermediate_dim, activation='relu')(merged)
z_mean = Dense(latent_dim, name='z_mean')(x)
z_log_var = Dense(latent_dim, name='z_log_var')(x)

# use reparameterization trick to push the sampling out as input
# note that "output_shape" isn't necessary with the TensorFlow backend
z = Lambda(sampling, output_shape=(latent_dim,), name='z')([z_mean, z_log_var])

# instantiate encoder model
encoder = Model([inputs, label_inputs], [z_mean, z_log_var, z], name='encoder')
encoder.summary()
#np_utils(encoder, to_file='vae_mlp_encoder.png', show_shapes=True) #ERROR!!

# VAE model Part 2 - Decoder

# build decoder model
latent_inputs = Input(shape=(latent_dim,), name='z_sampling')
#label_inputs = Input(shape=(n_classes,), name='labels')
merged=Concatenate(axis=-1)([latent_inputs, label_inputs])

x = Dense(intermediate_dim, activation='relu')(merged)
outputs = Dense(original_dim, activation='sigmoid')(x)
decoder = Model(inputs=[latent_inputs, label_inputs], outputs=[outputs], name='decoder')

decoder.summary()

outputs = decoder([encoder([inputs,label_inputs])[2], label_inputs])

# Putting it together
vae = Model([inputs,label_inputs ], outputs, name='vae_mlp')

#weird error on validation_data - InvalidArgumentError: You must feed a value for placeholder tensor 
import keras.backend as K
K.clear_session()


if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    help_ = "Load h5 model trained weights"
    parser.add_argument("-w", "--weights", help=help_)
    help_ = "Use mse loss instead of binary cross entropy (default)"
    parser.add_argument("-m",
                        "--mse",
                        help=help_, action='store_true')
    args = parser.parse_args(args=[])
    models = (encoder, decoder)
    data = (x_test, y_test)

    # VAE loss = mse_loss or xent_loss + kl_loss
    if args.mse:
        reconstruction_loss = mse(inputs, outputs)
    else:
        reconstruction_loss = binary_crossentropy(inputs,
                                                  outputs)

    reconstruction_loss *= original_dim
    kl_loss = 1 + z_log_var - K.square(z_mean) - K.exp(z_log_var)
    kl_loss = K.sum(kl_loss, axis=-1)
    kl_loss *= -0.5
    vae_loss = K.mean(reconstruction_loss + kl_loss)
    vae.add_loss(vae_loss)
    vae.compile(optimizer='adam')
    vae.summary()
    #np_utils(vae,to_file='vae_mlp.png',show_shapes=True)

    if args.weights:
        vae.load_weights(args.weights)
    else:
        # train the autoencoder
        vae.fit([x_train,y_train_1hot],
                epochs=epochs,
                batch_size=batch_size,
                validation_data=([x_test,y_test_1hot], None))
        vae.save_weights('vae_mlp_mnist.h5')


    plot_results(models,
                 data,
                 batch_size=batch_size,
                 model_name="vae_mlp")






Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...