【发布时间】:2023-03-11 12:02:01
【问题描述】:
我正在尝试使 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 通道、实部的第一个通道和图像部分的第二个通道,因此两者都归一化为 [-1 1],并且通常都包含非常低的值,例如5e-12。我已将它们塑造成 (28,28,2) 输入。
我还在自动编码器的中间添加了密集层,因为我希望在自动编码器完成训练时对类(自动拟合)进行预测。我这样做是否正确,这会破坏网络吗?
【问题讨论】:
-
我认为您应该尝试使用 tanh 作为最后一层的激活。 sigmoid 将其输出置于 (0,1) 之间,所以如果你想解码你编码的内容,你的输出应该在 [-1,1] 之间,而这正是 tanh 所做的。
标签: machine-learning keras neural-network conv-neural-network autoencoder