所以我试图在Keras中使用自动编码器来执行盲源分离,类似于它在PCA或ICA中的完成方式 . 我希望由于它们的非线性特性,自动编码器将能够解析非固定源(如果我错了,请纠正我) .

无论如何,我已经设法使用两个层(16个单位和8个单位)从64个输入开始汇聚到我输入的相当好的重建 .

我现在的问题是,我怎么能告诉自动编码器我已经训练为“设置为零”或“屏蔽掉”通过隐藏单元的一些输入,以便部分重建我的输入 .

例如,我将它应用于EEG数据(头皮上的64个电极,每个电极是时间序列),但电极也可以拾取肌肉/眼球运动,因此我想使用隐藏单元过滤掉这些噪音 . 自动编码器 .

这在我的脑海中起作用的方式是我会以某种方式设置隐藏层中的八个神经元中的一个以仅抑制任何输入,然后输出将是减去神经元编码的一切 . 但我不确定那是怎么做的 . 谢谢!

from keras.layers import Input, Dense, Conv1D, MaxPooling1D, UpSampling1D
from keras.models import Model
from keras import backend as K
import scipy as scipy
import numpy as np 
import matplotlib.pyplot as plt 
from scipy.cluster.vq import whiten

mat = scipy.io.loadmat('bcgdata.mat')
emat = mat['bcgdata']
#whiten(emat)
emat = emat / np.max(emat)
#emat = emat-np.min(emat)

input_img = Input(shape=(64,1))  # adapt this if using `channels_first` image data format
encoded = Dense(16, activation='relu')(input_img)
encoded = Dense(8, activation='relu')(encoded)

decoded = Dense(16, activation='relu')(encoded)
decoded = Dense(1, activation='relu')(decoded)

autoencoder = Model(input_img, decoded)
autoencoder.compile(optimizer='SGD', loss='mean_squared_error')
autoencoder.summary()

x_train = np.transpose(emat[:,0:50000])
x_train = np.expand_dims(x_train,axis=2)
#x_train = np.reshape(x_train, (x_train.shape[1], 64, 1))
x_test = np.transpose(emat[:,50000:80000])
x_test = np.expand_dims(x_test,axis=2)
#x_test = np.reshape(x_test, (x_test.shape[1], 64, 1))

from keras.callbacks import TensorBoard

autoencoder.fit(x_train, x_train,
                epochs=50,
                batch_size=150,
                shuffle=True,
                validation_data=(x_test, x_test),
                callbacks=[TensorBoard(log_dir='/tmp/autoencoder')])


preds = autoencoder.predict(x_test)
plt.plot(x_test[0:500,1,0])
plt.plot(preds[0:500,1,0])
plt.show()