深度学习基础——通过PyTorch构建神经网络实现1维/2维序列分类

news2024/9/22 11:26:22

文章目录

    • 使用3层前馈神经网络
    • 使用循环神经网络
      • 生成pickle数据集
      • 构建RNN进行1维序列的训练、推理

使用3层前馈神经网络

通过PyTorch构建前馈神经网络,并对二维数据点进行分类。在该例子当中,所有的训练数据和测试数据都是通过高斯混合模型GMM生成的:

import numpy as np
from sklearn.mixture import GaussianMixture
import torch
import torch.nn as nn
import torch.optim as optim
from matplotlib import pyplot


def GenerateData():
    GMM1 = GaussianMixture(n_components=2, covariance_type='spherical')
    GMM1.weights_ = np.array([0.5, 0.5])
    GMM1.means_ = np.array([[0, 0], [1, 1]])
    GMM1.covariances_ = np.array([0.05, 0.05])

    GMM2 = GaussianMixture(n_components=2, covariance_type='spherical')
    GMM2.weights_ = np.array([0.5, 0.5])
    GMM2.means_ = np.array([[0, 1], [1, 0]])
    GMM2.covariances_ = np.array([0.05, 0.05])

    X_train = np.concatenate([GMM1.sample(1000)[0], GMM2.sample(1000)[0]])
    Y_train = np.array([0.0] * 1000 + [1.0] * 1000)

    X_test = np.concatenate([GMM1.sample(100)[0], GMM2.sample(100)[0]])
    Y_test = np.array([0.0] * 100 + [1.0] * 100)

    return X_train, Y_train, X_test, Y_test


class MyNet(nn.Module):
    # 3层神经网络初始化函数
    def __init__(self):
        super(MyNet, self).__init__()
        self.feedforward1 = nn.Linear(2, 8)  # 输入层2维输入,8维输出
        self.feedforward2 = nn.Linear(8, 8)  # 隐藏层将第一层的8维输出作为输入,输出8维隐藏节点
        self.feedforward_output = nn.Linear(8, 1)  # 输出层将第二层的8维输出作为输入,输出一维节点

    # 神经网络的正向传播函数(推理过程)
    def forward(self, x):
        y = torch.sigmoid(self.feedforward1(x))
        y = torch.sigmoid(self.feedforward2(y))
        y = torch.sigmoid(self.feedforward_output(y))
        return y


if __name__ == "__main__":

    X_train, Y_train, X_test, Y_test = GenerateData()

    mynet = MyNet()  # 创建神经网络
    criterion = nn.MSELoss()  # 使用均方差损失函数
    optimizer = optim.Adam(mynet.parameters(), lr=0.1)  # 选择Adam优化算法, lr学习率
    num_steps = 200
    for epoch in range(num_steps):
        optimizer.zero_grad()
        outputs = torch.squeeze(
            mynet(torch.from_numpy(X_train).float())
        )
        loss = criterion(
            outputs, torch.from_numpy(Y_train).float()
        )
        loss.backward()  # 反向传播
        optimizer.step()  # 迭代
        print('epoch:', epoch, 'loss:', loss.item())

    Y_test_predict = np.squeeze(mynet(torch.from_numpy(X_test).float()).data.numpy())

    pyplot.subplot(2, 1, 1)
    pyplot.title('Ground truth')
    pyplot.plot(X_test[Y_test < 0.5, 0], X_test[Y_test < 0.5, 1], 'ro')
    pyplot.plot(X_test[Y_test >= 0.5, 0], X_test[Y_test >= 0.5, 1], 'bo')

    pyplot.subplot(2, 1, 2)
    pyplot.title('Predictions')
    pyplot.plot(X_test[Y_test_predict < 0.5, 0], X_test[Y_test_predict < 0.5, 1], 'ro')
    pyplot.plot(X_test[Y_test_predict >= 0.5, 0], X_test[Y_test_predict >= 0.5, 1], 'bo')

    pyplot.show()

在这里插入图片描述

使用循环神经网络

更换使用循环神经网络RNN模型,进行1维序列分类任务。

为了简化问题,我们假定:
序列的长度是固定的。我们将其长度设为T=4。
我们只有两个类别,所以这是一个二值分类的问题。
类别0表示序列是一个递增序列。例如[0.1, 0.2, 0.3, 0.4],或者 [-0.5, 0.2, 3.4, 6.2]。
类别1表示序列是一个递减序列。例如[0.4, 0.3, 0.2, 0.1],或者 [5.1, 4.2, 1.1, -4.3]。

该数据中的一些序列并不是严格递增或者严格递减的,而是人工添加了一些噪声用来增加难度。

生成pickle数据集

import numpy as np
import pickle
import random

n_train = 10000
n_test = 100

