我正在尝试将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完成训练时对类(自动拟合)进行预测。我是否正确地做到了这一点,这会破坏网络吗?
答案 0 :(得分:0)
您正在混合二进制(' sigmoid')和分类(' softmax'' categorical_crossentropy')。更改以下内容:
或者,如果您真的想尝试中间的密集层,只需在没有激活功能的情况下使用它们(无)
答案 1 :(得分:0)
您的问题存在一些问题,包括您对自动编码器及其使用的理解。我强烈建议至少通过Keras博客文章Building Autoencoders in Keras(如果你确实经历过它,可以说你必须再次这样做,这一次更彻底)。
一些一般性观点,其中大部分都包含在上述链接帖子中:
sigmoid
层后跟softmax
层;同样适用于最终sigmoid
图层中的decoded
选项。这两个激活函数通常用于最终层的分类目的,因此再次参考上面的第(1)点。