deep learning with pytorch(一)

news2024/9/27 17:34:06

1.create a basic nerual network model with pytorch

数据集 Iris UCI Machine Learning Repository

fully connected  

目标:创建从输入层的代码开始,向前移动到隐藏层,最后到输出层

# %%
import torch
import torch.nn as nn
import torch.nn.functional as F

# %%
# create a model class that inherits nn.Module 这里是Module 不是model
class Model(nn.Module):
    #input layer (4 features of the flower) -->
    #  Hidden layer1 (number of neurons) -->
    #  H2(n) --> output (3 classed of iris flowers)
    def __init__(self, in_features = 4, h1 = 8, h2 = 9, out_features = 3):
        super().__init__() # instantiate out nn.Module 实例化
        self.fc1 = nn.Linear(in_features= in_features, out_features= h1)
        self.fc2 = nn.Linear(in_features= h1, out_features= h2)
        self.out = nn.Linear(in_features= h2, out_features= out_features)
    
    # moves everything forward 
    def forward(self, x):
        # rectified linear unit 修正线性单元 大于0则保留,小于0另其等于0
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.out(x)

        return x
    

# %%
# before we turn it on we need to create a manual seed, because networks involve randomization every time.
# say hey start here and then go randomization, then we'll get basically close to the same outputs

# pick a manual seed for randomization
torch.manual_seed(seed= 41)
# create an instance of model
model = Model()


2.load data and train nerual network model 

torch.optim

torch.optim — PyTorch 2.2 documentation

1. optimizer.zero_grad()

  • 作用: 清零梯度。在训练神经网络时,每次参数更新前,需要将梯度清零。因为如果不清零,梯度会累加到已有的梯度上,这是PyTorch的设计决策,目的是为了处理像RNN这样的网络结构,它们在一个循环中多次计算梯度。

  • 原理: PyTorch在进行反向传播(backward)时,会累计梯度,而不是替换掉当前的梯度值。因此,如果不手动清零,梯度值会不断累积,导致训练过程出错。

2. loss.backward()

  • 作用: 计算梯度。这一步会根据损失函数对模型参数进行梯度的计算。在神经网络中,损失函数衡量的是模型输出与真实标签之间的差异,通过反向传播算法,可以计算出损失函数关于模型各个参数的梯度。

  • 原理: 反向传播是一种有效计算梯度的算法,它首先计算输出层的梯度,然后逆向逐层传播至输入层。这个过程依赖于链式法则,是深度学习训练中的核心。

3. optimizer.step()

  • 作用: 更新参数。基于计算出的梯度,更新模型的参数。这一步实际上是在执行优化算法(如SGD、Adam等),根据梯度方向和设定的学习率调整参数值,以减小损失函数的值。

  • 原理: 优化器根据梯度下降(或其它优化算法)更新模型参数。梯度指示了损失函数增长最快的方向,因此通过向相反方向调整参数,模型的预测误差会逐渐减小。

  • # %%
    import pandas as pd
    import matplotlib.pyplot as plt
    %matplotlib inline
    
    # %%
    # url = 'https://gist.githubusercontent.com/curran/a08a1080b88344b0c8a7/raw/0e7a9b0a5d22642a06d3d5b9bcbad9890c8ee534/iris.csv'
    my_df = pd.read_csv('dataset/iris.csv')
    
    # %%
    # change last column from strings to integers
    my_df['species'] = my_df['species'].replace('setosa', 0.0)
    my_df['species'] = my_df['species'].replace('versicolor', 1.0)
    my_df['species'] = my_df['species'].replace('virginica', 2.0)
    my_df
    
    # my_df.head()
    # my_df.tail()
    
    # %%
    # train test split ,set X,Y    
    X = my_df.drop('species', axis = 1) # 删除指定列
    y = my_df['species']
    
    # %%
    #Convert these to numpy arrays
    X = X.values
    y = y.values
    # X
    
    # %%
    # train test split
    from sklearn.model_selection import train_test_split
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size= 0.2, random_state= 41)
    
    # %%
    # convert X features to float tensors
    X_train = torch.FloatTensor(X_train)
    X_test = torch.FloatTensor(X_test)
    #convert y labels to long tensors
    y_train = torch.LongTensor(y_train)
    y_test = torch.LongTensor(y_test)
    
    # %%
    # set the criterion of model to measure the error,how far off the predicitons are from the data
    criterion = nn.CrossEntropyLoss()
    # choose Adam optimizer, lr = learing rate (if error does not go down after a bunch of 
    # iterations(epochs), lower our learning rate),学习率越低,学习所需时间越长
    optimizer = torch.optim.Adam(model.parameters(), lr= 0.01)
    # 传进去的参数包括fc1, fc2, out
    # model.parameters
    
    # %%
    # train our model
    # epochs? (one run through all the training data in out network )
    epochs = 100
    losses = []
    for i in range(epochs):
        # go forward and get a prediction
        y_pred = model.forward(X_train) # get a predicted results
    
        #measure the loss/error, gonna be high at first
        loss = criterion(y_pred, y_train) # predicted values vs y_train
    
        # keep track of our losses
        #detach()不再跟踪计算图中的梯度信息,numpy(): 这个方法将PyTorch张量转换成NumPy数组。因为NumPy数组在Python科学计算中非常普遍,很多库和函数需要用到NumPy数组作为输入。
        losses.append(loss.detach().numpy()) 
    
        #print every 10 epoches
        if i % 10 == 0:
            print(f'Epoch: {i} and loss: {loss}')
        
        # do some back propagation: take the error rate of forward propagation and feed it back
        # thru the network to fine tune the weights
        # optimizer.zero_grad() 清零梯度,为新的梯度计算做准备。
        # loss.backward() 计算梯度,即对损失函数进行微分,获取参数的梯度。
        # optimizer.step() 更新参数,根据梯度和学习率调整参数值以最小化损失函数。
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
    
    
    # %%
    # graph it out
    plt.plot(range(epochs), losses)
    plt.ylabel("loss/error")
    plt.xlabel("Epoch")
    

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

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