train_samples = []
train_labels = []
test_samples = []
test_labels = []

for i in range(n_train + n_test):
  if i < n_train:
    samples = train_samples
    labels = train_labels
  else:
    samples = test_samples
    labels = test_labels

  label = random.choice([0, 1])  # 创建标签
  start = random.uniform(-40.0, 40.0)  # 数据集值域
  sample = [start]
  next = start + random.uniform(-1, 5.0) * (-label * 2 + 1)  # 添加噪声数据
  sample.append(next)
  next = next + random.uniform(-2, 10.0) * (-label * 2 + 1)
  sample.append(next)
  next = next + random.uniform(-2, 10.0) * (-label * 2 + 1)
  sample.append(next)


  print("label:", label)
  print("sample:", sample)
  labels.append(label)
  samples.append(sample)

  data = {
    "train_samples": train_samples,
    "train_labels": train_labels,
    "test_samples": test_samples,
    "test_labels": test_labels,
  }

with open('data.pickle', 'wb') as f:
  pickle.dump(data, f)

数据预览:

...
label: 0
sample: [13.661404789383802, 16.25823434021173, 25.836030702074233, 29.80743875466039]
label: 0
sample: [-36.08627999686152, -34.34148605882467, -30.952065898268796, -24.826507234567075]
label: 0
sample: [29.623166657112577, 30.665468166023125, 39.4453612889517, 42.46217272533641]
label: 1
sample: [37.09265024612682, 34.9627251848789, 29.480888940841062, 29.03037901349507]
label: 1
sample: [-36.48292930041589, -36.2517650316274, -40.63062181571942, -44.71483963355948]
label: 0
sample: [-27.787531018991984, -25.49688544939839, -18.617854249376403, -16.697955035196976]
label: 1
sample: [-17.61357006905537, -19.71666704640389, -29.423836269702587, -34.81544894336959]
label: 0
sample: [-7.9647956435803735, -8.697630914998363, -3.043016298343562, 0.04254751655408029]
label: 1
sample: [3.1478411158586965, 1.4399195145968626, -3.1482779908675864, -7.777294451546566]
label: 0
sample: [-32.022188264777625, -31.690097636594118, -29.23549322202779, -27.041525433045393]
label: 1
sample: [-9.694922608645385, -10.338911638390199, -14.366987058323842, -18.46181546341211]
label: 1
sample: [23.440205855160336, 23.57074807644042, 17.634275111581218, 12.857671664491825]
label: 0
sample: [-19.175740480534067, -17.885292738296663, -17.089990831414497, -7.9255258345168595]
label: 1
sample: [-2.3408396273441525, -3.1195397721511418, -11.953863530700303, -20.060383291780298]
label: 0
sample: [-36.046741153634905, -31.262165117768486, -26.99303716939375, -18.734469192006976]
label: 1
sample: [-32.91181436961641, -33.15143640702147, -31.42082286186909, -29.983718884940473]
label: 1
sample: [-38.49879958380717, -38.615988339688904, -41.350719083767615, -41.62130549151447]

生成的pickle数据可以通过以下代码来读取:

import pickle

with open('data.pickle', mode='rb') as f:
  data = pickle.load(f)
  
train_samples = data['train_samples']
train_labels = data['train_labels']
test_samples = data['test_samples']
test_labels = data['test_labels']

构建RNN进行1维序列的训练、推理

import numpy as np
import pickle
import torch
import torch.nn as nn
import torch.optim as optim


def GetData():
  with open('data.pickle', mode='rb') as f:
    data = pickle.load(f)

  train_samples = np.array(data['train_samples'])
  train_labels = np.array(data['train_labels'])
  test_samples = np.array(data['test_samples'])
  test_labels = np.array(data['test_labels'])
  return train_samples, train_labels, test_samples, test_labels

class MyNet(nn.Module):
  def __init__(self):
    super(MyNet, self).__init__()
    # Define the RNN layer and a final linear layer
    self.rnn = nn.RNN(
      input_size=1,
      hidden_size=8,
      num_layers=1)
    self.feedforward_output = nn.Linear(
      in_features=8,
      out_features=1)

  def forward(self, x):
    h0 = torch.zeros(1, x.shape[1], 8)
    y, hn = self.rnn(x, h0)
    y = torch.sigmoid(self.feedforward_output(y))
    return y


