今天的任务是浏览Github上有关Emotion-EEG的仓库,看看有什么发现。
Human-Emotion-Analysis-using-EEG-from-DEAP-dataset
提取了数据库的PSD特征和DWT特征,在Arousal轴和Valence轴的二分类问题,使用KNN和SVM。
PSD特征:四个波段/总功率的比值,四分类正确率26%;
DWT特征:小波能量、小波熵、标准差,效果也只有60%;
EmoRegNet
使用DataFrame进行数据处理,四分类问题正确率60%。
所提取的特征:
- mean
- median
- max
- min
- std dev
- variance
- range
- skewness
- kurtosis
包括在长为806的10个分片段以及全长数据中提取的特征,共9*11+2=101个特征。(很奇怪,有一行特征全1,有一行特征为试验序号)
在适用到全数据库文件后,得到的xs.shape=(32, 40, 40, 101), ys.shape=(32, 40, 4),存储于x.dat和y.dat中。
神经网络部分:
batchSizebatchSize = 50
nbClasses = 2
nbEpoch = 5
CH, DATA = 40, 101
nbFilters = 100
nbConv = 3
NEpoch = 50
model = Sequential()
model.add(Convolution2D(nbFilters, (nbConv, nbConv), input_shape=(1,CH,DATA), activation='tanh', data_format='channels_first'))
model.add(Convolution2D(nbFilters, (nbConv, nbConv), activation='tanh'))
model.add(MaxPool2D())
model.add(Dropout(0.5))
model.add(Flatten())
model.add(Dense(128, activation='tanh'))
model.add(Dropout(0.25))
model.add(Dense(nbClasses, activation='softplus'))
sgd = SGD(lr=0.00001, decay= 1e-6, momentum= 0.9, nesterov=True)
model.compile(sgd, 'categorical_crossentropy')
值得一提的是,源代码中训练部分直接使用了validation_split=1/32进行分割,会导致并非按照被试participant进行划分,因此,在训练前使用KFold先划分数据集,再训练。
修改后的训练代码:
accAll = []
for _ in range(NEpoch):
for train, test in kf.split(xs):
X_train, X_test, Y_train, Y_test = xs[train], xs[test], ys[train], ys[test]
pat, exp, ch, data = xs.shape
X_train = X_train.reshape((pat-1)*exp, 1, ch, data)
X_test = X_test.reshape(1*exp, 1, ch, data)
pat, exp, label = ys.shape
Y_train = Y_train.reshape((pat-1)*exp, label)[:, :2]
Y_test = Y_test.reshape(1*exp, label)[:, :2]
model.fit(X_train, Y_train, batch_size=batchsize, epochs=nbEpoch)
loss, acc = model.evaluate(X_test, Y_test)
accAll.append(acc)
然而,随着循环的进行,acc会不断的上升,因为在循环的过程中会把原来为测试集的样本当成训练集,从而造成假象,所以需要使用K.clear_session()来清除前一次的训练结果。
分类结果:0.63046875
另一方面,将他的特征使用SVM进行分类,结果如图所示。效果一般。
20180709_SVM_result