Tensorflow:EEG上CNN的⼀次实验
⼀次失败的CNN实现
前⾔
这是⼀次较为“失败”的分类器尝试,在本次报告中尝试实现了CNN模型对EEG图像进⾏学习,进⾏了⼤量调参的尝试,并在⼆分类问题上与其他简单模型进⾏⽐较
使⽤python tensorflow(vision=1.13.0)
最好的试验中测试集的准确率超过80%,但是由于测试集的选取原因这个数字没有很好的说服⼒,并不能说明在那个参数下模型有很好的泛化能⼒(见正则化)
虽然结果并不好,但在⼤量的学习中对机器学习的基本框架和如何调整参数有个更好的理解,本次报告中的CNN及其他⽹络也能很好地移植到其他问题当中
简介
数据
由于EEG的五个电极的数据存在⼀定的相关性,因此考虑⽤CNN模型来保持⼀定的结构。由于数据集中的EEG图较⼩,我们考虑将每个160为数据转化为5x32的数据进⾏卷积操作。
CNN⽹络
1. 原因
相关的学术研究中也有⽤CNN对EEG数据进⾏学习的研究,但他的数据集,每个数据的维度均⽐我们⼤,也有尝试⽤3维CNN⽹络训练EEG数据的成功例⼦
先对DEEP库愉悦度进⾏学习(⼆分类)
2. ⽹络结构
选择模型参数较⼩的原因是数据量⼩,实验结果表明可能过拟合。
3. 使⽤的库
//使⽤的库
import tensorflow as tf    #机器学习库
import numpy as np    #python基本库
from matplotlib.pyplot import*#画图
import  random      #⽤于添加噪声
4. 数据处理
对数据进⾏中⼼化和标准化,减少极端数据的影响,提⾼模型的泛化能⼒
// data 中⼼化和标准化
def MaxMinNormalization(x):
anspose(x)
anspose(np.array([(x[i]- np.average(x[i]))/np.std(x[i])for i in range(x.shape[0])]))
train_data=MaxMinNormalization(train_data)
模型调整
我们将前1000个作为训练集,后216个作为测试集进⾏训练来粗略地确定⼀些参数
1. 损失函数选择
我们在均⽅误差和交叉熵中选择,在梯度下降的情况下训练1000次。(优化器Adam)
均⽅误差交叉熵
variable used in lambda
可以看出交叉熵的收敛速度要快于均⽅误差,虽然交叉熵更容易遇到过拟合问题,在测试集上准确率下降。但考虑到计算能⼒及⼤量尝试发现两者并⽆在调好参数后并⽆太⼤差别,最后测试中我们选择⽤交叉熵来加快学习。
2. 优化器和学习率选择:
Tensorflow中提供了很多优化器的算法,我们选择了⼀些优化器进⾏测试,针对学习率1.0 0.1 0.01……中取最好的结果,由于时间和的计算能⼒的限制,我们每个只训练500次,选取⼀开始收敛最快的算法(学习率过⼩会训练缓慢,过⼤会导致最后震荡不收敛,我们选择较⼤的学习率但⼜控制最后的震荡幅度)
AdagradOptimizer 梯度下降Adam
可以看出Adam算法有最快的收敛速度,因此我们之后默认使⽤Adam算法且学习率为1e-3
3. 增加池化层:
h_pooli =max_pool_2x2(h_convi )
在这⾥插⼊图⽚描述
可以看出如果数据库的数据是良好的,那么我们认为我们的模型存在严重的过拟合问题(⾼⽅差),我们尝试⽤各种⽅法来减⼩⽅差减少过拟合的尝试
1. dropout
对于全连接层采取dropout⽅法,训练1000次
// 采⽤新tf 中的keep_prob
keep_prob =tf .placeholder (tf .float32)
drop =1-keep_prob
dropout=1.0 dropout=0.75
dropout=0.5dropout=0.5
可以看出dropout在0.75左右的时候可以减少过拟合并保持较快的收敛效果
2. 正则化
采取L2正则,取不同数量级的lambda,采⽤cross validation来选取最好的(dropout=0.75)将1216个数据分为8个组,每组152个,输出平均的训练集和测试集上的正确度。交叉验证的代码见后
// L2 regulation
lambda=.01(x=train_step/25)lambda=.015(x=train_step/25)
lambda=.02(x=train_step/25)lambda=.25(x=train_step/25)
lambda=.03(x=train_step/25)lambda=.035(x=train_step/25)
lambda=.05(x=train_step/25)在没有更多的计算下,我们⽆法更准确的寻lambda,包括lambda=.025和.03的最后值,我们选取lambda=.02
最后我们加上千分之2的正态噪声,进⾏训练
//add noise
rand =np .random .randint (0,high =1000, size =500)
noise =np .random .normal (0,1/500,[1216,160])
train_data_noised =np .add (train_data ,noise
)
交叉验证
最好的最差的
可见不同的验证集所需要的参数相差较⼤,这可能是因为我们没有对样本做最佳的预处理(按⼈平均没有更好的效果),或许在某些分类情况下能很较好地学习,但在平均意义下这个模型不能很好地预测该⼆分类问题与全连接⽹络⽐较
全连接⽹络
我们使⽤两个隐层的四层全连接⽹络与我们的模型进⾏⽐较,隐层的节点个数通过来确定(⼀个简单的确定较好的
节点个数的⽅法)
故第⼀个隐层36个节点,第⼆个隐层9个节点
全连接总体来说CNN的效果⽐全连接稍好,
全连接的正则化较难调整
与SVM ⽹络⽐较
由于数据相近,及时在某⼀数据分类下⽤SVM获得较好的拟合,⼀旦改变数据分割,在测试集上的准确度也会快速下降。
代码见下节
模型运⽤到其他分类标准
对MAHNOB-HCI库中的EEG_emotion_category进⾏9分类
运⽤CNN代码简单地更改参数即可n =
i n ∗n i −1i +1

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。