以序列数据为输入,在序列的演进方向进行递归且所有节点(循环单元)按链式连接的递归神经网络。
循环神经网络具有记忆性、参数共享并且图灵完备。
逐渐演变的有:双向循环神经网络(Bi-RNN)
长短期记忆网络(LSTM)
门控循环单元网络(GRU)
循环卷积神经网络(RCNN):卷积层替换为内部具有递归结构的循环卷积层。
RNN常用的激励函数:logistic函数,双曲正切函数
输出函数:归一化指数函数
长短期记忆网络有输入门、遗忘门和输出门;
门控循环单元网络的复位门对应LSTM的输入门,更新门对应LSTM的遗忘门和输出门。
使用长短期记忆网络对肌电信号进行分类:
from keras.models import Sequential
from keras.layers import *
import numpy as np
import pandas as pd
import tensorflow as tf
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
# 数据集
raw_data = pd.read_csv('1_raw_data_13-12_22.03.16.txt',sep='\t',header=0) # 读取csv数据,并将第一行视为表头,返回DataFrame类型
data = raw_data.values
times=data[::,0]
features_data = raw_data[['channel1', 'channel5']]
features = features_data.values
labels = data[::,-1] # 最后一列为特征值
#选取33%数据作为测试集,剩余为训练集
train_features, test_features, train_labels, test_labels = train_test_split(features, labels, test_size=0.33, random_state=0)
x_train = np.array(train_features)
x_test = np.array(test_features)
y_train = np.array(train_labels)
y_test = np.array(test_labels)
# Seque构建方式(推荐)
class SequeClassifier():
def __init__(self, units):
self.units = units
self.model = None
# 构建神经网络模型:(根据各层输入输出的shape)搭建网络结构、确定损失函数、确定优化器
def build_model(self, loss, optimizer, metrics):
self.model = Sequential()
self.model.add(LSTM(self.units, return_sequences=True,activation='tanh'))
self.model.add(LSTM(self.units))
self.model.add(Dense(8, activation='softmax')) # 最后一层全连接层。对于N分类问题,最后一层全连接输出个数为N个,这里数据集为8分类问题;
self.model.compile(loss=loss,
optimizer=optimizer,
metrics=metrics)
if __name__ == "__main__":
# 1 获取训练数据集,并调整为三维输入格式
x_train = x_train[:, :, np.newaxis]
x_test = x_test[:, :, np.newaxis]
# 2 构建神经网络模型:(根据各层输入输出的shape)搭建网络结构、确定损失函数、确定优化器
units = 128 # lstm细胞个数
loss = "sparse_categorical_crossentropy" # 损失函数类型
optimizer = "adam" # 优化器类型
metrics = ['accuracy'] # 评估方法类型
sclstm = SequeClassifier(units)
sclstm.build_model(loss, optimizer, metrics)
# 3 训练模型
epochs = 10
batch_size = 64
history = sclstm.model.fit(x_train, y_train, epochs=epochs, batch_size=batch_size)
# 4 模型评估
score = sclstm.model.evaluate(x_test, y_test, batch_size=16)
print("model score:", score)
本文中所使用的分类算法为循环神经网络演变的长短期记忆网络,激励函数为双曲正切函数,损失函数为交叉熵函数,数据集中的肌电信号共有8个通道,8类动作,通过对通道1和通道5进行分析,得到整体的准确率为65%。后面会继续对该算法进行改进,提高分类精度。
介绍RNN部分较少,主要是使用该网络对表面肌电信号进行分类实现的。如果大家有什么更好的想法的话,可以留言哦✌️✌️
后面会继续更新相关分类算法,请大家持续关注