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


    循环神经网络(RNN)

    一.介绍

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

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

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

    RNN常用的激励函数:logistic函数,双曲正切函数
         输出函数:归一化指数函数
    在这里插入图片描述
    长短期记忆网络有输入门、遗忘门和输出门;
    门控循环单元网络的复位门对应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)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    三.总结

      本文中所使用的分类算法为循环神经网络演变的长短期记忆网络,激励函数为双曲正切函数,损失函数为交叉熵函数,数据集中的肌电信号共有8个通道,8类动作,通过对通道1和通道5进行分析,得到整体的准确率为65%。后面会继续对该算法进行改进,提高分类精度。
      介绍RNN部分较少,主要是使用该网络对表面肌电信号进行分类实现的。如果大家有什么更好的想法的话,可以留言哦✌️✌️
      后面会继续更新相关分类算法,请大家持续关注💓💓

  • 相关阅读:
    springboot整合ES
    【STM32】LED闪烁&LED流水灯&蜂鸣器(江科大)
    图像拼接Image switch(opencv配置,有关的函数只在低版本中存在,例如3.4.2.16)
    centos操作命令
    【Hadoop】第三篇--Hadoop运行模式
    干货 | 如何快速实现 BitSail Connector?
    吃透BGP,永远绕不开这些基础概述,看完再也不怕BGP了!
    JavaScript的基本知识点解析
    flink的网络缓冲区
    【目标检测】32、NMS 及其变体超详细介绍
  • 原文地址:https://blog.csdn.net/weixin_44694317/article/details/127413017