已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
第二天~八点(pm)~

查阅了NinaPro的原始论文,ps:他们的官网是真的烂,图片没显示,害我找了好久。

XXXXXXXXXXXXXXXXXXXXXX/DB9_Instructions

另外使用了DB9论文中的角度换算

尝试使用这个转换DB8中的手套数据,并使用UE4进行可视化。  

然而论文里的源码并不能运行,在连续改了两个bug跑出来以后,得到的角度数据没有参考系,等于无法复现。焯! sticker

然后我就寻思了,手套传感器数据通过隐函数映射到手指姿态,虽然论文里的隐函数转换脚本没法用了,但是我可以直接输出传感器数据啊,四舍五入我也得到手指姿态了。绝对不是为了赶论文。 sticker

然后我就快乐的写了一大片代码开始跑上面得到的数据集。


考虑到论文最好不全公开,我就贴下网络结构。PS 目前没调好,不一定能收敛。

class MyNet(nn.Module):
    def __init__(self, input_size, hidden_size, num_layers, output_chan):
        super(MyNet, self).__init__()
        self.hidden_size = hidden_size
        self.num_layers = num_layers
        self.lstm = nn.LSTM(input_size,
                            hidden_size,
                            num_layers,
                            batch_first=True)
        #input tensor of shape (sequence length, batch size, input_size)
        self.fc=nn.Linear(hidden_size, output_chan)
        """ self.fc = nn.Sequential(
            nn.Dropout(droprate),  #Dropout层
            nn.LeakyReLU(),
            nn.Linear(hidden_size, 64),
            nn.LeakyReLU(),
            nn.Linear(64, output_chan)) """

        #把隐藏状态空间用全连接层映射到输出空间。

    def forward(self, x):
        #初始化hidden和cell的states 不赋予初值所以用zeros
        #详情:https://pytorch.org/docs/stable/generated/torch.nn.LSTM.html
        h0 = torch.zeros(self.num_layers, x.size(0),
                         self.hidden_size).to(device)
        c0 = torch.zeros(self.num_layers, x.size(0),
                         self.hidden_size).to(device)
        #LSTM
        output, (hn, cn) = self.lstm(x, (h0, c0))
        #tensor of shape (batch size, sequence length, hidden_size)

        output = self.fc(output[:, -1, :])  #取sequence的最后一个输出hn
        #tensor of shape (batch size, sequence length, hidden_size)

        return output

开始炼丹!

1652116462(1).png

1652116635967.png

这400多w的Loss是怎么来的???

刚开始,我还以为是梯度爆炸了之类的,毕竟我的Loss从几十万到几百万都有,很是奇怪,所以我先从这方面入手

这Loss这么大是不是我网络有问题啊?

询问了大佬后突然发现了一个盲点,我的数据是EMG数据集,用的是LSTM,激活函数默认为tanh,然后EMG数据大概是e-6量级,感觉会有问题,所以做了归一化。

归一化脚本:

def data_scaler(input_list):
    """
    @description  :
    ---------
    @param  :
    -------
    @Returns  :
    -------
    """
    scaler = MinMaxScaler(copy=False)
    matData=input_list[0]
    matFile=input_list[1]
    norm_data={}
    norm_data['emg'] = []

    scaler.fit(matData['emg'])
    norm_data['emg']=scaler.transform(matData['emg'])
    matData['emg']=norm_data['emg']
    sio.savemat(saveDir+matFile, matData)

pool = ThreadPool()
mat_list=[]
for matFile in findAllMat(): 
    matData=sio.loadmat(dataDir+matFile)
    mat_list.append([matData,matFile])
results = pool.map(data_scaler, mat_list)
pool.close()
pool.join()

抽空再试试标准化。

然后继续训练,中间又改小了batch_size,由于Loss是整个batch的Loss和,所以Loss确实小了点,但是也没小多少,归一化以后结果好像没啥变化···不管了,归一化做了是对的,先这样跑吧,只要能收敛就行。

然后我发现了Loss的一个规律

1652116260.png

