PyTorch基础入门(1)

el/2023/9/24 23:04:36

神经网络模块 (nn.Module)

nn.Module :是pytorch里面神经网络的基类,当我们实现线性模型时需要继承它

1.线性模型:

	构建模型(样例):import torch.nn as nn
import torch
from torch.autograd import Variableclass LinearModel(nn.Module):# 构建线性模型def __init__(self):super(LinerModel, self).__init__()self.linear = nn.Linear(1,2)  # 1表示输入维度,2表示输出维度def forward(self,x):output = self.linear(x)  # x表示的输入的数据return output
"""
上面是实现的一个简单的线性模型
下面表示训练该线性模型的过程
"""
if torch.cuda.is_available():  # 判断cuda是否能用model = LinearModel().cuda()  # 表示使用cuda(也及时启用GPU)训练模型
else:model = LinearModel()
"设置损失函数和优化器"
criterion = nn.MSELoss()  # 使用均方差误差损失函数
optimizer = torch.optim.SGD(model.parameters(),lr=1e-3)  # 初始化优化器,这儿使用的是随机梯度下降
"开始训练"
"设置迭代次数"
num_epochs = 1000
for epoch in range(num_epochs):"""x_train:表示训练时的输入y_train:表示训练时的输出"""if torch.cuda.is_availabel():"使用Variable将输入转成变量放入计算图"inputs = Variable(x_train).cuda()  # 启用cuda加速labels = Variable(y_train).cuda()  # 启用cuda加速else:inputs = Variable(x_train)  # 不启用cuda加速labels = Variable(y_train)  # 不启用cuda加速outputs = model(inputs)  # 进行前向传播,获得输出loss = criterion(outputs, labels)  # 进行误差计算,就是比较模型输出与标签的差异optimizer.zero_grad()  # 将优化器的梯度置零,防止梯度叠加,导致无法收敛loss.backward()  # 反向传播optimizer.step()if (epoch+1)%20 == 0:print("Epoch[{}/{}],loss:{:.6f}".format(epoch+1,num_epochs,loss.data[0]))"进行模型的测试"
model.eval()  # 将模型转换成测试模型(如果不适用这个可能会报错)
predict = model(Variable(x_test))
predict = predict.data.numpy()  # 转成能够打印的数据
pring(predict)

2.分类模型(以二分类为例):

	构建模型(样例):import torch.nn as nn
import torch
from torch.autograd import Variableclass ClassificationModel(nn.Module):# 构建二分类模型,使用sigmoid()函数进行分类def __init__(self):super(ClassificationModel, self).__init__()self.Linear = nn.Linear(2,1)self.sigmoid = nn.sigmoid()def forward(self,x):out = self.Linear(x)out = self.sigmoid(out)return outclassification = ClassificationModel()  # 初始化分类模型
if torch.cuda.is_available():classification.cuda()criterion = nn.BCELoss()  # 二分类的损失函数
optimizer = torch.optim.SGD(classification.parameters(), lr=1e-3,momentum=0.9)num_epoch = 5000
for epoch in range(num_epoch):if torch.cuda.is_available():inputs = Variable(x_train).cuda()labels = Variable(y_train).cuda()else:inputs = Variable(x_train)outputs = Variable(y_train)"前向传播"outputs = classification(inputs)loss = criterion(outputs,labels)mask = outputs.ge(0.5).float()  # 0.5表示阈值,如果大于0.5表示属于第一类,不然属于第二类correct = (mask==labels).sum()acc = correct.data[0]/inputs.size(0)  # 计算精度"反向传播"optimizer.zero_grad()loss.backward()optimizer.step()if (epoch+1) %20 == 0:print('*'*10)print('epoch:{}'.format(epoch+1))print('loss:{}'.format(loss.data[0]))print('acc:{}'.format(acc))说明:correct = (mask==labels).sum()  该方法是用于统计该分类与标签相同的个数

参考书籍:《深度学习入门之PyTorch》


http://www.ngui.cc/el/3577064.html

相关文章

关于python中出现编码错误

UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0x80 in position 0: illegal multibyte sequence 解决办法就是换个编码格式: 例如:原本代码是这样的 fo open(file, rb) dict pickle.load(fo, encodingutf-8)修改之后只需要在打开的时候指定…

PyTorch入门2

神经网络 全连接神经网络: nn.Linear() 是pytorch里面的线性模块,也就是全连接层,主要参数有inputs_size:输入的数据大小outputs_size:输出的数据的大小bias: 表示是否使用偏置,是一个bool值,默认为True,样例:from torch.nn import nn class…

数据结构单链表的循环链表及基本操作实现(C语言实现)

循环链表的基本操作的实现 特点&#xff1a;循环链表可以从任意一个位置循环遍历整个链表&#xff0c;如果设置的的为尾指针的话&#xff0c;其操作头节点后为节点的时间复杂度外O(1); 其实现代码如下 #include <stdio.h> #include <stdlib.h> #include <stdb…

Pytorch中GPU训练好模型CPU下使用

GPU训练模型在CPU下使用 今天我想试试那个SkyAR,但是我没找到GPU的电脑我就想在CPU下使用GPU训练好的模型&#xff0c;使用的时遇到了下面这个问题 RuntimeError: Attempting to deserialize object on a CUDA device but torch.cuda.is_available() is False. If you are ru…

C++按照空格分割字符串

C /A/B/1 1024 C /A/B/2 1024 C /A/B/1/3 1024 C /A 1024 R /A/B/1/3 Q / 0 1500 C /A/B/1 100 Q / 0 1500 R /A/B Q / 0 1 当我们需要处理上述数据时&#xff0c;其中有空格作为标志进行分割我们可以采取C中的一个处理string的标准库sstream。 操作方法如下&#xff1a; stri…

删除含有头结点的单链表中的最小值的结点

删除有头节点的单链表中的最小值的结点 #include <iostream>using namespace std;typedef struct node {int data;struct node *next; } LNode;void Del_minNode(LNode *L);LNode *CreateLink(const int data[], int n);void PrtLink(LNode *L);int main() {int n 6;int…

循环队列出队与入队

循环队列的入队与出队 #include <iostream>#define MaxSize 10using namespace std;typedef struct Node {int data[MaxSize];int front, rear; //队首&#xff0c;队尾指针 } SQueue;SQueue *init_queue();int En_queue(SQueue &qu, int x);int De_queue(SQueue &a…

邻接表创建有向图

使用邻接表创建有向图&#xff0c;可以使用数组链表的方式创建。 定义的顶点表如下 生成代码如下 char c; for (int i 0; i < graph->n; i) {cin >> c;graph->adj_list[i].data c;graph->adj_list[i].first_arc nullptr; }我们的图的整体结构如下图所示…

线索二叉树(先序)

#include <iostream>using namespace std;typedef struct ThBTNode {char data;ThBTNode *l_child;ThBTNode *r_child;int l_tag, r_tag;//l_tag1表示指向前驱&#xff0c;l_tag0表示指向左孩子//r_tag1表示指向后继&#xff0c;r_tag0表示指向右孩子 } ThBTNode;ThBTNod…

统计二叉树的叶子节点个数

#include <iostream> #include <queue>using namespace std;typedef struct node {char data;struct node *lchild;struct node *rchild; } TNode;TNode *CreateTree(TNode *&t);int Count(TNode *t); //统计t的叶子节点个数,非递归 int R_Count(TNode *t); //…