【问题标题】:Keras add data with Sequential layersKeras 使用顺序层添加数据
【发布时间】:2017-08-01 19:17:04
【问题描述】:

我在 Keras 中有两个顺序模型:

def generator_model():
    model = Sequential()
    model.add(LSTM(512, return_sequences=False, input_shape=(3, 100*100)))
    model.add(Dense(100*100))
    model.add(Reshape((1, 100, 100), input_shape=(100*100,)))
    model.add(Activation('sigmoid'))
    model.compile(optimizer='adadelta', loss='categorical_crossentropy');
    return model

def discriminator_model():
    model = Sequential()
    model.add(LSTM(512, return_sequences=False, input_shape=(4, 100*100)))
    model.add(Dense(100*100))
    model.add(Dense(1))
    model.add(Activation('sigmoid'))
    model.compile(optimizer='adadelta', loss='categorical_crossentropy');
    return model

我还具有将这些模型连接在一起的功能。我正在尝试用生成器和鉴别器作为 lstm 来训练生成对抗网络。这就是我需要这个功能的原因

def generator_containing_discriminator(generator, discriminator):
    model = Sequential()
    model.add(generator)
    discriminator.trainable = False
    model.add(discriminator)
    return model

我用它来训练网络

g_loss = discriminator_on_generator.train_on_batch(noise, [1] * BATCH_SIZE)
discriminator.trainable = True
print("batch %d g_loss : %f" % (index, g_loss))

为了让训练的最后一个 sn-p 代码正常工作,生成器和判别器应该能够合并在一起。但是,我的生成器的输出无法输入到我的鉴别器中,因为我需要在生成器的输出中添加一些数据,然后再将其发送到鉴别器中。如何在 Keras 中执行此操作,以便将鉴别器添加到生成器中?有没有办法在model.add 函数中添加数据?我在 Keras 文档中找不到任何内容

【问题讨论】:

  • 您的附加数据是什么样的?
  • 我将生成器的输出重塑为 1x10000 矩阵,然后将其与其他 3 个 1x10000 矩阵连接。然后我将这个获得的矩阵和一个标签(1 或 0)传递给鉴别器来训练它。
  • 那么您的Reshape 形状设置正确吗?

标签: python neural-network deep-learning keras recurrent-neural-network


【解决方案1】:

试试这个:

def generator_containing_discriminator(generator, discriminator):
    model = Sequential()
    list_of_dicriminator_inputs = [generator]

    for _ in range(3):
        auxiliary_model = Sequential()
        auxiliary_model.add(Reshape((1, 100*100), input_shape=(100 * 100,)))
        list_of_dicriminator_inputs.append(auxiliary_model)

    extended_generator_output = Merge(list_of_dicriminator_inputs,
                                      mode="concat",
                                      concat_axis=1)
    model.add(extended_generator_output)
    discriminator.trainable = False
    model.add(discriminator)
    return model

为了使它起作用,您应该更改 generator 代码的这一行:

model.add(Reshape((1, 100 * 100), input_shape=(100*100,)))

【讨论】:

  • 谢谢。你能简要解释一下你的代码吗?我对 keras 有点陌生。另外,我应该将生成器中的那条线更改为什么?
  • Merge 层正在获取 4 个模型的列表,并沿第一个输入轴将它们连接起来,在您的情况下是“时间步长”维度。然后将其馈送到您的 discriminator 模型。
  • 我现在对g_loss = discriminator_on_generator.train_on_batch(noise, [1] * BATCH_SIZE) 的输入应该是什么?我现在的noise 矩阵是BATCH_SIZEx4x10000 并且出现错误说The model expects 4 input arrays, but only received one array. Found: array with shape (4, 10000)
  • 您应该提供一个包含[input_generator, mat1, mat2, mat3] 的列表,其中每个mat 的形状应为(nb_of_examples, 1, 100 * 100)input_generator 的形状应为(nb_of_examples, 3, 100 * 100)
  • 好的。我的生成器将采用 input_generator 并生成输出。让这个输出为 Y。然后我的鉴别器将按顺序将 mat1、mat2、mat3 和 Y 作为其 LSTM 的输入。我说的对吗?
猜你喜欢
  • 2017-06-13
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
  • 1970-01-01
  • 2021-12-12
  • 2021-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多