无法在Keras中训练简单的自动编码器

时间:2018-08-14 11:54:40

标签: python machine-learning keras signal-processing autoencoder

我正在尝试在Keras中训练自动编码器以进行信号处理,但是我却以某种方式失败了。

我的输入是128帧长度的段,用于6个小节(acceleration_x / y / z,gyro_x / y / z),因此我的数据集的总体形状为30 => 000030 30.02 => 000030 30.6 => 000031 30000 => 030000 ,其中22836是样本大小。

这是我用于自动编码器的示例代码:

(22836, 128, 6)

X_train, X_test, Y_train, Y_test = load_dataset() # reshape the input, whose size is (22836, 128, 6) X_train = X_train.reshape(X_train.shape[0], np.prod(X_train.shape[1:])) X_test = X_test.reshape(X_test.shape[0], np.prod(X_test.shape[1:])) # now the shape will be (22836, 768) ### MODEL ### input_shape = [X_train.shape[1]] X_input = Input(input_shape) x = Dense(1000, activation='sigmoid', name='enc0')(X_input) encoded = Dense(350, activation='sigmoid', name='enc1')(x) x = Dense(1000, activation='sigmoid', name='dec0')(encoded) decoded = Dense(input_shape[0], activation='sigmoid', name='dec1')(x) model = Model(inputs=X_input, outputs=decoded, name='autoencoder') model.compile(optimizer='rmsprop', loss='mean_squared_error') print(model.summary()) 的输出是

model.summary()

培训通过

完成
Model summary
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_55 (InputLayer)        (None, 768)               0         
_________________________________________________________________
enc0 (Dense)                 (None, 1000)              769000    
_________________________________________________________________
enc1 (Dense)                 (None, 350)               350350    
_________________________________________________________________
dec1 (Dense)                 (None, 1000)              351000    
_________________________________________________________________
dec0 (Dense)                 (None, 768)               768768    
=================================================================
Total params: 2,239,118
Trainable params: 2,239,118
Non-trainable params: 0

在这里我只是想学习产生的身份函数:

# train the model
history = model.fit(x = X_train, y = X_train,
                    epochs=5,
                    batch_size=32,
                    validation_data=(X_test, X_test))

在这一点上,为了理解它的表现,我检查了一些真实输入与预测输入的曲线图:

Train on 22836 samples, validate on 5709 samples
Epoch 1/5
22836/22836 [==============================] - 27s 1ms/step - loss: 0.9481 - val_loss: 0.8862
Epoch 2/5
22836/22836 [==============================] - 24s 1ms/step - loss: 0.8669 - val_loss: 0.8358
Epoch 3/5
22836/22836 [==============================] - 25s 1ms/step - loss: 0.8337 - val_loss: 0.8146
Epoch 4/5
22836/22836 [==============================] - 25s 1ms/step - loss: 0.8164 - val_loss: 0.7960
Epoch 5/5
22836/22836 [==============================] - 25s 1ms/step - loss: 0.8004 - val_loss: 0.7819

这些是一些似乎完全错误的图:

plot1

plot2

plot3

除了少数时期(实际上似乎没有什么区别)之外,您对什么地方有什么建议吗?

1 个答案:

答案 0 :(得分:3)

您的数据不在[0,1]范围内,那么为什么在上一层使用sigmoid作为激​​活函数?从最后一层中删除激活功能(最好在上一层中使用relu)。

还可以标准化训练数据。您可以使用基于功能的规范化:

X_mean = X_train.mean(axis=0)
X_train -= X_mean
X_std = X_train.std(axis=0)
X_train /= X_std + 1e-8

请不要忘记在推理时间(即测试)中使用计算出的统计信息(X_meanX_std)来标准化测试数据。