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

时间:2018-01-06 11:42:29

标签: machine-learning keras neural-network conv-neural-network autoencoder

我正在尝试将keras autoencoder示例应用于我的数据。我有以下网络:

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(数据),训练开始并且看起来很顺利,但对数据执行abs()没有理由训练数据伪造。

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

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

2 个答案:

答案 0 :(得分:0)

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

  1. 删除其间密集的图层并按照编码的方式进行编码。而不是' encoded3'到解码器
  2. 将自动编码器丢失更改为' binary_crossentropy'
  3. 或者,如果您真的想尝试中间的密集层,只需在没有激活功能的情况下使用它们(无)

答案 1 :(得分:0)

您的问题存在一些问题,包括您对自动编码器及其使用的理解。我强烈建议至少通过Keras博客文章Building Autoencoders in Keras(如果你确实经历过它,可以说你必须再次这样做,这一次更彻底)。

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

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