相关文章

Vue开发实例(五)修改项目入口页面布局

修改项目入口 一、创建新入口二、分析代码,修改入口三、搭建项目主页面布局1、Container 布局容器介绍2、创建布局3、布局器铺满屏幕4、创建Header页面5、加入Aside、Main和Footer模块 一、创建新入口 创建新的入口,取消原来的HelloWorld入口 参考代码…

图像分割 - 凸包(图像的轮廓)

1、前言 之前的文章 绘制几何图形的轮廓,介绍了矩形包围框和圆形包围框。 虽然这两种包围框以及足够逼近图形的边缘,但为了保持几何形状(矩形和圆形),其实与图形的真实轮廓贴合度较差,为了更贴近图形轮廓,这里介绍凸包。 凸包:图形最外层的端点,将端点连接起来,围…

[C++]AVL树怎么转

AVL树是啥 一提到AVL树,脑子里不是旋了,就是悬了。 AVL树之所以难,并不是因为结构难以理解,而是因为他的旋转。 AVL树定义 平衡因子:对于一颗二叉树,某节点的左右子树高度之差,就是该节点的…

训练2布线 玛露希尔

前言 这不是雕刻 是布线纹理绘制blender材质渲染 2D 3D 起手式 八点眼 侧峰线 三角鼻(三面鼻) 下颚角 额, 嘴 线 法令环 橄榄嘴

linux高级编程:线程(二)、进程间的通信方式

线程: 回顾线程(一): 1.线程间通信问题 线程间共享同一个资源(临界资源) 互斥: 排他性访问 linux系统 -- 提供了Posix标准的函数库 -- 互斥量(互斥锁) 原子操作&#x…

内存管理 -----分段分页

分段 分段:程序的分段地址空间,分段寻址方案 两个问题 分段 :是更好分离和共享 左边是有序的逻辑地址,右边是无序的物理地址,然后需要有一种映射的关系(段关联机制) 各个程序的分配相应的地址…

Pygame教程01:初识pygame游戏模块

