ValueError: all the input array dimensions for the concatenation axis must match exactly, but along dimension 3, the array at index 0 has size 3

Подскажите, как решить эту проблему?

Если нужно могу приложить Jupyter Notebook и папку с файлами (там изображения).

Код:

def define_discriminator(in_shape = (106, 106, 1)):
    model = Sequential()
    model.add(Conv2D(64, (3,3), strides = (2,2), padding = "same", input_shape = in_shape))
    model.add(LeakyReLU(alpha = 0.2))
    model.add(Dropout(0.5))
    model.add(Conv2D(64, (3,3), strides = (2,2), padding = "same"))
    model.add(LeakyReLU(alpha = 0.2))
    model.add(Dropout(0.5))
    model.add(Flatten())
    model.add(Dense(1, activation = "sigmoid"))
    opt = Adam(learning_rate = 0.0002, beta_1 = 0.5)
    model.compile(loss = "binary_crossentropy", optimizer = opt, metrics = ["accuracy"])
    return model
def define_generator(latent_dim):
    model = Sequential()
    n_nodes = 128 * 53 * 53
    model.add(Dense(n_nodes, input_dim = latent_dim))
    model.add(LeakyReLU(alpha = 0.2))
    model.add(Reshape((53, 53, 128)))
    model.add(Dense(1024))
    model.add(Conv2DTranspose(1024, (4,4), strides = (2,2), padding = "same"))
    model.add(Dense(1024))
    model.add(LeakyReLU(alpha = 0.2))
    model.add(Dense(1024))
    model.add(Conv2D(1, (7,7), padding = "same", activation = "sigmoid"))
    return model
def define_gan(g_model, d_model):
    d_model.trianabel = False
    model = Sequential()
    model.add(g_model)
    model.add(d_model)
    opt = Adam(learning_rate = 0.0002, beta_1 = 0.5)
    model.compile(loss = "binary_crossentropy", optimizer = opt)
    return model
def generate_real_samples(dataset, n_samples):
    ix = randint(0, dataset.shape[0], n_samples)
    X = dataset[ix].T
    Y = ones((n_samples, 1)).T
    return X, Y

def generate_latent_points(latent_dim, n_samples):
    x_input = randn(latent_dim * n_samples)
    x_input = x_input.reshape(n_samples, latent_dim)
    return x_input

def generate_fake_samples(g_model, latent_dim, n_samples):
    x_input = generate_latent_points(latent_dim, n_samples)
    X = g_model.predict(x_input).T
    Y = zeros((n_samples, 1)).T
    return X, Y

import tensorflow as tf
def train(g_model, d_model, gan_model, dataset, latent_dim, n_epochs=51, n_batch=10):
    bat_per_epo = int(dataset.shape[0] / n_batch)
    half_batch = int(n_batch / 2)
    for i in range(n_epochs):
        for j in range(bat_per_epo):
            X_real, y_real = generate_real_samples(dataset, half_batch)
            X_fake, y_fake = generate_fake_samples(g_model, latent_dim, half_batch)
            print(X_real, X_fake)
            print(y_real, y_fake)
            X, y = vstack((X_real, X_fake)), vstack((y_real, y_fake))
            d_loss, _ = d_model.train_on_batch(X, y)
            X_gan = generate_latent_points(latent_dim, n_batch)
            y_gan = ones((n_batch, 1))
            g_loss = gan_model.train_on_batch(X_gan, y_gan)
            print('>%d, %d/%d, d=%.3f, g=%.3f' % (i+1, j+1, bat_per_epo, d_loss, g_loss))
        if (i+1) % 10 == 0:
            summarize_performance(i, g_model, d_model, dataset, latent_dim)
            clear_output()

latent_dim = 100
d_model = define_discriminator()
g_model = define_generator(latent_dim)
gan_model = define_gan(g_model, d_model)
print(pixels.shape)
train(g_model, d_model, gan_model, np.array(pixels), latent_dim)<code lang="python">

Сообщение об ошибке:

 -------------------------------------------------------------------- -------
ValueError                                Traceback (most recent call 
last)
<ipython-input-482-b3360c520333> in <module>
      4 gan_model = define_gan(g_model, d_model)
      5 print(pixels.shape)
----> 6 train(g_model, d_model, gan_model, np.array(pixels), 
latent_dim)

<ipython-input-481-051ded2aca77> in train(g_model, d_model, 
gan_model, 
dataset, latent_dim, n_epochs, n_batch)
      9             print(X_real, X_fake)
     10             print(y_real, y_fake)
---> 11             X, y = vstack((X_real, X_fake)), vstack((y_real, 
y_fake))
     12             d_loss, _ = d_model.train_on_batch(X, y)
     13             X_gan = generate_latent_points(latent_dim, 
n_batch)

<__array_function__ internals> in vstack(*args, **kwargs)

~\anaconda3\envs\LikeProject\lib\site- 
packages\numpy\core\shape_base.py 
in vstack(tup)
    281     if not isinstance(arrs, list):
    282         arrs = [arrs]
--> 283     return _nx.concatenate(arrs, 0)
    284 
    285 

<__array_function__ internals> in concatenate(*args, **kwargs)

ValueError: all the input array dimensions for the concatenation axis 
must match exactly, but along dimension 3, the array at index 0 has 
size 3 and the array at index 1 has size 1

Ответы (1 шт):

Автор решения: MaxU

Для начала разнесите X, y = vstack((X_real, X_fake)), vstack((y_real, y_fake)) на две строки, чтобы понять в каком из vstack() возникает данная ошибка.

После этого сравните размерности объединяемых матриц. Ошибка явно указывает на то что все размерности (кроме числа экземпляров) должны совпадать.

Например мы хотим объединить тензор цветных картинок размерностью (10000, 120, 120, 3) (10.000 цветных картинок разрешения 120x120 x3 цветовых канала) с тензором цветных картинок размерностью (4000, 120, 120, 3) (4.000 цветных картинок разрешения 120x120 x3 цветовых канала) и в итоге мы получим тензор размерностью (14000, 120, 120, 3). Обратите внимание что размерности по осям 1, 2, 3 совпадают - (120, 120, 3). Т.е. наши тензоры это собранные воедино трехразмерные матрицы (где каждая 3D маитрица представляет собой одну картинку размерности 120x120 и имеет три цветовых канала: RGB) и все эти картинки (трехмерные матрицы) собрали вместе и получили четырехразмерную матрицу (тензор) размерности (N, 120, 120, 3) , где N - число картинок.

Очевидно в вашем случае это не так.

→ Ссылка