Новичок 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']
Может кто-нибудь, пожалуйста, укажите мне в правильном направлении! Спасибо!