本篇为《信号处理》系列博客的第十一篇,该系列博客主要记录信号处理相关知识的学习过程和自己的理解,方便以后查阅。
本片博客为用DNN分类肌电数据的准备工作的第二篇,主要内容为,读取处理后的肌电数据(去噪、提取活动段),并构成训练数据。
import os
import csv
import random
import numpy as np
import matplotlib.pyplot as plt
from sklearn import preprocessing
def data_loader(datadir, batch_size=10):
'''
定义训练集数据读取器
输入参数:
datadir :数据文件的保存路径
batch_size :每次用于训练的数据量
输出参数:
原始数据+标签
'''
def reader():
batch_sEMG = []# 定义变量,用于存储肌电数据图片
batch_labels = []# 定义变量,用于存储肌电数据标签
label = 0# 标签变量
sEMG = []# 存储一个肌电数据
# 读取数据,用于训练
for root, dirs, files in os.walk(datadir):
if len(root)==len(datadir):# 去除根目录的文件路径
continue
label = label+1# 每个子文件夹代表一个类别
random.shuffle(files)# 训练时随机打乱肌电文件顺序
# 遍历每一个文件,一个文件即为一张图片
for sEMG_files in files:
# 读取文件内容,并转换为图片
with open(root+'/'+sEMG_files) as sEMG_file:# 获取datadir文件夹下的,子文件夹内的,文件的,内容
sEMG_signal = csv.reader(sEMG_file)
for row in sEMG_signal:
sEMG.append(row)
# 对一次采集到的肌电信号进行归一化,并改变矩阵的形状
sEMG = np.array(sEMG).astype('float32')
min_max_scaler = preprocessing.MinMaxScaler()#默认为范围0~1,拷贝操作
sEMG_minmax = min_max_scaler.fit_transform(sEMG)
sEMG_minmax = np.delete(sEMG_minmax, -1, axis=0)#删除最后一行整行,这里matlab代码没有写好,导致数据多了一行
sEMG_img = sEMG_minmax.reshape(1, 200, 240)
batch_sEMG.append(sEMG_img)
batch_labels.append(label)
sEMG = []# 变量清零,用于下一次循环
if len(batch_sEMG) == batch_size:
# 对一次采集到的肌电信号进行归一化,并改变矩阵的形状,这里改变形状的代码有错
# sEMG = np.array(batch_sEMG).astype('float32')
# min_max_scaler = preprocessing.MinMaxScaler()#默认为范围0~1,拷贝操作
# sEMG_minmax = min_max_scaler.fit_transform(sEMG)
# sEMG_minmax=np.delete(sEMG_minmax, -1, axis=0)#删除整行
# sEMG_array = sEMG_minmax.reshape(200, 240)
# labels_array = np.array(batch_labels).astype('float32').reshape(-1, 1)
sEMG_array = np.array(batch_sEMG).astype('float32')
labels_array = np.array(batch_labels).astype('float32').reshape(-1, 1)
yield sEMG_array, labels_array
batch_sEMG = []# 变量清零,用于下一次循环
batch_labels = []# 变量清零,用于下一次循环
if len(batch_sEMG) > 0:
# 剩余样本数目不足一个batch_size的数据,一起打包成一个mini-batch
sEMG_array = np.array(batch_sEMG).astype('float32')
labels_array = np.array(batch_labels).astype('float32').reshape(-1, 1)
yield sEMG_array, labels_array
return reader
# 查看数据形状
DATADIR = '/home/al007/Deep Learing/PaddlePaddle/sEMG'
train_loader = data_loader(DATADIR, batch_size=10)
data_reader = train_loader()
data = next(data_reader)
print(data[0].shape, data[1].shape)
打印结果:
(10, 200, 240) (10, 1)