Pygame是一个用于创建基本的2D游戏和图形应用程序。它提供了一套丰富的工具,让开发者能够轻松地创建游戏和其他图形应用程序。Pygame 支持许多功能,包括图像和声音处理、事件处理、碰撞检测、字体渲染等。 Pygame 是在 SDL(Simple DirectMed…

181基于matlab的利用LMS算法、格型LMS算法、RLS算法、LSL算法来估计线性预测模型参数a1和a2

基于matlab的利用LMS算法、格型LMS算法、RLS算法、LSL算法来估计线性预测模型参数a1和a2;预测信号由二阶线性预测模型产生。2.利用LMS算法和RLS算法将一个叠加有噪声的信号实现噪声消除,恢复原始信号。有22页试验分析文档。(包括程序在内&…

通过MNIST手写数字识别任务快速入门深度学习(事无巨细版)

什么是深度学习 深度学习(DL, Deep Learning)是机器学习(ML, Machine Learning)领域中一个研究方向。 深度学习通过对样本数据的内在规律和特征的提取与抽象,在不同维度和层次上进行处理,让机器能够像人一样具有分析学习能力,能够识别文字、图像和声音等数据。 相比于初期的…

【算法科目】2024年第二届全国大学生信息技术认证挑战赛 题解

图像压缩 曾经看到过,这是一道洛谷原题,很可惜我没做过,有点看不懂就没尝试。 原题链接:B3851 [GESP202306 四级] 图像压缩 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 因数分解 直接枚举就行了,从2开始找因子&a…

python中的类与对象(3)

目录 一. 类的多继承 二. 类的封装 三. 类的多态 四. 类与对象综合练习:校园管理系统 一. 类的多继承 在(2)第四节中我们介绍了什么是类的继承,在子类的括号里面写入要继承的父类名。上一节我们只在括号内写了一个父类名&…

Latex中如何调整算法伪代码\begin{algorithm}的字体大小?

在LaTeX中,要调整algorithm环境(通常与algorithmic、algorithmicx、algorithm2e等包一起使用来编写伪代码)中的字体大小,你可以使用\small、\footnotesize、\tiny等命令来减小字体大小,或者使用\large、\Large、\LARGE…

简单实现文字滚动效果-CSS版本

先看看效果 话不多说直接上代码 <template><div class"main"><div class"scroll-region"><div class"swiper-scroll-content"><span class"list-btn" v-for"(item, index) in overviewList" :…

【重温设计模式】命令模式及其Java示例

命令模式的介绍 在我们的编程世界中&#xff0c;设计模式如同一盏指路明灯&#xff0c;它们是前人智慧的结晶&#xff0c;为我们照亮了解决复杂问题的路径。 其中&#xff0c;命令模式是一种行为设计模式&#xff0c;其主要的目标是将操作封装到对象中。这种模式的一个显著特点…

基于springboot+vue的图书电子商务网站

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

数据修改

Oracle 目录 数据修改 将员工编号的 7369 的员工工资修改为 810&#xff0c;佣金改为 100 将工资最低的员工工资修改为公司的平均工资 将所有在 1981 年雇佣的员工的雇佣日期修改为今天&#xff0c;工资增长 20% 数据的更新操作 Oracle从入门到总裁:https://blog.csdn.n…

学习人工智能的方法及方向!

目录 一、第一部分&#xff1a;了解人工智能 二、人工智能学习路线图 三、职业规划 四、未来展望 五、总结 在这个信息爆炸的时代&#xff0c;想要系统性地学习人工智能&#xff08;AI&#xff09;并找到对应方向的工作&#xff0c;你需要一个明确的学习路径和职业规划。本…

【latex】\IEEEpubid版权声明与正文内容重叠

问题描述 撰写IEEE Trans论文时&#xff0c;出现版权声明文字\IEEEpubid与正文内容重叠的问题&#xff1a; 原因分析&#xff1a; 在使用模板时&#xff0c;不小心将以下命令删除了&#xff1a; \IEEEpubidadjcol 解决方案&#xff1a; 在需要换页的位置附近添加以上命令&…

投影和定义投影的区别

Arcmap中关于投影的工具有四个&#xff0c;分别是定义投影、投影、投影栅格、批量投影。这四个工具既有相同之处也有不同之处&#xff0c;下面我将一一介绍。 ①定义投影&#xff1a;Arcmap中关于定义投影工具是这样描述的&#xff1a;“所有地理数据集均具有一个用于显示、测…

【LeetCode题解】2859. 计算 K 置位下标对应元素的和+938. 二叉搜索树的范围和+1028. 从先序遍历还原二叉树(三种方法:栈+递归+集合)

文章目录 [2859. 计算 K 置位下标对应元素的和](https://leetcode.cn/problems/sum-of-values-at-indices-with-k-set-bits/)思路&#xff1a; [938. 二叉搜索树的范围和](https://leetcode.cn/problems/range-sum-of-bst/)思路&#xff1a;写法一&#xff1a;在中间累加写法二…