def main():
  train_samples, train_labels, test_samples, test_labels = GetData()

  mynet = MyNet()

  # Train
  criterion = nn.BCELoss()
  optimizer = optim.Adam(mynet.parameters(), lr=0.1)
  num_steps = 100
  print('start training')
  for epoch in range(num_steps):
      optimizer.zero_grad()
      inputs = np.expand_dims(train_samples.transpose(), -1)
      outputs = torch.squeeze(
          mynet(torch.from_numpy(inputs).float()))
      last_outputs = outputs[-1, :]
      loss = criterion(
          last_outputs, torch.from_numpy(train_labels).float())
      loss.backward()
      optimizer.step()
      print('epoch:', epoch, 'loss:', loss.item())
  print('finished training')

  # Evaluate
  inputs = np.expand_dims(test_samples.transpose(), -1)
  test_predict = np.squeeze(mynet(torch.from_numpy(inputs).float()).data.numpy())
  last_predict = (test_predict[-1, :] > 0.5)
  accuracy = sum(last_predict == test_labels) / len(test_labels)
  print('accuracy on test data:', accuracy)

if __name__ == '__main__':
  main()

准确率:

...
epoch: 97 loss: 0.1513727456331253
epoch: 98 loss: 0.13302730023860931
epoch: 99 loss: 0.13972853124141693
finished training
accuracy on test data: 0.95

Reference:
[1] 王泉-声纹识别:从理论到编程实战
[2] 王泉-声纹识别GitHub代码仓

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/673665.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络 - 你可知 Telnet 能通但是 Ping 不通百思不得其解

问题描述 以前本人以为 telnet 通 ping 一定也是通的&#xff0c;telnet 能通&#xff0c;表示两台计算机之间建立了连接通道。理论上是能 ping 通的。 但是今天万万没想到&#xff0c;并不是这样... 原因分析 如果不能 ping 通&#xff0c;可能的原因是对方主机关闭了 ping…

MYSQL阶段_DAY01~DAY11(附笔记)

注意&#xff1a;&#xff08;数据表如下&#xff09; sort表&#xff1a; user表&#xff1a; zhangwu表&#xff1a; 1.Part1 JDBC操作数据库的步骤 1.注册驱动 告知JVM使用的是哪一个数据库的驱动, 把驱动类的对象交给DriverManager管理&#xff0c;用于…

一文理解MySQL的For Update行级锁

一文理解MySQL的For Update行级锁 引言一、MySQL的For Update简介1.1、For Update的作用1.2、For Update与其他锁定方式的区别 二、For Update的语法2.1、SELECT语句的基本语法2.2、mysql如何开启事务和提交事务&#xff1f;2.3、使用For Update进行数据锁定 三、如何使用For U…

王道计算机网络学习笔记(2)——物理层

前言 文章中的内容来自B站王道考研计算机网络课程&#xff0c;想要完整学习的可以到B站官方看完整版。 二&#xff1a;物理层 2.1.1&#xff1a;物理层基本概念 2.1.2&#xff1a;数据通信基本知识 1、数据通信模型和基本概念 通信目的是为了传递消息&#xff08;消息&…

2022 年第十二届 MathorCup 高校数学建模挑战赛D题思路(移动通信网络站址规划和区域聚类问题)

目录 一、前言 二、问题背景 三、问题 四、解题思路 &#xff08;1&#xff09;针对问题1&#xff1a; &#xff08;2&#xff09;针对问题2&#xff1a; &#xff08;3&#xff09;针对问题3&#xff1a; 五、附上几个典型代码 &#xff08;1&#xff09;K-means算法…

6月16日,企业快成长技术创新论坛厦门站大数据专场开启!

全球大数据规模增长快速&#xff0c;2020年全球新增数据规模为64ZB&#xff0c;是2016年的400%&#xff0c;2035年新增数据将高达2140ZB1&#xff0c;大数据呈现指数级增长。随着数字经济的发展和数字化转型的深入&#xff0c;愈来愈多的数据资源正以数据要素的形态独立存在并参…

STM32F4_DS18B20红外温度传感器

目录 前言 1. 单总线时序结构 2. DS18B20结构 2.1 DS18B20操作流程 2.2 DS18B20数据帧 3. 温度存储格式 4. 硬件分析 5. 实验程序详解 5.1 main.c 5.2 DS18B20.c 5.3 DS18B20.h 前言 STM32F4内部集成了温度传感器。在之前的学习中&#xff0c;我们已经学习了使用AD进…

宁波天一永安杯初赛 wp-AGCTS战队

文章目录 MISCZipSimpleDocumentBeautifulImage WebDeserializationCodeCheck CryptoSecretRsa MobilePeacock pwnwingtip REPolenta MISC Zip ARCHPR 直接数字爆破&#xff0c;得到二进制密码&#xff0c;得 flag SimpleDocument Kali binwalk 发现里面有一 pdf 文件&#…

DRIFTINGBLUES: 3实战演练

文章目录 DRIFTINGBLUES: 3实战演练一、前期准备1、相关信息 二、信息收集1、端口扫描2、访问网站3、访问网页4、翻译内容5、访问网页6、翻译内容8、查看源码9、解密10、访问网页11、写入shell并登录12、连接shell13、查找nc14、反弹shell 三、后渗透1、进入家目录查找文件2、写…

