入门神经网络一

样本采集

在本科的时候对神经网络颇有兴趣,感觉很神秘,特别是当时的yolov5目标检测算法,让我感觉特别震撼,计算机在图像识别上已经超过了人眼。但是这么长时间以来一直停留在跑demo的阶段,没有静下心来学习,为此我计划搭建一个属于自己的神经网络作为入门标志,这是第一章,主要讲了说明采集样本的过程。
  • 建立一个怎样的网络

    我计划建立的网络结构,输入参数为陀螺仪三轴传感器的数据,输出内容为可能进行的姿态:休息、走路、跑步。虽然直接判断陀螺仪的传感器数据就能得到结果,但是我还是希望建立这样一个网络结构,因为在时间成本与经济成本上花费较小。

  • 输入数据的结构

    输入数据是一段时间内的传感器数据,我的计划是间隔一段时间采集三轴加速度传感器数据,每个样本包括50个三轴数据,因此,输入数据为3X50的矩形。

  • 怎样采集样本

    我手头有esp32开发板,板载一颗mpu6050陀螺仪,并且可以连接电池,我计划用它来采集样本,单个样本数据包括x、y、z轴的加速度传感器数据,我想将数据保存在内部flash中,这样不用携带额外的存储设备。假设一帧样本为3X50的数据,我计划每种姿态采集300帧,一个姿态就是300X3X50的数据,因为加速度计的原始数据太低,我在采集时将其扩大1000倍运算。编程使用板载的两个按键分别作为采集信息和打印信息按钮。esp32正常复位后,按键一表示采集按钮,按下后系统开始采集,将数据保存在内部flash中,一个姿态的数据采集完成后,再次按下按键可以采集下一个姿态,如此循环采集三种姿态的数据,将其保存在内部flash中,分别命名为running.txt,walking.txt,resting.txt,再按下按键二,分别将样本数据打印到串口助手,使用“e”作为间隔符号.代码位于tools/arduino_getSample/GetAllData

  • 整理样本

    将串口助手打印出来的样本复制粘贴到txt中,分别重新命名放在sample文件夹下,这样的数据用程序读取起来太费劲,因此我专门写了一个脚本将txt中的样本数据储存为np文件,示例如下,当然我也会全部开源在github,这个工具位于tools文件夹下。分别转换三个txt文件,生成三个npy文件,这样我们在往后训练时读取数据会很方便。

    import numpy as np
    
    number_of_sample = 50
    
    data_array = []
    
    # 创建一个全为零的三维数组,其中二维部分大小为(3,number_of_sample)
    data_array_out = np.empty(shape=[0, 3, number_of_sample])
    
    data_array_out = data_array_out.astype(int)  # 强制转换为int
    
    file = open('../sample/run.txt')  # 打开样本文件,其中e为分隔符
    
    val_list = file.readlines()  # 读取所有行
    
    for line in val_list:  # 遍历所有行
      line = line.strip('\n')  # 清除所有的\n
      if line == 'e':  # 发现分隔符时append数组
          print("分隔符")
          data_array_np = np.array(data_array).T  # 转置
          data_array_out = np.append(
              data_array_out, [data_array_np], axis=0)  # 将二维数组append到三位数组中
          data_array = []  # 数组清空
      else:
          num_int = list(map(int, line.split(' ')))  # 使用空格切片
          data_array.append(num_int)  # append到数组中
    print(data_array_out)
    print(data_array_out.shape)
    np.save("../sample/run.npy", data_array_out)  # 保存数组
    
  • 已知存在缺陷

  • 样本均由我一人采集,不具有普遍性,可能其他人直接使用我的网络数据效果很差
  • 样本太少数量太少,可能会导致训练结果较差
文章目录