Python keras/tensorflow需要向占位符提供不必要的值
我正在使用Keras和TF后端。最近,在使用函数API创建“混合”模型时,我觉得Keras需要我提供它不需要的值 作为背景,我试图在Keras中实现一个条件GAN。我的实现有一个生成器和一个鉴别器。例如,生成器接受(20,20,1)输入并返回(20,20,1)输出。它们按通道堆叠,以产生(20,20,2)输入到鉴别器。鉴别器应该决定它是看到原始(20,20,1)图像的地面真值翻译还是生成器的翻译。这表示为0=假,1=真 鉴别器本身只是用于二元分类的CNN。因此,它可以通过在{0,1}中输入形状(20,20,2)和输出数据点来训练。因此,如果我写下如下内容:Python keras/tensorflow需要向占位符提供不必要的值,python,machine-learning,tensorflow,keras,Python,Machine Learning,Tensorflow,Keras,我正在使用Keras和TF后端。最近,在使用函数API创建“混合”模型时,我觉得Keras需要我提供它不需要的值 作为背景,我试图在Keras中实现一个条件GAN。我的实现有一个生成器和一个鉴别器。例如,生成器接受(20,20,1)输入并返回(20,20,1)输出。它们按通道堆叠,以产生(20,20,2)输入到鉴别器。鉴别器应该决定它是看到原始(20,20,1)图像的地面真值翻译还是生成器的翻译。这表示为0=假,1=真 鉴别器本身只是用于二元分类的CNN。因此,它可以通过在{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.fit()应该仍然有效,对吗
我认为可以通过冻结生成器的权重并在整个堆栈上使用fit()来解决问题,但我不明白上面的方法为什么不起作用
这可能是范围界定的问题吗
编辑:鉴别器实际上只是一个简单的CNN。它用disc=pix2pix\u鉴别器初始化(输入形状=(20,20,2),n\u过滤器=(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.5的张量输入任意_。这是有意的吗?它应该是真实的数据吗?我已经编辑了这个问题,以包括鉴别器的架构,尽管我很确定它只是一个CNN。稍后我当然会提供真实数据,但管道应该可以处理真实数据和虚假数据,所以我现在正在使用它进行测试。它不应该是
disc\u output=disc(pair)
?
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"]()]]
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