分布式应用 ----- 点对点(p2p)网络

目录 1. 概述 1.1. P2P的概念 1.2. P2P产生的背景 1.3. P2P的优劣势 2. P2P分类 2.1. 根据中央化程度 2.2. 根据网络拓扑结构 3. NAT技术详解 3.1. 概述 3.2. NAT的优劣势 3.3. NAT穿透常见解决方案 3.4. 探针打洞基本原理 3.4.1. 基本原理 3.4.2. 同一个NAT网关内…

2023年企业云盘排行榜,这些产品值得尝试!

在当今信息技术高度发达的时代&#xff0c;企业对于信息的存储和管理需求越来越高。因此&#xff0c;企业云盘逐渐成为了企业存储与管理的重要组成部分。企业云盘能够实现多设备共享、远程控制、安全备份、合作办公等多种功能&#xff0c;方便高效地解决企业内部信息管理问题。…

【AIGC】17、MM-OVOD | 同时使用文本示例和图像示例来指导分类

文章目录 一、背景二、方法2.1 框架总览2.1.1 Text-based classifiers from language descriptions2.1.2 Vision-based Classifiers from Image Exemplars2.1.3 Constructing Classifiers via Multi-Modal Fusion 三、效果3.1 数据集3.2 实现细节3.3 开集目标检测结果 论文&…

双向交错CCM图腾柱无桥单相PFC学习仿真与实现(2)SOGI_PLL学习仿真总结

目录 前言 SOGI基本原理 锁相环基本原理 仿真实现及说明 总结 前言 前面总结了双向交错CCM图腾柱无桥单相PFC系统实现&#xff0c;后面把问题细分&#xff0c;关于SOGI锁相环的应用和学习在这里总结下。 双向交错CCM图腾柱无桥单相PFC学习仿真与实现&#xff08;1&#x…

Collection接口详细介绍(下)

前言&#xff1a; 本篇文章主要讲解Java中的Collection接口以及相关实现类的知识。该专栏比较适合刚入坑Java的小白以及准备秋招的大佬阅读。 如果文章有什么需要改进的地方欢迎大佬提出&#xff0c;对大佬有帮助希望可以支持下哦~ 小威在此先感谢各位小伙伴儿了&#x1f601…

CSDN 周赛 59 期

CSDN 周赛 59 期 前言判断题单选题题目1题目2填空题编程题1、题目名称:坏掉的打字机2、题目名称:布尔零点计数小结前言 由于最近,csdn 每日一练新增了两个题目,按照惯例,那么新增的题目,会就近出现在最近的 CSDN 周赛中,嗯,经常参加周赛,并关注每日一练社区的小伙伴应…

51单片机一个TIMER输出6个PWM

51单片机的timer很少&#xff0c;往往16bit的timer只有一个&#xff0c;可以硬件输出的channel也不多。如我手上这就是这个情况&#xff0c;timer1, 16bit, 只有三个通道。我想输出6个pwm&#xff0c;这个就无法硬件的方式了。只能使用软件模拟了。pwm是1-20ms一个周期&#xf…

Thinking in Java第四版2.8注释和嵌入式文档

文章目录 前言一、注释风格1.单行注释2.多行注释 二、语法三、标签总结 前言 Java8官方在线文档 文档描述对每个系统来说都是必备且重要的&#xff0c;这里将介绍一些javadoc标签&#xff0c;以便加深对文档的理解和编写等。 一、注释风格 1.单行注释 单行注释以一个//起头&a…

JavaWeb之tomcarHTTP

1 DOM4j Xml解析 1.1 JAXP  JDK内置&#xff0c;不需要导入第三方jar包&#xff0c;简单工具优先选择。  支持两种解析方式&#xff1a;DOM、SAX 1.1.1 JAXP—DOM 加载xml 生成一个DOM树。获得整个文档的描述对象Document 解析 api 获得工厂 DocumentBuilderFactory –》 …

【MySql】MySql的事务基础篇

文章目录 CURD加控制什么是事物为什么会出现事务事务的版本支持事务的提交方式 CURD加控制 模拟一个买票系统的场景如下所示&#xff1a; MySQL注定会被多个客户端进行访问的&#xff0c;这个是肯定的&#xff0c;存储的都是数据&#xff0c;数据在上层可能有一个线程在用&…

C++17

目录 基本语言特性结构化绑定if和switch初始化器 std::string_view属性[[nodiscard]][[maybe_unused]][[fallthrough]] 模板特性新的标准库组件std::optional<>std::variant<>std::anystd::bytestd::as_const 文件系统库零星新特性 基本语言特性 结构化绑定 概念…