我正在尝试使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)输入。

我还在自动编码器中间添加了Dense层,因为我希望在自动编码器完成训练后做出有关类(自动适合)的预测。我这样做是否正确,这会中断网络吗?

最佳答案

您正在二进制(“ Sigmoid”)和类别(“ softmax”和“ categorical_crossentropy”)之间混合。更改以下内容:


删除中间的密集层,然后将“ encoded”而不是“ encoded3”馈送到解码器
将自动编码器损耗更改为“ binary_crossentropy”


另外,如果您确实想尝试之间的密集层,则可以不使用激活功能就使用它们(无)

关于machine-learning - Keras自动编码器的负损耗和val_loss,数据范围为[-1 1],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48126996/

10-12 18:03
查看更多