【Pytorch神经网络理论篇】 05 Module类的使用方法+参数Parameters类+定义训练模型的步骤与方法

同学你好!本文章于2021年末编写,获得广泛的好评!

故在2022年末对本系列进行填充与更新,欢迎大家订阅最新的专栏,获取基于Pytorch1.10版本的理论代码(2023版)实现,

Pytorch深度学习·理论篇(2023版)目录地址为:

CSDN独家 | 全网首发 | Pytorch深度学习·理论篇(2023版)目录本专栏将通过系统的深度学习实例,从可解释性的角度对深度学习的原理进行讲解与分析,通过将深度学习知识与Pytorch的高效结合,帮助各位新入门的读者理解深度学习各个模板之间的关系,这些均是在Pytorch上实现的,可以有效的结合当前各位研究生的研究方向,设计人工智能的各个领域,是经过一年时间打磨的精品专栏!https://v9999.blog.csdn.net/article/details/127587345欢迎大家订阅(2023版)理论篇

以下为2021版原文~~~~

 

1 Module类的使用方法

1.1 Module类的add_module()方法

1.1.1 概述

add_module():将XX层插入到模型结构中

1.1.2 add_module()----LogicNet_fun.py(第1部分)

import torch.nn as nn
import torch
import numpy as np
import matplotlib.pyplot as pltclass LogicNet(nn.Module):def __init__(self,inputdim,hiddendim,outputdim):super(LogicNet, self).__init__()### 方法①self.Linear1 = nn.Linear(inputdim,hiddendim)self.Linear2 = nn.Linear(hiddendim,outputdim)### 方法②self.add_module("Linear1",nn.Linear(inputdim,hiddendim))self.add_module("Linear2",nn.Linear(hiddendim,outputdim))self.criterion = nn.CrossEntropyLoss()def forward(self,x):x = self.Linear1(x)
model = LogicNet(inputdim=2,hiddendim=3,outputdim=2)
optimizer = torch.optim.Adam(model.parameters(),lr=0.01)

1.2 Module类的children()方法

1.2.1 children()概述

children()方法获取模型中的各层函数

1.2.2 children()代码实现----LogicNet_fun.py(第2部分)

### Module类的children()方法===》获取模型中的各层函数
for sub_module in model.children():print(sub_module)# 输出 Linear(in_features=2, out_features=3, bias=True)#     Linear(in_features=3, out_features=2, bias=True)#     CrossEntropyLoss()

1.3 Module类的named_children()方法

1.3.1named_children()概述

named_children()获取模型中的各层名字与结构信息

1.3.2 named_children()代码实现----LogicNet_fun.py(第3部分)

### Module类的named_children()===>获取模型中的各层名字与结构信息
for name,module in model.named_children():print(name,"is:",module)# 输出 Linear1 is: Linear(in_features=2, out_features=3, bias=True)#     Linear2 is: Linear(in_features=3, out_features=2, bias=True)#     criterion is: CrossEntropyLoss()

1.4 Module类的modules()方法

1.4.1 modules()概述

modules()获取整个网络的结构信息

1.4.2 modules()()代码实现----LogicNet_fun.py(第4部分)

### Module类的modules()===>获取整个网络的结构信息
for module in model.modules():print(module)# 输出 LogicNet(#               (Linear1): Linear(in_features=2, out_features=3, bias=True)#               (Linear2): Linear(in_features=3, out_features=2, bias=True)#               (criterion): CrossEntropyLoss()# )model.eval()# 输出 Linear(in_features=2, out_features=3, bias=True)#     Linear(in_features=3, out_features=2, bias=True)#     CrossEntropyLoss()

2 模型中的参数Parameters类

2.1 概述

2.1.2 模型与参数的关系

训练过程中,模型通过公式的计算结果与目标值进行对比,通过调整参数来实现误差的最小化。经过多次调整后的参数,可以使得整个模型的结果高度接近于目标值,进而得到有效的模型。

2.1.2 Parameter参数的属性

Parameters是Variable类的子类,但是存在以下两点不同

①将Parameter参数赋值给Module的属性时候,会将其自动加到Module参数列表中

②将Variable变量赋值给Module的属性时候,不会将其加到Module参数列表中

2.2模型添加参数

2.2.1 register_parameter(name,param) 为模型添加parameter参数

