gpt4 book ai didi

python - test_on_batch 和 train_on_batch 的不同损失值

转载 作者:行者123 更新时间:2023-11-30 09:18:33 25 4
gpt4 key购买 nike

在尝试训练 GAN 来生成图像时,我遇到了一个无法解释的问题。

训练生成器时,train_on_batch 在经过 2 或 3 次迭代后返回的损失直接降至零。经过调查,我意识到 train_on_batch 方法有一些奇怪的行为:

当我检查以下内容时:

noise = np.random.uniform(-1.0, 1.0, size=[batch_size, gen_noise_length])
predictions = GAN.stackedModel.predict(noise)

正如我所期望的,这会返回接近于零的值,因为生成器尚未经过训练。

但是:

y = np.ones([batch_size, 1])
noise = np.random.uniform(-1.0, 1.0, size=[batch_size, gen_noise_length])
loss = GAN.stackedModel.train_on_batch(noise, y)

这里的损失几乎为零,尽管我的预期目标是显而易见的。当我运行时:

y = np.ones([batch_size, 1])
noise = np.random.uniform(-1.0, 1.0, size=[batch_size, gen_noise_length])
loss = GAN.stackedModel.test_on_batch(noise, y)

返回的损失正如我预期的那样高。

train_on_batch 方法发生了什么?我真的一无所知...

编辑

我的损失是二元交叉熵,我构建的模型如下:

def createStackedModel(self):
# Build stacked GAN model
gan_in = Input([self.noise_length])
H = self.genModel(gan_in)
gan_V = self.disModel(H)
GAN = Model(gan_in, gan_V)
opt = RMSprop(lr=0.0001, decay=3e-8)
GAN.compile(loss='binary_crossentropy', optimizer=opt, metrics=['accuracy'])
return GAN

编辑2

生成器是通过堆叠其中一些 block 来构造的,每个 block 都包含 BatchNormalization:

    self.G.add(UpSampling2D())
self.G.add(Conv2DTranspose(int(depth/8), 5, padding='same'))
self.G.add(BatchNormalization(momentum=0.5))
self.G.add(Activation('relu'))

编辑3

我将代码加载到 https://gitlab.com/benjamingraf24/DCGAN/显然,这个问题是由我构建 GAN 网络的方式造成的。所以GANBuilder.py中肯定有问题。但是,我找不到它......

最佳答案

BatchNormalization 层在训练和测试阶段的行为有所不同。

在训练阶段,他们将使用激活的当前批处理均值和方差进行标准化。

但是,在测试阶段,他们使用在训练期间收集的移动均值和移动方差。如果没有足够的预先训练,这些收集的值可能与实际批处理统计数据相距甚远,从而导致显着的损失值差异。

请参阅Keras documentation for BatchNormalizationmomentum 参数用于定义移动平均值和移动平均值在训练期间适应新收集的批处理值的速度。

关于python - test_on_batch 和 train_on_batch 的不同损失值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48997385/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com