Graph disconnected:无法获取tensor tensor Keras Python的值

Graph disconnected:无法获取tensor tensor Keras Python的值,python,tensorflow,keras,Python,Tensorflow,Keras,这里是新手!我试图修改给定的变分自动编码器的代码,使其成为条件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

这里是新手!我试图修改给定的变分自动编码器的代码,使其成为条件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']
---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在里面
162
163#把它放在一起
-->164 vae=模型(输入、输出,名称='vae\U mlp')
165
包装中的~\Anaconda3\lib\site packages\keras\legacy\interfaces.py(*args,**kwargs)
89 warnings.warn('Update your`'+object\u name+'`调用+
90'Keras 2 API:'+签名,堆栈级别=2)
--->91返回函数(*args,**kwargs)
92包装器._原始函数=func
93返回包装器
~\Anaconda3\lib\site packages\keras\engine\network.py in\uuuuuu init\uuuuuu(self,*args,**kwargs)
91 kwargs中的“输入”和kwargs中的“输出”:
92#图形网络
--->93自初始化图网络(*args,**kwargs)
94.其他:
95#子类网络
~\Anaconda3\lib\site packages\keras\engine\network.py in\u init\u graph\u network(self、输入、输出、名称)
229#跟踪网络的节点和层。
230个节点,节点按深度,层,层按深度=\u地图\u图形\u网络(
-->231自输入、自输出)
232自。\网络\节点=节点
233 self.\u nodes\u by\u depth=nodes\u by\u depth
网络中的~\Anaconda3\lib\site packages\keras\engine\network.py(输入、输出)
1441“以下前几层”
1442'访问时未出现问题:'+
->1443 str(带完整输入的图层)
1444对于节点中的x.output_张量:
1445可计算的_张量。附加(x)
ValueError:图形已断开连接:无法获取层“labels”处的张量张量(“labels_3:0”,shape=(?,10),dtype=float32)的值。访问以下以前的层时没有问题:['encoder_input','encoder']

有人能给我指一下正确的方向吗!谢谢

以下方法奏效了!我不是传递标签占位符的人


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







你能详细说明你到目前为止所做的任何更改吗?嘿,我添加了以下几行-n_classes=10 y_train\u 1hot=np_utils.to_category(y_train,n_classes)y_test\u 1hot=np_utils.to_category(y_test,n_classes)和这些标签输入=输入(shape=(n_classes),name=(encoder\u标签)合并=连接(axis=-1)([输入,标签输入])用于编码器和解码器。非常抱歉格式化,我不知道它是如何工作的。