keras / tensorflow需要向占位符

时间:2017-04-03 22:47:01

标签: python machine-learning tensorflow keras

我正在使用带有TF后端的Keras。最近,当使用功能API制作“混合”模型时,我觉得Keras要求我提供它不应该需要的值。

作为背景,我正在尝试在Keras中实现条件GAN。我的实现有一个生成器和一个鉴别器。例如,发生器接受(20,20,1)输入和返回(20,20,1)输出。它们通过通道堆叠以产生到鉴别器的(20,20,2)输入。判别器应该决定它是否正在看原始(20,20,1)图像的地面实况转换或者发生器的转换。这表示为0 =假,1 =真实。

鉴别器本身就是用于二进制分类的CNN。因此,可以通过输入形状(20,20,2)的输入和{0,1}的输出来训练它。因此,如果我写了类似的东西:

# <disc> is the discriminator
arbitrary_input = np.full(shape=(5, 20, 20, 2), fill_value=0.5)
arbitrary_labels = np.array([1, 1, 0, 0, 1])
disc.fit(arbitrary_input, arbitrary_labels, epochs=5)

培训将毫无错误地进行(显然这是一个无用的数据集)。

但是,当我将鉴别器插入发生器鉴别器堆栈时:

# <disc> is the discriminator, <gen> is the generator
input = Input(shape=(20, 20, 1), name='stack_input')
gen_output = gen(input)
pair = Concatenate(axis=FEATURES_AXIS)([input, gen_output])
disc_output = disc(gen_output)

stack = Model(input, disc_output)
stack.compile(optimizer='adam', loss='binary_crossentropy')

arbitrary_input = np.full(shape=(5, 20, 20, 2), fill_value=0.5)
arbitrary_labels = np.array([1, 1, 0, 0, 1])

disc.fit(arbitrary_input, arbitrary_labels, epochs=5)

我突然需要额外的占位符。我在disc.fit()上收到此错误消息:

InvalidArgumentError (see above for traceback): You must feed a value for placeholder tensor 'stack_input' with dtype float
     [[Node: stack_input = Placeholder[dtype=DT_FLOAT, shape=[], _device="/job:localhost/replica:0/task:0/cpu:0"]()]]

正如您所知,这是混合/堆叠模型的输入。我根本没有改变鉴别器,我只把它包含在另一个模型中。因此disc.fit()应该仍然可以工作,对吧?

我认为,通过冻结生成器的权重并在完整堆栈上使用fit()可以获得一种解决方法,但我不明白为什么上面的方法不起作用。

这可能与范围界定有关吗?

编辑:鉴别器实际上只是一个简单的CNN。它用disc = pix2pix_discriminator(input_shape=(20, 20, 2), n_filters=(32, 64))初始化。有问题的功能是:

def pix2pix_discriminator(input_shape, n_filters, kernel_size=4, strides=2, padding='same', alpha=0.2):
x = Input(shape=input_shape, name='disc_input')

    # first layer
    h = Conv2D(filters=n_filters[0],
               kernel_size=kernel_size,
               strides=strides,
               padding=padding,
               data_format=DATA_FORMAT)(x)
    # no BatchNorm
    h = LeakyReLU(alpha=alpha)(h)

    for i in range(1, len(n_filters)):
        h = Conv2D(filters=n_filters[i],
                   kernel_size=kernel_size,
                   strides=strides,
                   padding=padding,
                   data_format=DATA_FORMAT)(h)
        h = BatchNorm(axis=FEATURES_AXIS)(h)
        h = LeakyReLU(alpha=alpha)(h)

    h_flatten = Flatten()(h)  # required for the upcoming Dense layer
    y_pred = Dense(units=1, activation='sigmoid')(h_flatten)  # binary output

    discriminator = Model(inputs=x, outputs=y_pred)
    discriminator.compile(optimizer='adam',
                          loss='binary_crossentropy',
                          metrics=['accuracy'])
    return discriminator

0 个答案:

没有答案