class Example(nn.Module):def __init__(self):super(Example, self).__init__()print('看看我们的模型有哪些parameter:\t', self._parameters, end='\n')# 输出 mymodel = Example()# '''# 看看我们的模型有哪些parameter:	 OrderedDict()self.W1_params = nn.Parameter(torch.rand(2,3))print('增加W1后看看:',self._parameters, end='\n')# 增加W1后看看: OrderedDict([('W1_params', Parameter containing:# tensor([[0.0479, 0.9264, 0.1193],#         [0.5004, 0.7336, 0.6464]], requires_grad=True))])self.register_parameter('W2_params' , nn.Parameter(torch.rand(2,3)))print('增加W2后看看:',self._parameters, end='\n')# 增加W2后看看: OrderedDict([('W1_params', Parameter containing:# tensor([[0.0479, 0.9264, 0.1193],#         [0.5004, 0.7336, 0.6464]], requires_grad=True)), ('W2_params',         Parameter containing:# tensor([[0.1028, 0.2370, 0.8500],#         [0.6116, 0.0463, 0.4229]], requires_grad=True))])# '''def forward(self, x):return x

2.2.2 register_buffer(name,param) 增加状态参数

代码:

import torch 
import torch.nn as nn
torch.manual_seed(seed=20200910)
class Model(torch.nn.Module):def __init__(self):super(Model,self).__init__()self.conv1=torch.nn.Sequential(  # 输入torch.Size([64, 1, 28, 28])torch.nn.Conv2d(1,64,kernel_size=3,stride=1,padding=1),torch.nn.ReLU(),  # 输出torch.Size([64, 64, 28, 28]))self.attribute_buffer_in = torch.randn(3,5)register_buffer_in_temp = torch.randn(4,6)self.register_buffer('register_buffer_in', register_buffer_in_temp)def forward(self,x): passprint('cuda(GPU)是否可用:',torch.cuda.is_available())
print('torch的版本:',torch.__version__)
model = Model() #.cuda()print('初始化之后模型修改之前'.center(100,"-"))
print('调用named_buffers()'.center(100,"-"))
for name, buf in model.named_buffers():print(name,'-->',buf.shape)print('调用named_parameters()'.center(100,"-"))
for name, param in model.named_parameters():print(name,'-->',param.shape)print('调用buffers()'.center(100,"-"))
for buf in model.buffers():print(buf.shape)print('调用parameters()'.center(100,"-"))
for param in model.parameters():print(param.shape)print('调用state_dict()'.center(100,"-"))
for k, v in model.state_dict().items():print(k, '-->', v.shape)model.attribute_buffer_out = torch.randn(10,10)
register_buffer_out_temp = torch.randn(15,15)
model.register_buffer('register_buffer_out', register_buffer_out_temp)
print('模型初始化以及修改之后'.center(100,"-"))
print('调用named_buffers()'.center(100,"-"))
for name, buf in model.named_buffers():print(name,'-->',buf.shape)print('调用named_parameters()'.center(100,"-"))
for name, param in model.named_parameters():print(name,'-->',param.shape)print('调用buffers()'.center(100,"-"))
for buf in model.buffers():print(buf.shape)print('调用parameters()'.center(100,"-"))
for param in model.parameters():print(param.shape)print('调用state_dict()'.center(100,"-"))
for k, v in model.state_dict().items():print(k, '-->', v.shape)

输出结果:

cuda(GPU)是否可用: True
torch的版本: 1.10.0+cu113
--------------------------------------------初始化之后模型修改之前---------------------------------------------
-----------------------------------------调用named_buffers()------------------------------------------
register_buffer_in --> torch.Size([4, 6])
----------------------------------------调用named_parameters()----------------------------------------
conv1.0.weight --> torch.Size([64, 1, 3, 3])
conv1.0.bias --> torch.Size([64])
--------------------------------------------调用buffers()---------------------------------------------
torch.Size([4, 6])
-------------------------------------------调用parameters()-------------------------------------------
torch.Size([64, 1, 3, 3])
torch.Size([64])
-------------------------------------------调用state_dict()-------------------------------------------
register_buffer_in --> torch.Size([4, 6])
conv1.0.weight --> torch.Size([64, 1, 3, 3])
conv1.0.bias --> torch.Size([64])
--------------------------------------------模型初始化以及修改之后---------------------------------------------
-----------------------------------------调用named_buffers()------------------------------------------
register_buffer_in --> torch.Size([4, 6])
register_buffer_out --> torch.Size([15, 15])
----------------------------------------调用named_parameters()----------------------------------------
conv1.0.weight --> torch.Size([64, 1, 3, 3])
conv1.0.bias --> torch.Size([64])
--------------------------------------------调用buffers()---------------------------------------------
torch.Size([4, 6])
torch.Size([15, 15])
-------------------------------------------调用parameters()-------------------------------------------
torch.Size([64, 1, 3, 3])
torch.Size([64])
-------------------------------------------调用state_dict()-------------------------------------------
register_buffer_in --> torch.Size([4, 6])
register_buffer_out --> torch.Size([15, 15])
conv1.0.weight --> torch.Size([64, 1, 3, 3])
conv1.0.bias --> torch.Size([64])

2.2.3 对比

缓冲buffer和参数Parameter的区别是前者不需要训练优化,而后者需要训练优化.在创建方法上也有区别,前者必须要将一个张量使用方法register_buffer()来登记注册,后者比较灵活,可以直接赋值给模块的属性,也可以使用方法register_parameter()来登记注册.

3 从模型中获取参数

3.1 使用parameters()方法获取模型的Parameter参数

3.1.1 parameters()方法获取模型的Parameter参数的代码----LogicNet_fun.py(第5部分)

### 使用parameters()方法获取模型的Parameter参数
for param in model.parameters():print(type(param.data),param.size())# 输出 <class 'torch.Tensor'> torch.Size([3, 2])#     <class 'torch.Tensor'> torch.Size([3])#     <class 'torch.Tensor'> torch.Size([2, 3])#     <class 'torch.Tensor'> torch.Size([2])

3.2 使用named_parameters()获取模型中的参数和参数名字

3.2.1 使用named_parameters()获取模型中的参数和参数名字----LogicNet_fun.py(第6部分)

### 使用named_parameters()获取模型中的参数和参数名字
for name, param in model.named_parameters():print(type(param.data),param.size(),name)# 输出 <class 'torch.Tensor'> torch.Size([3, 2]) Linear1.weight#     <class 'torch.Tensor'> torch.Size([3]) Linear1.bias#     <class 'torch.Tensor'> torch.Size([2, 3]) Linear2.weight#     <class 'torch.Tensor'> torch.Size([2]) Linear2.bias

3.3 state_dict()获取模型的全部参数

3.3.1 state_dict()概述

state_dict()可以将模型中的Parameter和buffer参数取出,但不可取出Variable变量

3.3.2 tate_dict()代码实现

import torch
from torch.autograd import Variable
import torch.nn as nnclass ModelPar(nn.Module):def __init__(self):super(ModelPar, self).__init__()self.Line1 = nn.Linear(1,2) # 定义全连接层self.var1 = Variable(torch.rand([1])) # 定义Variable变量self.par = nn.Parameter(torch.rand([1])) # 定义Parameter变量self.register_buffer("buffer",torch.randn([2,3])) # 定义buffer变量model = ModelPar()
for par in model.state_dict():print(par,':',model.state_dict()[par])# 输出 par : tensor([0.0285])#     buffer : tensor([[-0.7736,  0.7613,  0.5444],[ 1.0695,  0.7132, -0.3575]])#     Line1.weight : tensor([[0.7708],[0.6926]])#     Line1.bias : tensor([-0.0628, -0.6818])

3.4 为模型中的参数指定名称,并查看权重

即:通过指定名称的方式对该层的权重进行快速提取

3.4.1 代码实现

import torch
import torch.nn as nn
from collections import  OrderedDictmodel = nn.Sequential(OrderedDict([('conv1',nn.Conv2d(1,20,5)),('rule1',nn.ReLU()),('conv2',nn.Conv2d(20,64,5)),('relu2',nn.ReLU())])
)
print(model)
# 输出 Sequential(
#       (conv1): Conv2d(1, 20, kernel_size=(5, 5), stride=(1, 1))
#       (rule1): ReLU()
#       (conv2): Conv2d(20, 64, kernel_size=(5, 5), stride=(1, 1))
#       (relu2): ReLU()
#     )params = model.state_dict()
print(params['conv1.weight'])
print(params['conv1.bias'])

4 保存与载入模型

4.1 保存模型+载入模型+将模型载入指定的硬件设备

4.1.1 代码实现 ----LogicNet_fun.py(第7部分)

### 保存模型
torch.save(model.state_dict(),'./model.path')
### 载入模型
model.load_state_dict(torch.load('./model.path'))
### 将模型载入到指定的硬件设备中===>该方法并不常用
### 为实现细粒度控制 通常将其分解为  1、将模型载入内存。2、使用模型的to()方法,将模型复制到指定的设备中
model.load_state_dict(torch.load('./model.path',map_location={'cuda:1','cuda:0'}))

5 模型结构中的钩子函数

5.1 正向钩子函数概述

5.1.1 模型正向结构中的钩子

模型正向结构中的钩子函数定义:

register_forward_hook(hook)hook(module,input,output) #不可修改input和output的数值,返回一个句柄
#调用handle的remove()方法可以将hook从module中去除

在module上注册一个forward_hook,使得每次调用forward()计算输出的时候,这个hook函数就会被调用。

5.1.2 正向结构中的钩子函数的代码实现

import torch
from torch import nn
from torch.autograd import  Variabledef for_hook(module,input,output): # 定义钩子函数print("模型:",module)for val in input:print("输入:",val)for out_val in output :print("输出:",out_val)class Model(nn.Module): #定义模型def __init__(self):super(Model, self).__init__()def forward(self,x):return x+1model = Model() #实例化模型
x = Variable(torch.FloatTensor([1]),requires_grad=True)
handle = model.register_forward_hook(for_hook) # 注册钩子
print("模型结果",model(x)) # 运行模型
# 输出 模型: Model()
#     输入: tensor([1.], requires_grad=True)
#     输出: tensor(2., grad_fn=<UnbindBackward0>)
#     模型结果 tensor([2.], grad_fn=<AddBackward0>)###删除钩子
handle.remove()
print("模型结果",model(x)) # 运行模型
# 输出 模型结果 tensor([2.], grad_fn=<AddBackward0>)

5.2 反向钩子函数概述

5.2.1 反向结构中的钩子函数

模型反向结构中的钩子函数定义:

register_backward_hook(hook)
### 在module上注册一个backward_hook,每次计算module的input的梯度时,这个hook就会被调用hook(module,grad_input,grad_output) #不可修改grad_input和grad_outpu的数值,返回一个句柄
# 但可以选择性的返回关于输入的梯度,返回的梯度会在后续的计算中替换grad_input
#多个输入输出时,grad_input,grad_output会是个元组#调用handle的remove()方法可以将hook从module中去除

在module上注册一个backward_hook,使得每次计算module的input的梯度时,调用hook()

LogicNet_fun.py汇总

import torch.nn as nn
import torchclass LogicNet(nn.Module):def __init__(self,inputdim,hiddendim,outputdim):super(LogicNet, self).__init__()### 方法①self.Linear1 = nn.Linear(inputdim,hiddendim)self.Linear2 = nn.Linear(hiddendim,outputdim)### 方法②self.add_module("Linear1",nn.Linear(inputdim,hiddendim))self.add_module("Linear2",nn.Linear(hiddendim,outputdim))self.criterion = nn.CrossEntropyLoss()def forward(self,x):x = self.Linear1(x)
model = LogicNet(inputdim=2,hiddendim=3,outputdim=2)
optimizer = torch.optim.Adam(model.parameters(),lr=0.01)### Module类的children()方法===》获取模型中的各层函数
for sub_module in model.children():print(sub_module)# 输出 Linear(in_features=2, out_features=3, bias=True)#     Linear(in_features=3, out_features=2, bias=True)#     CrossEntropyLoss()### Module类的named_children()===>获取模型中的各层名字与结构信息
for name,module in model.named_children():print(name,"is:",module)# 输出 Linear1 is: Linear(in_features=2, out_features=3, bias=True)#     Linear2 is: Linear(in_features=3, out_features=2, bias=True)#     criterion is: CrossEntropyLoss()### Module类的modules()===>获取整个网络的结构信息
for module in model.modules():print(module)# 输出 LogicNet(#               (Linear1): Linear(in_features=2, out_features=3, bias=True)#               (Linear2): Linear(in_features=3, out_features=2, bias=True)#               (criterion): CrossEntropyLoss()# )model.eval()# 输出 Linear(in_features=2, out_features=3, bias=True)#     Linear(in_features=3, out_features=2, bias=True)#     CrossEntropyLoss()### 使用parameters()方法获取模型的Parameter参数
for param in model.parameters():print(type(param.data),param.size())# 输出 <class 'torch.Tensor'> torch.Size([3, 2])#     <class 'torch.Tensor'> torch.Size([3])#     <class 'torch.Tensor'> torch.Size([2, 3])#     <class 'torch.Tensor'> torch.Size([2])### 使用named_parameters()获取模型中的参数和参数名字
for name, param in model.named_parameters():print(type(param.data),param.size(),name)# 输出 <class 'torch.Tensor'> torch.Size([3, 2]) Linear1.weight#     <class 'torch.Tensor'> torch.Size([3]) Linear1.bias#     <class 'torch.Tensor'> torch.Size([2, 3]) Linear2.weight#     <class 'torch.Tensor'> torch.Size([2]) Linear2.bias### 保存模型
torch.save(model.state_dict(),'./model.path')
### 载入模型
model.load_state_dict(torch.load('./model.path'))
### 将模型载入到指定的硬件设备中===>该方法并不常用
### 常将其分解为  1、将模型载入内存。2、使用模型的to()方法,将模型复制到指定的设备中
model.load_state_dict(torch.load('./model.path',map_location={'cuda:1','cuda:0'}))

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

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

相关文章

BZOJ 2822: [AHOI2012]树屋阶梯 [Catalan数 高精度]

2822: [AHOI2012]树屋阶梯 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 779 Solved: 453[Submit][Status][Discuss]Description 暑假期间&#xff0c;小龙报名了一个模拟野外生存作战训练班来锻炼体魄&#xff0c;训练的第一个晚上&#xff0c;教官就给他们出了个难题。由…

【Pytorch神经网络理论篇】 06 神经元+神经网络模型+全连接网络模型

同学你好&#xff01;本文章于2021年末编写&#xff0c;获得广泛的好评&#xff01; 故在2022年末对本系列进行填充与更新&#xff0c;欢迎大家订阅最新的专栏&#xff0c;获取基于Pytorch1.10版本的理论代码(2023版)实现&#xff0c; Pytorch深度学习理论篇(2023版)目录地址…

面试题:N皇后问题,思路和python解题笔记

n皇后问题算法思路和python解法 问题描述 n皇后问题&#xff0c;在nn的棋盘上&#xff0c;解出n个皇后所有不能互相攻击的摆法&#xff0c; 皇后在数组中用“Q”表示&#xff0c;空地用“.”表示 返回的数据结构格式要求&#xff1a;[[“.Q…”,“…Q”,“Q…”,“…Q.”],[“…

【Pytorch神经网络理论篇】 07 激活函数+Sigmoid+tanh+ReLU+Swish+Mish+GELU

同学你好&#xff01;本文章于2021年末编写&#xff0c;获得广泛的好评&#xff01; 故在2022年末对本系列进行填充与更新&#xff0c;欢迎大家订阅最新的专栏&#xff0c;获取基于Pytorch1.10版本的理论代码(2023版)实现&#xff0c; Pytorch深度学习理论篇(2023版)目录地址…

【Pytorch神经网络理论篇】 08 Softmax函数(处理分类问题)

同学你好&#xff01;本文章于2021年末编写&#xff0c;获得广泛的好评&#xff01; 故在2022年末对本系列进行填充与更新&#xff0c;欢迎大家订阅最新的专栏&#xff0c;获取基于Pytorch1.10版本的理论代码(2023版)实现&#xff0c; Pytorch深度学习理论篇(2023版)目录地址…

Python套接字编程Socket Progaming——1

本篇文章是Network And Web Programing-Socket Programing分类中的第一篇文章&#xff0c;内容主要包含 Socket概念理解Socket programing介绍一个简单的TCP协议的server-client程序支持同时处理多个客户端简单server-client连接程序socket的常用选项使用 理解socket概念 一…

【Pytorch神经网络理论篇】 09 神经网络模块中的损失函数

同学你好&#xff01;本文章于2021年末编写&#xff0c;获得广泛的好评&#xff01; 故在2022年末对本系列进行填充与更新&#xff0c;欢迎大家订阅最新的专栏&#xff0c;获取基于Pytorch1.10版本的理论代码(2023版)实现&#xff0c; Pytorch深度学习理论篇(2023版)目录地址…

【Pytorch神经网络理论篇】 10 优化器模块+退化学习率

同学你好&#xff01;本文章于2021年末编写&#xff0c;获得广泛的好评&#xff01; 故在2022年末对本系列进行填充与更新&#xff0c;欢迎大家订阅最新的专栏&#xff0c;获取基于Pytorch1.10版本的理论代码(2023版)实现&#xff0c; Pytorch深度学习理论篇(2023版)目录地址…

HAProxy负载均衡原理及企业级实例部署haproxy集群

HAProxy是一种高效、可靠、免费的高可用及负载均衡解决方案&#xff0c;非常适合于高负载站点的七层数据请求。客户端通过HAProxy代理服务器获得站点页面&#xff0c;而代理服务器收到客户请求后根据负载均衡的规则将请求数据转发给后端真实服务器。 同一客户端访问服务器&…

【Pytorch神经网络实战案例】07 预测泰坦尼克号上生存的乘客

1 样本处理 1.1 载入样本代码---Titanic forecast.py&#xff08;第1部分&#xff09; import numpy as np import torch import torch.nn as nn import torch.nn.functional as F from scipy import stats import pandas as pd import matplotlib.pyplot as plt import os o…

基于sanic的服务使用celery完成动态修改定时任务

首先声明一下 考虑到celery目前和asyncio的不兼容性&#xff0c;协程任务需要转换为非异步的普通方法才能被当做task加入定时&#xff0c;并且celery和asyncio使用可能会带来预想不到的问题&#xff0c;在celery官方第二次承诺的6.0版本融合asyncio之前&#xff0c;需要慎重考虑…

Pyscript,使用Python编写前端脚本

介绍 Anaconda的CEO Peter Wang在前两个月的时候发布了Pyscript&#xff0c;实现了在HTML支持Python的使用&#xff0c;整个引用过程甚至不需要安装任何环境&#xff0c;只需要使用link和script标签即可引用实现Python在HTML中运行的功能&#xff0c;在HTML中也可以运行和使用…

如何把应用程序app编译进android系统

转载&#xff1a;http://ywxiao66.blog.163.com/blog/static/175482055201152710441106/------------------------------------------------------------------把常用的应用程序编译到img文件中&#xff0c;就成了系统的一部分&#xff0c;用户不必自己安装&#xff0c;当然也卸…

【Pytorch神经网络实战案例】08 识别黑白图中的服装图案(Fashion-MNIST)

1 Fashion-MNIST简介 FashionMNIST 是一个替代 MNIST 手写数字集 的图像数据集。 它是由 Zalando&#xff08;一家德国的时尚科技公司&#xff09;旗下的研究部门提供。其涵盖了来自 10 种类别的共 7 万个不同商品的正面图片。 FashionMNIST 的大小、格式和训练集/测试集划分与…

PHP list的赋值

List右边的赋值对象是一个以数值为索引的数组&#xff0c;左边的变量的位置和赋值对象的键值一一对应&#xff0c;有些位置的变量可以省略不写。非末尾的被赋值变量省略时&#xff0c;分隔的逗号不能省略。左边变量被赋值的顺序是从右到左的。 1 list($a, ,$b,$c[],$c[]) [1,2…

Pyscript,创建一个能执行crud操作的网页应用

目录 实现一个添加邀请客人名单的功能 循序渐进&#xff0c;逐步实现&#xff1a; 输入客人名称&#xff0c;按下enter键添加客人名单点击客人名单在名单上添加或者取消添加删除线&#xff0c;表示已经检查客人到场或未到场 checkbox&#xff0c;点击客人名单或者点击checkb…

爬虫实战学习笔记_1 爬虫基础+HTTP原理

1 爬虫简介 网络爬虫&#xff08;又被称作网络蜘蛛、网络机器人&#xff0c;在某些社区中也经常被称为网页追逐者)可以按照指定的规则&#xff08;网络爬虫的算法&#xff09;自动浏览或抓取网络中的信息。 1.1 Web网页存在方式 表层网页指的是不需要提交表单&#xff0c;使…

爬虫实战学习笔记_2 网络请求urllib模块+设置请求头+Cookie+模拟登陆

1 urllib模块 1.1 urllib模块简介 Python3中将urib与urllib2模块的功能组合&#xff0c;并且命名为urllib。Python3中的urllib模块中包含多个功能的子模块&#xff0c;具体内容如下。 urllib.request&#xff1a;用于实现基本HTTP请求的模块。urlb.error&#xff1a;异常处理…

java----IO和NIO的区别

概念&#xff1a;NIO即New IO&#xff0c;这个库是在JDK1.4中才引入的。NIO和IO有相同的作用和目的&#xff0c;但实现方式不同&#xff0c;NIO主要用到的是块&#xff0c;所以NIO的效率要比IO高很多。在Java API中提供了两套NIO&#xff0c;一套是针对标准输入输出NIO&#xf…

【Pytorch神经网络理论篇】 11 卷积网络模型+Sobel算子原理

同学你好&#xff01;本文章于2021年末编写&#xff0c;已与实际存在较大的偏差&#xff01; 故在2022年末对本系列进行填充与更新&#xff0c;欢迎大家订阅最新的专栏&#xff0c;获取基于Pytorch1.10版本的理论代码(2023版)实现&#xff0c; Pytorch深度学习理论篇(2023版)…