机器学习之路: 神经网络的初步认识-基于pytorch搭建自己的神经网络

引子

当前交通大数据业务的需要,需要承担一部分算法工作(数据处理)

在这里插入图片描述

目标四:

  • 学习深度学习基础:了解神经网络的基本结构、反向传播算法和激活函数等。

目标任务:使用深度学习算法构建一个简单的神经网络模型,并训练模型。

学习计划小贴士:

  • 每天定期复习前几天的内容,巩固知识。

  • 在学习过程中遇到问题及时查阅资料,或向论坛、社区寻求帮助。

  • 尝试在学习过程中动手实践,通过编写代码来加深对算法和原理的理解。

  • 学习过程中保持积极的学习态度和耐心,机器学习和深度学习是复杂的领域,需要持续学习和实践。

  • 学习机器学习基础:了解机器学习的定义、分类和基本原理。

  • 掌握数据预处理:学习数据清洗、特征选择和特征工程的基本方法。

准备一份草稿,后面更新

神经网络的基本结构

神经网络是一种由多个层次(层)的神经元组成的模型,它们之间相互连接。神经网络的基本结构包括:

输入层:接受原始数据的输入。每个输入特征对应于输入层中的一个神经元。

隐藏层:在输入层和输出层之间的一层或多层,执行线性和非线性变换。这些层有助于神经网络学习数据中的复杂模式。

输出层:产生模型的最终输出。输出层的神经元数目通常由任务的性质决定,例如分类任务的输出类别数。

每个神经元都与前一层的所有神经元连接,并带有权重,这些权重是神经网络学习的关键。

反向传播算法和激活函数

反向传播是训练神经网络的核心算法。它通过计算模型输出与实际目标之间的误差,并将误差反向传播到网络中的每一层,以更新权重和偏置,减小误差。这个过程包括两个主要步骤:

前向传播:通过将输入数据从输入层传递到输出层,计算模型的预测输出。

反向传播:计算输出误差,然后从输出层向后传播,以便在每一层更新权重和偏置。

反向传播使用梯度下降等优化算法来最小化误差,使神经网络能够逐渐适应训练数据。

激活函数是神经网络中的非线性函数,它们在隐藏层中引入了非线性性质。常见的激活函数包括:

ReLU(Rectified Linear Unit):f(x) = max(0, x)。它是最常用的激活函数,引入非线性性质并提高了训练速度。
Sigmoid函数:f(x) = 1 / (1 + e^(-x))。它将输入映射到0和1之间,通常用于二元分类问题。
Tanh函数:f(x) = (e^(x) - e^(-x)) / (e^(x) + e^(-x))。它将输入映射到-1和1之间,也用于分类问题。
激活函数在神经网络中引入非线性性,允许神经网络模型学习更复杂的函数。

优化器

优化器是用于调整神经网络权重和偏置的算法,以最小化损失函数。常见的优化器包括:

随机梯度下降(SGD):通过计算损失函数的梯度来更新权重,是最基本的优化算法之一。
Adam:结合了动量和自适应学习率的特性,通常在深度学习中表现出色。
RMSprop:自适应学习率算法,用于处理不同特征的不同梯度尺度。
Adagrad:自适应学习率算法,根据历史梯度信息调整学习率。
优化器的选择可以影响模型的训练速度和性能,通常需要根据具体任务进行调整。

这些是神经网络和深度学习的基本概念。深度学习是一个广泛而深入的领域,涵盖了许多更复杂的技术和概念,但这些基础知识对于理解神经网络的工作原理和进行深度学习研究都是关键的。

如何通过pytorch搭建自己的BP network

这里用到一个新的接口 torch.nn.Module

在这里插入图片描述

解释一下,torch.nn给了我们一个快速搭建bp的脚手架,我们可以直接设定参数来选择层数、神经元个数、每层的功能等;
对应的api如下

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

这里,我搭建一个简单网络进行处理,输入一些数据进行测试:

import torch
import torchvision.datasets
from torch.utils.data import Dataset
from PIL import Image
from torch import nn
import torch.nn.functional as F
import numpy as np
from torch.utils.data import DataLoader


class MyData(nn.Module):

    def __init__(self) -> None:
        super().__init__()
        self.conv1 = nn.Conv2d(1,20,1)
        self.conv2 = nn.Conv2d(20,20,5)



    def forward(self, input):
        output = F.relu(self.conv1(input))
        output = F.relu(self.conv2(output))
        return output

dataset  = torchvision.datasets.CIFAR10("../data", train=False, transform=torchvision.transforms.ToTensor(),
                             download=True)
dataloader = DataLoader(dataset, batch_size=64)

MyData = MyData()
x = torch.Tensor([[
        [[0.1000, 0.1000, 0.1000, 0.1000, 0.5000],
        [0.1000, 0.1000, 0.1000, 0.1000, 0.5000],
        [0.1000, 0.1000, 0.1000, 0.1000, 0.5000],
        [0.1000, 0.1000, 0.1000, 0.1000, 0.5000],
        [0.1000, 0.1000, 0.1000, 0.1000, 0.5000]]
]])

print(x)
print("ouput:", MyData(x))


结果分析:

tensor([[[[0.1000, 0.1000, 0.1000, 0.1000, 0.5000],
[0.1000, 0.1000, 0.1000, 0.1000, 0.5000],
[0.1000, 0.1000, 0.1000, 0.1000, 0.5000],
[0.1000, 0.1000, 0.1000, 0.1000, 0.5000],
[0.1000, 0.1000, 0.1000, 0.1000, 0.5000]]]])

