Keras 自动编码器负损耗和val_loss范围内的数据在 [-1 1] 范围内



我正在尝试将 keras 自动编码器示例改编为我的数据。我有以下网络:

Xtrain = np.reshape(Xtrain, (len(Xtrain), 28, 28, 2))
Xtest = np.reshape(Xtest, (len(Xtest), 28, 28, 2))
input_signal = Input(shape=(28, 28, 2))
x = Conv2D(16, (3, 3), activation='relu', padding='same')(input_signal)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
encoded = MaxPooling2D((2, 2), padding='same', name='encoder')(x)
# added Dense layers, is that correct?
encoded2 = Flatten()(encoded)
encoded2 = Dense(128, activation='sigmoid')(encoded2)
encoded2 = Dense(128, activation='softmax')(encoded2)
encoded3 = Reshape((4, 4, 8))(encoded2)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(encoded3)
x = UpSampling2D((2, 2))(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = UpSampling2D((2, 2))(x)
x = Conv2D(16, (3, 3), activation='relu')(x)
x = UpSampling2D((2, 2))(x)
decoded = Conv2D(2, (3, 3), activation='sigmoid', padding='same')(x)
autoencoder = Model(inputs=input_signal, outputs=decoded)
encoder = Model(input_signal, encoded2)
autoencoder.compile(optimizer='adam', loss='binary_crossentropy')
autoencoder.fit(Xtrain, Xtrain, epochs=100, batch_size=128, shuffle=True, validation_data=(Xtest, Xtest))

而且,当我在 MNIST 数据上运行时,这些数据被标准化为 [0,1],一切正常,但对于我在 [-1,1] 范围内的数据,我在训练时只看到负损失和 0.0000 精度。如果我做 data = np.abs(data),训练开始并且看起来很顺利,但是对数据做 abs() 没有理由训练数据伪造。

我尝试馈送到网络的数据是信号的 IQ 通道、实部的第一通道和 imag 部分的第二通道,因此两者都归一化为 [-1 1],并且通常都包含非常低的值,例如 5e-12。我将它们塑造成 (28,28,2) 输入。

我还在自动编码器的中间添加了密集层,因为我希望在自动编码器完成训练时对类(自动拟合)进行预测。我这样做是否正确,这会破坏网络吗?

您的问题有几个问题,包括您对自动编码器及其用法的理解。我强烈建议至少阅读 Keras 博客文章 在 Keras 中构建自动编码器(如果你已经经历过它,可以说你必须再做一次,这次更彻底)。

一些一般观点,其中大部分包含在上面的链接帖子中:

  1. 自动编码器用于分类,因此要求准确性等指标是没有意义的。同样,由于拟合目标是重建其输入,因此分类交叉熵不是要使用的正确损失函数(尝试使用二进制交叉熵)。
  2. 你使用的中间密集层的存在本身是令人费解的,更令人费解的是选择一个sigmoid层,然后是一个softmax层;在你的最终decoded层中,sigmoid选择也是如此。这两个激活函数通常用于最后一层的分类目的,因此再次参考上面的第(1)点。
  3. 我强烈建议您从上面链接的博客文章中演示的模型开始,如有必要,逐步修改它以适应您的目的,因为我不确定您在这里构建的内容甚至可以首先成为自动编码器。

你在二进制('sigmoid')和分类('softmax'和'categorical_crossentropy')之间混合。更改以下内容:

  1. 删除中间的密集层,并将"编码"而不是"编码3"馈送到解码器
  2. 将自动编码器损耗更改为"binary_crossentropy">

或者,如果您真的想尝试中间的密集层,只需在没有激活功能的情况下使用它们(无)

相关内容

  • 没有找到相关文章

最新更新