这玩意一会儿高一会儿低的怎么?

经过分析我发现

大概23680条数据为一个周期,一个文件大概有2292000条  

有0-9个动作,其中0为复位  

每个动作会重复10次  

data_total=2292000  

data_total/9(个动作)/10(10次重复)=25472 非常接近23680的数量级,也就是说动作改变的时候loss会突增突减


那行吧,好像也没啥问题,先跑着。

然后在我的3080跑了一小时之后

e2790b2744788c3bb8d1c72fb93ca99.png

???我的Loss呢!!!

我那么大的Loss,几百万呢?怎么突然就没了?

没了Loss.gif

俺跑了两遍,都是在这里Loss消失,又百度了下。高度怀疑是数据集本身有问题。

经过写脚本定位查找以后,从7个G的数据集里成功揪出来了丢失的数据

mad,这群*人不会做数据集能不能不要做,跑了俩小时直接给我干废了

PL5H{GKQV}`(BJWOQHVTL60.png

又把他们截掉然后重新跑。

脚本贴一下吧,这个nan问题很是花了我一番功夫

import numpy as np
import scipy.io as sio
import matplotlib.pyplot as plt
import os
from torch.utils.data import Dataset
import torch
from math import isnan
dataDir = './EMG_data/linear/'
saveDir = './EMG_data/nan_deled/'
def findAllMat():
    """
    @description  :找到dataDir下所有的mat文件
    ---------
    @param  :
    -------
    @Returns  :
    -------
    """
    for root,dirs,files in os.walk(dataDir):
        for f in files:
            if(f.split('.')[-1]=="mat"):
                yield f
def readMat(mData, name, del_nan):
    """
    @description  :读取并处理mat文件,找到nan的数据
    ---------
    @param  :mData 数据 name文件名 del_nan是否处理
    -------
    @Returns  :
    -------
    """
    h=-1
    l=-1
    mlist=['emg','glove','rerepetition','restimulus']
    for i in range(0,4):
        foo=mData[mlist[i]]
        if(len(np.where(np.isnan(foo))[0])):
            h=np.where(np.isnan(foo))[0][0] #行数-1(索引)
            l=np.where(np.isnan(foo))[1][0] #列数-1
            #print(name)
            break
    if(h!=-1 and del_nan):
        for i in range(0,4):
            mData[mlist[i]]=mData[mlist[i]][:h,]
        sio.savemat(saveDir+name, mData)    


for matFile in findAllMat():
    matData = sio.loadmat(dataDir + matFile)
    readMat(matData, matFile, True)

最后都整的差不多了,打算挂一晚上,看看能不能跑收敛。

明天更不更看心情了。

文号 / 904101

实习会员
名片发私信
学术分 0
总主题 1 帖总回复 1 楼拥有证书:进士 机友 笔友
注册于 2020-01-03 23:51最后登录 2024-10-21 01:46
主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:上海

个人简介

人类的痛苦源自于对自己无能的愤怒。

文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

插入资源
全部
图片
视频
音频
附件
全部
未使用
已使用
正在上传
空空如也~
上传中..{{f.progress}}%
处理中..
上传失败,点击重试
等待中...
{{f.name}}
空空如也~
(视频){{r.oname}}
{{selectedResourcesId.indexOf(r.rid) + 1}}
处理中..
处理失败
插入表情
我的表情
共享表情
Emoji
上传
注意事项
最大尺寸100px,超过会被压缩。为保证效果,建议上传前自行处理。
建议上传自己DIY的表情,严禁上传侵权内容。
点击重试等待上传{{s.progress}}%处理中...已上传,正在处理中
空空如也~
处理中...
处理失败
加载中...
草稿箱
加载中...
此处只插入正文,如果要使用草稿中的其余内容,请点击继续创作。
{{fromNow(d.toc)}}
{{getDraftInfo(d)}}
标题:{{d.t}}
内容:{{d.c}}
继续创作
删除插入插入
插入公式
评论控制
加载中...
文号:{{pid}}
加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}
ID: {{user.uid}}