ouput: tensor([[[[0.0000]], [[0.1192]], [[0.0000]], [[0.0000]], [[0.0000]], [[0.0115]], [[0.0885]], [[0.0000]],

        self.conv1 = nn.Conv2d(1,20,1)
        self.conv2 = nn.Conv2d(20,20,5)

这里的Conv2d(1,20,1)是指进行卷积,输入通道数1,输出通道为20,我们的卷积核为1*1;
最后进过两轮卷积,最后生成对应的结果;

卷积广泛应用于图像分类,下一章我们将讲到一个图像分类的小项目;

图像分类,根据各自在图像信息中所反映的不同特征,把不同类别的目标区分开来的图像处理方法。它利用计算机对图像进行定量分析,把图像或图像中的每个像元或区域划归为若干个类别中的某一种,以代替人的视觉判读。

卷积神经网络(CNN)是用于图像分类问题的最流行的神经网络模型。CNN背后的一个重要思想是,对图像的局部理解是好的。实际的好处是,参数少将大大缩短了学习所需的时间,并减少了训练模型所需的数据量。CNN具有足够的权重来查看图像的小块,而不是来自每个像素的完全连接的权重网络。

神经网络是深度学习的基本组成部分,用于模拟人类大脑中神经元之间的连接。在这篇博客中,我们将初步认识神经网络,并使用PyTorch构建自己的神经网络,并通过可视化来理解其工作原理。

什么是神经网络?

神经网络是一种机器学习模型,它由多个层次(层)的神经元组成,这些神经元之间相互连接,通过学习来进行信息处理和预测。神经网络的核心是前馈传播(feedforward)和反向传播(backpropagation)。

前馈传播

在前馈传播中,输入数据通过神经网络的各个层,每个层都对输入进行一系列的线性变换和非线性变换(激活函数),最终产生输出。

反向传播

反向传播是用于训练神经网络的关键技术。它通过计算模型输出与实际标签之间的误差,并将误差反向传播到网络中的每一层,以更新权重和偏置,从而减小误差。

使用PyTorch构建神经网络

PyTorch是一个流行的深度学习框架,它使构建和训练神经网络变得更加容易。下面是一个使用PyTorch构建简单神经网络的示例,并通过可视化来理解其结构:

构建神经网络,可视化

import torch
import torch.nn as nn
import matplotlib.pyplot as plt

# 定义神经网络模型
class SimpleNet(nn.Module):
    def __init__(self):
        super(SimpleNet, self).__init__()
        self.fc1 = nn.Linear(2, 5)  # 输入层到隐藏层
        self.relu = nn.ReLU()       # 激活函数
        self.fc2 = nn.Linear(5, 1)  # 隐藏层到输出层

    def forward(self, x):
        x = self.fc1(x)
        x = self.relu(x)
        x = self.fc2(x)
        return x

# 创建神经网络实例
net = SimpleNet()

# 输出神经网络结构
print(net)

# 可视化神经网络结构
def visualize_network(model):
    # 获取每一层的权重矩阵
    layers = [layer for layer in model.children()]
    weights = [layer.weight.data.numpy() for layer in layers if hasattr(layer, 'weight')]
    layer_names = [str(i) for i in range(len(weights))]

    # 可视化权重矩阵
    fig, axs = plt.subplots(1, len(weights), figsize=(15, 5))
    for i, weight in enumerate(weights):
        axs[i].imshow(weight, cmap='viridis', aspect='auto')
        axs[i].set_title(f'Layer {i}')
        axs[i].set_xlabel('Neurons')
        axs[i].set_ylabel('Input Features')
    
    plt.tight_layout()
    plt.show()

# 可视化神经网络结构
visualize_network(net)

演示了如何使用PyTorch构建一个简单的前馈神经网络(Feedforward Neural Network)并使用matplotlib进行可视化。以下是代码的主要部分及其解释:

导入必要的库:

torch:PyTorch库,用于构建和训练神经网络。
torch.nn:PyTorch的神经网络模块,用于定义神经网络层。
matplotlib.pyplot:Matplotlib库,用于可视化神经网络的权重矩阵。
定义神经网络模型:

SimpleNet类是一个简单的神经网络模型。它包括一个输入层、一个隐藏层和一个输出层。
self.fc1:输入层到隐藏层的全连接层,输入特征数为2,输出特征数为5。
self.relu:激活函数层,使用ReLU(Rectified Linear Unit)作为激活函数。
self.fc2:隐藏层到输出层的全连接层,输入特征数为5,输出特征数为1。
创建神经网络实例:

创建了一个SimpleNet类的实例,即神经网络模型net。
输出神经网络结构:

使用print(net)打印神经网络的结构,包括每一层的信息。
可视化神经网络结构:

visualize_network函数用于可视化神经网络的权重矩阵。
通过遍历神经网络的每一层,提取每层的权重矩阵。
使用imshow函数将权重矩阵以图像的形式显示出来,每一列对应一个神经元,每一行对应一个输入特征。
创建一个图形,其中包含每一层的权重矩阵可视化图。
最后,使用plt.show()显示图形。
总的来说,这段代码演示了如何构建一个简单的神经网络模型,然后可视化神经网络中每一层的权重矩阵。这对于理解神经网络内部结构和权重分布非常有帮助,特别是在更复杂的神经网络中。你可以根据需要修改神经网络的结构和层数,并使用可视化来更好地理解和调试你的模型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值