循环神经网络(RNN)简单介绍及实现(基于表面肌电信号)

循环神经网络(RNN)

文章目录

    • 循环神经网络(RNN)
          • 一.介绍
          • 二.python实现(LSTM)
          • 三.总结

一.介绍

  以序列数据为输入,在序列的演进方向进行递归且所有节点(循环单元)按链式连接的递归神经网络。

  循环神经网络具有记忆性、参数共享并且图灵完备。
  逐渐演变的有:双向循环神经网络(Bi-RNN)
         长短期记忆网络(LSTM)
         门控循环单元网络(GRU)

  循环卷积神经网络(RCNN):卷积层替换为内部具有递归结构的循环卷积层。

RNN常用的激励函数:logistic函数,双曲正切函数
     输出函数:归一化指数函数
循环神经网络(RNN)简单介绍及实现(基于表面肌电信号)_第1张图片
长短期记忆网络有输入门、遗忘门和输出门;
门控循环单元网络的复位门对应LSTM的输入门,更新门对应LSTM的遗忘门和输出门。

二.python实现(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部分较少,主要是使用该网络对表面肌电信号进行分类实现的。如果大家有什么更好的想法的话,可以留言哦✌️✌️
  后面会继续更新相关分类算法,请大家持续关注

你可能感兴趣的:(表面肌电信号处理,分类算法,rnn,深度学习,人工智能,sEMG,1024程序员节)