簡體   English   中英

無法在Keras中訓練簡單的自動編碼器

[英]Unable to train simple autoencoder in Keras

我正在嘗試在Keras中訓練一個自動編碼器進行信號處理,但我有點失敗。

我的輸入是長度為128幀的段,用於6個度量(acceleration_x / y / z,gyro_x / y / z),因此我的數據集的總體形狀是(22836, 128, 6) ,其中22836是樣本大小。

這是我用於自動編碼器的示例代碼:

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

在這一點上,為了試圖理解它的執行情況,我檢查了一些真實輸入與預測輸入的關系:

prediction = model.predict(X_test)
for i in np.random.randint(0, 100, 7):
    pred = prediction[i, :].reshape(128,6)
    # getting only values for acceleration_x
    pred = pred[:, 0]
    true = X_test[i, :].reshape(128,6)
    # getting only values for acceleration_x
    true = true[:, 0]
    # plot original and reconstructed
    fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(20, 6))
    ax1.plot(true, color='green')
    ax2.plot(pred, color='red')

這些是一些似乎完全錯誤的情節:

plot1

plot2

plot3

除了少數時代(實際上似乎沒有任何區別)之外,你對錯誤有任何建議嗎?

您的數據不在[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 )來規范化測試數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM