简体   繁体   English

TensorFlow 在生成带有 Conv1D 层的简单 GAN 时返回 ValueError

[英]TensorFlow returning ValueError while generating simple GAN with Conv1D layer

I´m trying to setup simple GAN with TF including Conv1D layer in the discriminator model.我正在尝试使用 TF 设置简单的 GAN,包括鉴别器模型中的 Conv1D 层。 To achieve correct output shape, I included Flatten layer.为了获得正确的输出形状,我包含了 Flatten 层。

Unfortunately, while adding generator and discriminator layer together, TF returns error "ValueError: Input tensor must be of rank 3, 4 or 5 but was 2."不幸的是,当将生成器和鉴别器层添加在一起时,TF 返回错误“ValueError: Input tensor must be of rank 3, 4 or 5 but was 2.” I tried to do the same with simplest dummy net and compiling of the GAN worked.我尝试用最简单的虚拟网络做同样的事情,并且 GAN 的编译工作正常。 I expect the trouble is in the input shape of the discriminator layer, but the error description does not give too much lead.我预计问题出在鉴别器层的输入形状上,但错误描述并没有给出太多的线索。

How could I deal with this type of error?我该如何处理这种类型的错误? Thank you in advance for your help.预先感谢您的帮助。

def define_discriminator(n_inputs=2):
    model = Sequential()
    model.add(Conv1D(filters = 128, kernel_size = 2, strides=1, input_shape = (n_inputs,1) ))
    model.add(LeakyReLU(alpha=0.2))
    model.add(Flatten())
    model.add(Dense(25, kernel_initializer='he_uniform'))
    model.add(LeakyReLU(alpha=0.2))
    model.add(Dense(1, activation='sigmoid'))

    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
    model.summary()
    return model

# simple dummy net
"""
model = Sequential()
model.add(Dense(25, activation='relu', kernel_initializer='he_uniform', input_dim=n_inputs))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()
return model
"""

def define_generator(latent_dim, n_outputs=2):
    model = Sequential()
    model.add(Dense(15, activation='relu', kernel_initializer='he_uniform', input_dim=latent_dim))
    model.add(Dense(n_outputs, activation='linear'))
    model.summary()
    return model

def define_gan(generator, discriminator):
    discriminator.trainable = False
    model = Sequential()
    model.add(generator)
    model.add(discriminator)
    model.compile(loss='binary_crossentropy', optimizer='adam')
    model.summary()
    return model

Complete Error message here:在此处完成错误消息:

Traceback (most recent call last):
  File "C:/pracovni_addr/python_projects/GAN_1D.py", line 181, in <module>
    gan_model = define_gan(m_gen, m_disc)
  File "C:/pracovni_addr/python_projects/GAN_1D.py", line 115, in define_gan
    model.add(discriminator)
  File "C:\Users\CLIENT\AppData\Local\Programs\Python\Python37\lib\site-packages\keras\engine\sequential.py", line 182, in add
    output_tensor = layer(self.outputs[0])
  File "C:\Users\CLIENT\AppData\Local\Programs\Python\Python37\lib\site-packages\keras\backend\tensorflow_backend.py", line 75, in symbolic_fn_wrapper
    return func(*args, **kwargs)
  File "C:\Users\CLIENT\AppData\Local\Programs\Python\Python37\lib\site-packages\keras\engine\base_layer.py", line 489, in __call__
    output = self.call(inputs, **kwargs)
  File "C:\Users\CLIENT\AppData\Local\Programs\Python\Python37\lib\site-packages\keras\engine\network.py", line 583, in call
    output_tensors, _, _ = self.run_internal_graph(inputs, masks)
  File "C:\Users\CLIENT\AppData\Local\Programs\Python\Python37\lib\site-packages\keras\engine\network.py", line 740, in run_internal_graph
    layer.call(computed_tensor, **kwargs))
  File "C:\Users\CLIENT\AppData\Local\Programs\Python\Python37\lib\site-packages\keras\layers\convolutional.py", line 163, in call
    dilation_rate=self.dilation_rate[0])
  File "C:\Users\CLIENT\AppData\Local\Programs\Python\Python37\lib\site-packages\keras\backend\tensorflow_backend.py", line 3671, in conv1d
    **kwargs)
  File "C:\Users\CLIENT\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\ops\nn_ops.py", line 917, in convolution_v2
    name=name)
  File "C:\Users\CLIENT\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\ops\nn_ops.py", line 969, in convolution_internal
    "Input tensor must be of rank 3, 4 or 5 but was {}.".format(n + 2))
ValueError: Input tensor must be of rank 3, 4 or 5 but was 2.

So the error was in the wrong shape of the generator output (discriminator expects the input shape as (None, 2, 1), but only (None, 2) was given.所以错误在于生成器输出的错误形状(鉴别器期望输入形状为 (None, 2, 1),但只给出了 (None, 2)。

Problem solved with:问题解决了:

    model.add(Reshape((n_outputs,1)))

before

    model.sumary() 

in define_generator blockdefine_generator块中

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM