Получите ошибку «InvalidArgumentError: Несовместимые формы», но не ясно, почему - PullRequest
0 голосов
/ 21 февраля 2020

Я пытаюсь создать Variational Autoencoder, который должен быть обучен на изображениях некоторых кошек (224,224,3). После создания архитектуры (с помощью нескольких учебных пособий, так как я новичок в автоэнкодере, [основной источник] [1]), я попытался согласовать модель с имеющимися у меня данными. Но я получил ошибку

InvalidArgumentError: Несовместимые формы: [40,224,224] против [40] [[градиенты узла / add_1_grad / BroadcastGradientArgs (определены в / Users / Philipp / anaconda3 / lib / python3 6 ошибка, которая была бы велика. Заранее спасибо!

Система:

  • macOS 10.15.2
  • Python 3.6.9
  • Керас 2.3.1
  • TF 2.0.0
from ProcessData import process_dataset
import matplotlib.pyplot as plt
from keras.utils import plot_model
from keras.losses import binary_crossentropy
X_train,y_train,X_test,y_test = process_dataset(size=(224,224))
X_train_cats = X_train[:200]
X_test_cats = X_test[:40]

process_dataset возвращает X_train (1000,224,224,3) и X_test (200,224,224)

from keras.layers import Input, Dense, Conv2D, MaxPooling2D, UpSampling2D, Conv2DTranspose, Flatten, Reshape, GlobalAveragePooling2D,Lambda
from keras.models import Model,Sequential
import keras as K
import tensorflow as tf
number_training = len(X_train_cats)
batch_size = 40
epochs = 20
latent_space = 10
image_size = 224

Функция кодирования

def encoder():
    input_img = Input(shape=(224, 224, 3),name="encoder_input")  # adapt this if using `channels_first` image data format

    x = Conv2D(32, (3, 3), activation='relu',padding="same")(input_img)
    x = MaxPooling2D((2, 2))(x)
    x = Conv2D(64, (3, 3), activation='relu',padding="same")(x)
    x = MaxPooling2D((2, 2))(x)
    x = Conv2D(128, (3, 3), activation='relu',padding="same")(x)
    x = MaxPooling2D((2, 2))(x)
    x = Flatten()(x)
    z_mean = Dense(latent_space,name="z_mean")(x)
    z_log_var = Dense(latent_space,name="z_std")(x)

    z = Lambda(sampling, output_shape=(latent_space,))([z_mean, z_log_var])

    encoder = Model(input_img, [z_mean, z_log_var, z], name='encoder')
    return encoder, input_img, z_mean, z_log_var

Выборочная функция

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
    """
    #dim should be correct (40,10)
    z_mean, z_log_var = args
    batch = K.backend.shape(z_mean)[0]
    dim = K.backend.int_shape(z_mean)[1]
    # by default, random_normal has mean = 0 and std = 1.0
    epsilon = K.backend.random_normal(shape=(batch, dim))
    return z_mean + K.backend.exp(0.5 * z_log_var) * epsilon

Декодер

def decoding():
    latent_inputs = Input(shape=(latent_space,), name='z_sampling')
    x = Dense(100352)(latent_inputs)
    x = Reshape((28,28,128))(x)
    x = Conv2D(128, (3, 3), activation='relu', padding='same')(x)
    x = UpSampling2D((2, 2))(x)
    x = Conv2D(64, (3, 3), activation='relu', padding='same')(x)
    x = UpSampling2D((2, 2))(x)
    x = Conv2D(32, (3, 3), activation='relu',padding="same")(x)
    x = UpSampling2D((2, 2))(x)
    outputs = Conv2DTranspose(3, (3, 3), activation='sigmoid',padding="same")(x)

    # instantiate decoder model
    decoder = Model(latent_inputs, outputs, name='decoder')
    return decoder,outputs

Собираем все вместе

encoder, input_img, z_mean, z_log_var = encoder()
encoder.summary()
plot_model(encoder, to_file='vae_mlp_encoder.png', show_shapes=True,rankdir="LR",dpi=100)
decoder, outputs = decoding()
decoder.summary()
plot_model(decoder, to_file='vae_mlp_decoder.png', show_shapes=True,rankdir="LR",dpi=100)
# instantiate VAE model
outputs = decoder(encoder(input_img)[2])
vae = Model(input_img, outputs, name='vae_mlp')
reconstruction_loss = binary_crossentropy(input_img,outputs)
original_dim = image_size * image_size
reconstruction_loss *= original_dim

kl_loss = 1 + z_log_var - K.backend.square(z_mean) - K.backend.exp(z_log_var)
kl_loss = K.backend.sum(kl_loss, axis=-1)
kl_loss *= -0.5

vae_loss = K.backend.mean(reconstruction_loss + kl_loss)
vae.add_loss(vae_loss)

vae.compile(optimizer='adam')
vae.summary()
plot_model(vae,
           to_file='vae_mlp.png',
           show_shapes=True)

Пока здесь все работает

vae.fit(X_train_cats,
        epochs=epochs,
        batch_size=batch_size,
        validation_data=(X_test_cats,None))

Ошибка

Train on 200 samples, validate on 40 samples
Epoch 1/20
---------------------------------------------------------------------------
InvalidArgumentError                      Traceback (most recent call last)
<ipython-input-15-e4eec5a6e821> in <module>
      2         epochs=epochs,
      3         batch_size=batch_size,
----> 4         validation_data=(X_test_cats,None))

~/anaconda3/lib/python3.6/site-packages/keras/engine/training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_freq, max_queue_size, workers, use_multiprocessing, **kwargs)
   1237                                         steps_per_epoch=steps_per_epoch,
   1238                                         validation_steps=validation_steps,
-> 1239                                         validation_freq=validation_freq)
   1240 
   1241     def evaluate(self,

~/anaconda3/lib/python3.6/site-packages/keras/engine/training_arrays.py in fit_loop(model, fit_function, fit_inputs, out_labels, batch_size, epochs, verbose, callbacks, val_function, val_inputs, shuffle, initial_epoch, steps_per_epoch, validation_steps, validation_freq)
    194                     ins_batch[i] = ins_batch[i].toarray()
    195 
--> 196                 outs = fit_function(ins_batch)
    197                 outs = to_list(outs)
    198                 for l, o in zip(out_labels, outs):

~/anaconda3/lib/python3.6/site-packages/tensorflow_core/python/keras/backend.py in __call__(self, inputs)
   3738         value = math_ops.cast(value, tensor.dtype)
   3739       converted_inputs.append(value)
-> 3740     outputs = self._graph_fn(*converted_inputs)
   3741 
   3742     # EagerTensor.numpy() will often make a copy to ensure memory safety.

~/anaconda3/lib/python3.6/site-packages/tensorflow_core/python/eager/function.py in __call__(self, *args, **kwargs)
   1079       TypeError: For invalid positional/keyword argument combinations.
   1080     """
-> 1081     return self._call_impl(args, kwargs)
   1082 
   1083   def _call_impl(self, args, kwargs, cancellation_manager=None):

~/anaconda3/lib/python3.6/site-packages/tensorflow_core/python/eager/function.py in _call_impl(self, args, kwargs, cancellation_manager)
   1119       raise TypeError("Keyword arguments {} unknown. Expected {}.".format(
   1120           list(kwargs.keys()), list(self._arg_keywords)))
-> 1121     return self._call_flat(args, self.captured_inputs, cancellation_manager)
   1122 
   1123   def _filtered_call(self, args, kwargs):

~/anaconda3/lib/python3.6/site-packages/tensorflow_core/python/eager/function.py in _call_flat(self, args, captured_inputs, cancellation_manager)
   1222     if executing_eagerly:
   1223       flat_outputs = forward_function.call(
-> 1224           ctx, args, cancellation_manager=cancellation_manager)
   1225     else:
   1226       gradient_name = self._delayed_rewrite_functions.register()

~/anaconda3/lib/python3.6/site-packages/tensorflow_core/python/eager/function.py in call(self, ctx, args, cancellation_manager)
    509               inputs=args,
    510               attrs=("executor_type", executor_type, "config_proto", config),
--> 511               ctx=ctx)
    512         else:
    513           outputs = execute.execute_with_cancellation(

~/anaconda3/lib/python3.6/site-packages/tensorflow_core/python/eager/execute.py in quick_execute(op_name, num_outputs, inputs, attrs, ctx, name)
     65     else:
     66       message = e.message
---> 67     six.raise_from(core._status_to_exception(e.code, message), None)
     68   except TypeError as e:
     69     keras_symbolic_tensors = [

~/anaconda3/lib/python3.6/site-packages/six.py in raise_from(value, from_value)

InvalidArgumentError:  Incompatible shapes: [40,224,224] vs. [40]
     [[node add_1 (defined at /Users/Philipp/anaconda3/lib/python3.6/site-packages/tensorflow_core/python/framework/ops.py:1751) ]] [Op:__inference_keras_scratch_graph_3165]

Function call stack:
keras_scratch_graph
      [1]: https://github.com/keras-team/keras/blob/master/examples/variational_autoencoder.py
...