【深度学习】(1) CNN中的注意力机制(SE、ECA、CBAM),附Pytorch完整代码

article/2025/9/16 9:31:05

大家好,今天和各位分享一下如何使用 Pytorch 构建卷积神经网络中的各种注意力机制,如:SENet,ECANet,CBAM

注意力机制的原理TensorFlow2 的实现方式可以看我下面两篇博文:

SENet、ECANet:https://blog.csdn.net/dgvv4/article/details/123572065

DANet、CBAM:https://blog.csdn.net/dgvv4/article/details/123888724


1. SENet

1.1 方法介绍

SE注意力机制(Squeeze-and-Excitation Networks)在通道维度增加注意力机制,关键操作是squeeze和excitation。

通过自动学习的方式,使用另外一个新的神经网络获取到特征图的每个通道的重要程度,然后用这个重要程度去给每个特征赋予一个权重值,从而让神经网络重点关注某些特征通道提升对当前任务有用的特征图的通道,并抑制对当前任务用处不大的特征通道。

如下图所示,在输入SE注意力机制之前(左侧图C),特征图的每个通道的重要程度都是一样的,通过SENet之后(右侧彩图C),不同颜色代表不同的权重,使每个特征通道的重要性变得不一样了,使神经网络重点关注某些权重值大的通道。

SE注意力机制的实现步骤如下:

(1)Squeeze:通过全局平均池化,将每个通道的二维特征(H*W)压缩为1个实数,将特征图从 [h, w, c] ==> [1,1,c]

(2)excitation:给每个特征通道生成一个权重值,论文中通过两个全连接层构建通道间的相关性,输出的权重值数目和输入特征图的通道数相同。[1,1,c] ==> [1,1,c]

(3)Scale将前面得到的归一化权重加权到每个通道的特征上。论文中使用的是乘法,逐通道乘以权重系数。[h,w,c]*[1,1,c] ==> [h,w,c]


小节:

(1)SENet的核心思想是通过全连接网络根据loss损失来自动学习特征权重,而不是直接根据特征通道的数值分配来判断,使有效的特征通道的权重大。当然SE注意力机制不可避免的增加了一些参数和计算量,但性价比还是挺高的。

(2)论文认为excitation操作中使用两个全连接层相比直接使用一个全连接层,它的好处在于,具有更多的非线性,可以更好地拟合通道间的复杂关联。


1.2 代码实现

SE注意力机制代码如下:

# -------------------------------------------- #
#(1)SE 通道注意力机制
# -------------------------------------------- #
import torch
from torch import nn
from torchstat import stat  # 查看网络参数# 定义SE注意力机制的类
class se_block(nn.Module):# 初始化, in_channel代表输入特征图的通道数, ratio代表第一个全连接下降通道的倍数def __init__(self, in_channel, ratio=4):# 继承父类初始化方法super(se_block, self).__init__()# 属性分配# 全局平均池化,输出的特征图的宽高=1self.avg_pool = nn.AdaptiveAvgPool2d(output_size=1)# 第一个全连接层将特征图的通道数下降4倍self.fc1 = nn.Linear(in_features=in_channel, out_features=in_channel//ratio, bias=False)# relu激活self.relu = nn.ReLU()# 第二个全连接层恢复通道数self.fc2 = nn.Linear(in_features=in_channel//ratio, out_features=in_channel, bias=False)# sigmoid激活函数,将权值归一化到0-1self.sigmoid = nn.Sigmoid()# 前向传播def forward(self, inputs):  # inputs 代表输入特征图# 获取输入特征图的shapeb, c, h, w = inputs.shape# 全局平均池化 [b,c,h,w]==>[b,c,1,1]x = self.avg_pool(inputs)# 维度调整 [b,c,1,1]==>[b,c]x = x.view([b,c])# 第一个全连接下降通道 [b,c]==>[b,c//4]x = self.fc1(x)x = self.relu(x)# 第二个全连接上升通道 [b,c//4]==>[b,c]x = self.fc2(x)# 对通道权重归一化处理x = self.sigmoid(x)# 调整维度 [b,c]==>[b,c,1,1]x = x.view([b,c,1,1])# 将输入特征图和通道权重相乘outputs = x * inputsreturn outputs

构造输入层,查看一次前向传播的输出结果,打印网络结构

# 构造输入层shape==[4,32,16,16]
inputs = torch.rand(4,32,16,16)
# 获取输入通道数
in_channel = inputs.shape[1]
# 模型实例化
model = se_block(in_channel=in_channel)# 前向传播查看输出结果
outputs = model(inputs)
print(outputs.shape)  # [4,32,16,16])print(model) # 查看模型结构
stat(model, input_size=[32,16,16])  # 查看参数,不需要指定batch维度

网络的参数量如下:

      module name  input shape output shape  params memory(MB)   MAdd  Flops  MemRead(B)  MemWrite(B) duration[%]  MemR+W(B)
0        avg_pool   32  16  16   32   1   1     0.0       0.00    0.0    0.0         0.0          0.0      99.99%        0.0
1             fc1           32            8   256.0       0.00  504.0  256.0      1152.0         32.0       0.00%     1184.0
2            relu            8            8     0.0       0.00    8.0    8.0        32.0         32.0       0.00%       64.0
3             fc2            8           32   256.0       0.00  480.0  256.0      1056.0        128.0       0.00%     1184.0
4         sigmoid           32           32     0.0       0.00    0.0    0.0         0.0          0.0       0.00%        0.0
total                                         512.0       0.00  992.0  520.0         0.0          0.0      99.99%     2432.0
============================================================================================================================
Total params: 512
----------------------------------------------------------------------------------------------------------------------------
Total memory: 0.00MB
Total MAdd: 992MAdd
Total Flops: 520Flops
Total MemR+W: 2.38KB

2. ECANet

2.1 方法介绍

ECANet 是通道注意力机制的一种实现形式,ECANet 可以看做是 SENet 的改进版。

作者表明 SENet 中的降维会给通道注意力机制带来副作用,并且捕获所有通道之间的依存关系是效率不高的,而且是不必要的

ECA 注意力机制模块直接在全局平均池化层之后使用1x1卷积层,去除了全连接层。该模块避免了维度缩减,并有效捕获了跨通道交互。并且 ECANet 只涉及少数参数就能达到很好的效果。

ECANet 通过 一维卷积 layers.Conv1D 来完成跨通道间的信息交互,卷积核的大小通过一个函数来自适应变化,使得通道数较大的层可以更多地进行跨通道交互。

自适应函数为: k=\left | \frac{log_{2}(c)}{\gamma } +\frac{b}{\gamma } \right |,其中 \gamma =2,\,\,b=1


ECA注意力机制的实现过程如下:

(1)将输入特征图经过全局平均池化,特征图从 [h,w,c] 的矩阵变成 [1,1,c] 的向量

(2)根据特征图的通道数计算得到自适应的一维卷积核大小 kernel_size

(3)将 kernel_size 用于一维卷积中,得到对于特征图的每个通道的权重

(4)将归一化权重和原输入特征图逐通道相乘,生成加权后的特征图


2.2 代码展示

ECA注意力机制的代码如下:

# --------------------------------------------------------- #
#(2)ECANet 通道注意力机制
# 使用1D卷积代替SE注意力机制中的全连接层
# --------------------------------------------------------- #import torch
from torch import nn
import math
from torchstat import stat  # 查看网络参数# 定义ECANet的类
class eca_block(nn.Module):# 初始化, in_channel代表特征图的输入通道数, b和gama代表公式中的两个系数def __init__(self, in_channel, b=1, gama=2):# 继承父类初始化super(eca_block, self).__init__()# 根据输入通道数自适应调整卷积核大小kernel_size = int(abs((math.log(in_channel, 2)+b)/gama))# 如果卷积核大小是奇数,就使用它if kernel_size % 2:kernel_size = kernel_size# 如果卷积核大小是偶数,就把它变成奇数else:kernel_size = kernel_size# 卷积时,为例保证卷积前后的size不变,需要0填充的数量padding = kernel_size // 2# 全局平均池化,输出的特征图的宽高=1self.avg_pool = nn.AdaptiveAvgPool2d(output_size=1)# 1D卷积,输入和输出通道数都=1,卷积核大小是自适应的self.conv = nn.Conv1d(in_channels=1, out_channels=1, kernel_size=kernel_size,bias=False, padding=padding)# sigmoid激活函数,权值归一化self.sigmoid = nn.Sigmoid()# 前向传播def forward(self, inputs):# 获得输入图像的shapeb, c, h, w = inputs.shape# 全局平均池化 [b,c,h,w]==>[b,c,1,1]x = self.avg_pool(inputs)# 维度调整,变成序列形式 [b,c,1,1]==>[b,1,c]x = x.view([b,1,c])# 1D卷积 [b,1,c]==>[b,1,c]x = self.conv(x)# 权值归一化x = self.sigmoid(x)# 维度调整 [b,1,c]==>[b,c,1,1]x = x.view([b,c,1,1])# 将输入特征图和通道权重相乘[b,c,h,w]*[b,c,1,1]==>[b,c,h,w]outputs = x * inputsreturn outputs

构造输入层,查看一次前向传播的输出结果,打印网络结构

# 构造输入层 [b,c,h,w]==[4,32,16,16]
inputs = torch.rand([4,32,16,16])
# 获取输入图像的通道数
in_channel = inputs.shape[1]
# 模型实例化
model = eca_block(in_channel=in_channel)
# 前向传播
outputs = model(inputs)print(outputs.shape)  # 查看输出结果
print(model)    # 查看网络结构
stat(model, input_size=[32,16,16])  # 查看网络参数

网络的参数量如下:

      module name  input shape output shape  params memory(MB) MAdd Flops  MemRead(B)  MemWrite(B) duration[%]  MemR+W(B)
0        avg_pool   32  16  16   32   1   1     0.0       0.00  0.0   0.0         0.0          0.0       0.00%        0.0
1            conv        1  32        1  32     3.0       0.00  0.0   0.0         0.0          0.0       0.00%        0.0
2         sigmoid        1  32        1  32     0.0       0.00  0.0   0.0         0.0          0.0       0.00%        0.0
total                                           3.0       0.00  0.0   0.0         0.0          0.0       0.00%        0.0
=========================================================================================================================
Total params: 3
-------------------------------------------------------------------------------------------------------------------------
Total memory: 0.00MB
Total MAdd: 0MAdd
Total Flops: 0Flops
Total MemR+W: 0B

3. CBAM 注意力机制

3.1 方法介绍

CBAM注意力机制是由通道注意力机制(channel)和空间注意力机制(spatial)组成。

传统基于卷积神经网络的注意力机制更多的是关注对通道域的分析,局限于考虑特征图通道之间的作用关系。CBAM从 channel 和 spatial 两个作用域出发,引入空间注意力和通道注意力两个分析维度,实现从通道到空间的顺序注意力结构空间注意力可使神经网络更加关注图像中对分类起决定作用的像素区域而忽略无关紧要的区域通道注意力则用于处理特征图通道的分配关系,同时对两个维度进行注意力分配增强了注意力机制对模型性能的提升效果。


3.2 通道注意力机制模块

CBAM中的通道注意力机制模块流程图如下。先将输入特征图分别进行全局最大池化和全局平均池化,对特征映射基于两个维度压缩,获得两张不同维度的特征描述。池化后的特征图共用一个多层感知器网络先通过一个全连接层下降通道数,再通过另一个全连接恢复通道数。将两张特征图在通道维度堆叠,经过 sigmoid 激活函数将特征图的每个通道的权重归一化到0-1之间。将归一化后的权重和输入特征图相乘。

代码展示:

#(1)通道注意力机制
class channel_attention(nn.Module):# 初始化, in_channel代表输入特征图的通道数, ratio代表第一个全连接的通道下降倍数def __init__(self, in_channel, ratio=4):# 继承父类初始化方法super(channel_attention, self).__init__()# 全局最大池化 [b,c,h,w]==>[b,c,1,1]self.max_pool = nn.AdaptiveMaxPool2d(output_size=1)# 全局平均池化 [b,c,h,w]==>[b,c,1,1]self.avg_pool = nn.AdaptiveAvgPool2d(output_size=1)# 第一个全连接层, 通道数下降4倍self.fc1 = nn.Linear(in_features=in_channel, out_features=in_channel//ratio, bias=False)# 第二个全连接层, 恢复通道数self.fc2 = nn.Linear(in_features=in_channel//ratio, out_features=in_channel, bias=False)# relu激活函数self.relu = nn.ReLU()# sigmoid激活函数self.sigmoid = nn.Sigmoid()# 前向传播def forward(self, inputs):# 获取输入特征图的shapeb, c, h, w = inputs.shape# 输入图像做全局最大池化 [b,c,h,w]==>[b,c,1,1]max_pool = self.max_pool(inputs)# 输入图像的全局平均池化 [b,c,h,w]==>[b,c,1,1]avg_pool = self.avg_pool(inputs)# 调整池化结果的维度 [b,c,1,1]==>[b,c]max_pool = max_pool.view([b,c])avg_pool = avg_pool.view([b,c])# 第一个全连接层下降通道数 [b,c]==>[b,c//4]x_maxpool = self.fc1(max_pool)x_avgpool = self.fc1(avg_pool)# 激活函数x_maxpool = self.relu(x_maxpool)x_avgpool = self.relu(x_avgpool)# 第二个全连接层恢复通道数 [b,c//4]==>[b,c]x_maxpool = self.fc2(x_maxpool)x_avgpool = self.fc2(x_avgpool)# 将这两种池化结果相加 [b,c]==>[b,c]x = x_maxpool + x_avgpool# sigmoid函数权值归一化x = self.sigmoid(x)# 调整维度 [b,c]==>[b,c,1,1]x = x.view([b,c,1,1])# 输入特征图和通道权重相乘 [b,c,h,w]outputs = inputs * xreturn outputs

3.3 空间注意力机制模块

CBAM中的空间注意力机制模块如下。对通道注意力机制的输出特征图进行空间域的处理。首先,对输入特征图在通道维度下做最大池化和平均池化将池化后的两张特征图在通道维度堆叠。然后,使用 7*7 (或3*3、1*1)大小的卷积核融合通道信息,特征图的shape从 [b,2,h,w] 变成 [b,1,h,w]。最后,将卷积后的结果经过 sigmoid 函数对特征图的空间权重归一化,再将输入特征图和权重相乘。

代码展示:

#(2)空间注意力机制
class spatial_attention(nn.Module):# 初始化,卷积核大小为7*7def __init__(self, kernel_size=7):# 继承父类初始化方法super(spatial_attention, self).__init__()# 为了保持卷积前后的特征图shape相同,卷积时需要paddingpadding = kernel_size // 2# 7*7卷积融合通道信息 [b,2,h,w]==>[b,1,h,w]self.conv = nn.Conv2d(in_channels=2, out_channels=1, kernel_size=kernel_size,padding=padding, bias=False)# sigmoid函数self.sigmoid = nn.Sigmoid()# 前向传播def forward(self, inputs):# 在通道维度上最大池化 [b,1,h,w]  keepdim保留原有深度# 返回值是在某维度的最大值和对应的索引x_maxpool, _ = torch.max(inputs, dim=1, keepdim=True)# 在通道维度上平均池化 [b,1,h,w]x_avgpool = torch.mean(inputs, dim=1, keepdim=True)# 池化后的结果在通道维度上堆叠 [b,2,h,w]x = torch.cat([x_maxpool, x_avgpool], dim=1)# 卷积融合通道信息 [b,2,h,w]==>[b,1,h,w]x = self.conv(x)# 空间权重归一化x = self.sigmoid(x)# 输入特征图和空间权重相乘outputs = inputs * xreturn outputs

3.4 CBAM注意力机制

CBAM的总体流程图如下。输入特征图先经过通道注意力机制将通道权重和输入特征图相乘再送入空间注意力机制将归一化后的空间权重和空间注意力机制的输入特征图相乘,得到最终加权后的特征图。

完整代码展示:

# ---------------------------------------------------- #
# CBAM注意力机制
# 结合了通道注意力机制和空间注意力机制
# ---------------------------------------------------- #import torch
from torch import nn
from torchstat import stat  # 查看网络参数#(1)通道注意力机制
class channel_attention(nn.Module):# 初始化, in_channel代表输入特征图的通道数, ratio代表第一个全连接的通道下降倍数def __init__(self, in_channel, ratio=4):# 继承父类初始化方法super(channel_attention, self).__init__()# 全局最大池化 [b,c,h,w]==>[b,c,1,1]self.max_pool = nn.AdaptiveMaxPool2d(output_size=1)# 全局平均池化 [b,c,h,w]==>[b,c,1,1]self.avg_pool = nn.AdaptiveAvgPool2d(output_size=1)# 第一个全连接层, 通道数下降4倍self.fc1 = nn.Linear(in_features=in_channel, out_features=in_channel//ratio, bias=False)# 第二个全连接层, 恢复通道数self.fc2 = nn.Linear(in_features=in_channel//ratio, out_features=in_channel, bias=False)# relu激活函数self.relu = nn.ReLU()# sigmoid激活函数self.sigmoid = nn.Sigmoid()# 前向传播def forward(self, inputs):# 获取输入特征图的shapeb, c, h, w = inputs.shape# 输入图像做全局最大池化 [b,c,h,w]==>[b,c,1,1]max_pool = self.max_pool(inputs)# 输入图像的全局平均池化 [b,c,h,w]==>[b,c,1,1]avg_pool = self.avg_pool(inputs)# 调整池化结果的维度 [b,c,1,1]==>[b,c]max_pool = max_pool.view([b,c])avg_pool = avg_pool.view([b,c])# 第一个全连接层下降通道数 [b,c]==>[b,c//4]x_maxpool = self.fc1(max_pool)x_avgpool = self.fc1(avg_pool)# 激活函数x_maxpool = self.relu(x_maxpool)x_avgpool = self.relu(x_avgpool)# 第二个全连接层恢复通道数 [b,c//4]==>[b,c]x_maxpool = self.fc2(x_maxpool)x_avgpool = self.fc2(x_avgpool)# 将这两种池化结果相加 [b,c]==>[b,c]x = x_maxpool + x_avgpool# sigmoid函数权值归一化x = self.sigmoid(x)# 调整维度 [b,c]==>[b,c,1,1]x = x.view([b,c,1,1])# 输入特征图和通道权重相乘 [b,c,h,w]outputs = inputs * xreturn outputs# ---------------------------------------------------- #
#(2)空间注意力机制
class spatial_attention(nn.Module):# 初始化,卷积核大小为7*7def __init__(self, kernel_size=7):# 继承父类初始化方法super(spatial_attention, self).__init__()# 为了保持卷积前后的特征图shape相同,卷积时需要paddingpadding = kernel_size // 2# 7*7卷积融合通道信息 [b,2,h,w]==>[b,1,h,w]self.conv = nn.Conv2d(in_channels=2, out_channels=1, kernel_size=kernel_size,padding=padding, bias=False)# sigmoid函数self.sigmoid = nn.Sigmoid()# 前向传播def forward(self, inputs):# 在通道维度上最大池化 [b,1,h,w]  keepdim保留原有深度# 返回值是在某维度的最大值和对应的索引x_maxpool, _ = torch.max(inputs, dim=1, keepdim=True)# 在通道维度上平均池化 [b,1,h,w]x_avgpool = torch.mean(inputs, dim=1, keepdim=True)# 池化后的结果在通道维度上堆叠 [b,2,h,w]x = torch.cat([x_maxpool, x_avgpool], dim=1)# 卷积融合通道信息 [b,2,h,w]==>[b,1,h,w]x = self.conv(x)# 空间权重归一化x = self.sigmoid(x)# 输入特征图和空间权重相乘outputs = inputs * xreturn outputs# ---------------------------------------------------- #
#(3)CBAM注意力机制
class cbam(nn.Module):# 初始化,in_channel和ratio=4代表通道注意力机制的输入通道数和第一个全连接下降的通道数# kernel_size代表空间注意力机制的卷积核大小def __init__(self, in_channel, ratio=4, kernel_size=7):# 继承父类初始化方法super(cbam, self).__init__()# 实例化通道注意力机制self.channel_attention = channel_attention(in_channel=in_channel, ratio=ratio)# 实例化空间注意力机制self.spatial_attention = spatial_attention(kernel_size=kernel_size)# 前向传播def forward(self, inputs):# 先将输入图像经过通道注意力机制x = self.channel_attention(inputs)# 然后经过空间注意力机制x = self.spatial_attention(x)return x

3.5 查看网络结构

构造输入层,查看一次前向传播的输出结果,打印网络结构

# 构造输入层 [b,c,h,w]==[4,32,16,16]
inputs = torch.rand([4,32,16,16])
# 获取输入图像的通道数
in_channel = inputs.shape[1]
# 模型实例化
model = cbam(in_channel=in_channel)
# 前向传播
outputs = model(inputs)print(outputs.shape)  # 查看输出结果
print(model)    # 查看网络结构
stat(model, input_size=[32,16,16])  # 查看网络参数

查看模型参数量

                      module name  input shape output shape  params memory(MB)      MAdd     Flops  MemRead(B)  MemWrite(B) duration[%]  MemR+W(B)
0      channel_attention.max_pool   32  16  16   32   1   1     0.0       0.00       0.0       0.0         0.0          0.0       0.00%        0.0
1      channel_attention.avg_pool   32  16  16   32   1   1     0.0       0.00       0.0       0.0         0.0          0.0      99.99%        0.0
2           channel_attention.fc1           32            8   256.0       0.00     504.0     256.0      1152.0         32.0       0.00%     1184.0
3           channel_attention.fc2            8           32   256.0       0.00     480.0     256.0      1056.0        128.0       0.00%     1184.0
4          channel_attention.relu            8            8     0.0       0.00       8.0       8.0        32.0         32.0       0.00%       64.0
5       channel_attention.sigmoid           32           32     0.0       0.00       0.0       0.0         0.0          0.0       0.00%        0.0
6          spatial_attention.conv    2  16  16    1  16  16    98.0       0.00  49,920.0  25,088.0      2440.0       1024.0       0.00%     3464.0
7       spatial_attention.sigmoid    1  16  16    1  16  16     0.0       0.00       0.0       0.0         0.0          0.0       0.00%        0.0
total                                                         610.0       0.00  50,912.0  25,608.0         0.0          0.0      99.99%     5896.0
==================================================================================================================================================
Total params: 610
--------------------------------------------------------------------------------------------------------------------------------------------------
Total memory: 0.00MB
Total MAdd: 50.91KMAdd
Total Flops: 25.61KFlops
Total MemR+W: 5.76KB

http://chatgpt.dhexx.cn/article/2rY3fgiE.shtml

相关文章

注意力机制详述

学习本部分默认大家对RNN神经网络已经深入理解了,这是基础,同时理解什么是时间序列,尤其RNN的常用展开形式进行画图,这个必须理解了。 这篇文章整理有关注意力机制(Attention Mechanism )的知识&#xff0c…

手把手带你YOLOv5/v7 添加注意力机制(并附上30多种顶会Attention原理图)2023/6/15更新

🌟想了解YOLO系列算法更多教程欢迎订阅我的专栏🌟 对于基础薄弱的同学来说,推荐阅读《目标检测蓝皮书》📘,里面涵盖了丰富的目标检测实用知识,是你迅速掌握目标检测的理想选择! 如果想了解 YO…

量化交易python入门书籍_张杨飞《Python量化交易入门》PDF下载

张杨飞《Python量化交易入门》PDF下载 首页 > 计算机类 字号:小 中 大 评论:0 条 评论:0 条 Python量化交易入门 【作 者】张杨飞 【形态项】 402 【出版项】 北京:电子工业出版社 , 2019.04 【ISBN号】978-7-121-36140-1 【中图法分类号】F830.91 【原书…

Python猫荐书系列之七:Python入门书籍有哪些?

本文原创并首发于公众号【Python猫】,未经授权,请勿转载。 原文地址:https://mp.weixin.qq.com/s/ArN-6mLPzPT8Zoq0Na_tsg 最近,猫哥的 Python 技术学习群里进来了几位比较特殊的同学:一位初三的以编程为兴趣的女生、…

2019年Python入门书籍推荐

大概是一时改变不了之前的学习习惯,所以很多Python小白都来问我有什么适合的Python入门书籍推荐。接下来我就为大家推荐几本经典的:(请大家根据自己以下六种情况对号入座,挑选适合自己的 Python 入门书籍)一&#xff0…

Python入门书籍,百万读者都选择!

从0到100万 Python入门神书 如果你是程序员,或者是 Python 爱好者,那你一定听说过一本书:《Python编程 从入门到实践》。作为国内首批 Python 图书之一,蟒蛇书首版自2016年问世以来就狂销70余万册;2020年10月第2版出版…

斯坦福大学教授,极力推荐5本python入门书籍,入门最快基础最好

为什么要选择python Python是一门更注重可读性和效率的语言,尤其是相较于 Java,PHP 以及 C++ 这样的语言,它的这两个优势让其在开发者中大受欢迎。 如果你正处于想学习python或者正在python入门阶段,推荐5套python电子学习书籍,对于没有接触过编程,或者基础薄弱者来说…

0基础学Python入门书籍应该看什么?

0基础学Python入门书籍应该看什么?Python 对不少人来说是谜一样的东西不知道如何下手、从何处下手,找了很多资源几个月过去了学习陷入换乱,没没能入门Python开发。出现这种情况大多是因为没有充分做好学习前的准备。 0基础学习Python建议读一…

Python入门书籍推荐——《笨办法学Python》

很多小伙伴在学习Python的道路上,觉得越来越难。今天为小伙伴推荐一本非常适合Python小白的书籍《笨办法学Python》第三版。 在豆瓣有7.8的评分,学习Python的小伙伴千万不要错过了呀。 《笨办法学Python》是一本关于Python的入门书籍,即使是…

python入门书籍(爬虫方面)有哪些推荐?

关于爬虫,应该没有人不知道了吧,其抓取速度快和数据质量优的两大特点而受到越来越多的人追捧,互联网时代,有爬虫技术的加持对于职场人来说无疑是锦上添花。 随着爬虫技术的流行,网上的资源层出不穷,但对于…

python新手入门.pdf_所有Python入门书籍的整理,初学者必看,附赠所有电子版(一)...

原标题:所有Python入门书籍的整理,初学者必看,附赠所有电子版(一) 这从来都是我的观点,学习Python编程,看书是最好的方式之一。 所以,今天一姐想对自己日积月累收集的部分入门书籍做一个汇总,当然,大家也可以看看哪本书比较适合现在的自己,然后文章尾部有免费找我…

必读的Python入门书籍,你都看过吗?(内有福利)

今天小编为大家准备了4本Python入门书籍,让大家在python的学习路上少走弯路。 1.Python基础教程 《Python基础教程》是经典的Python入门教程书籍,本书层次鲜明,结构严谨,特别是在最后几章中,作者将前面讲述的内容应用到项目中,并以模板的形式介绍了项目的开发过程,手把…

4本Python必读的入门书籍

Python入门书籍不用看太多,看一本就够。重要的是你要学习Python的哪个方向,或者说你对什么方向感兴趣,因为Python这门语言的应用领域比较广泛,比如说可以用来做数据分析、机器学习,也可以用来做后端开发、还可以做Web开…

推荐大家6本Python入门书籍

前言 我在逛各大媒体的时候,发现大家都有一个问题,就是不知道入门看什么书籍好,总是在问答上要大家推荐书籍,这些人推荐的质量都是参差不齐, 本节为大家推荐6本高效率的书籍(总有一本适合你)&a…

python零基础入门书籍-零基础python入门书籍推荐读哪些书?

零基础python入门书籍推荐读哪些书?很多Python 初学者都希望有经验的资深人士能推荐一些入门书籍,于是你就会搜到有网友推荐的超长的入门书单,然而这简直跟没推荐一样。这些书籍并不适合初学者,对于零基础学员看到各种代码就已经头…

最好的Python入门书籍:《Python编程:从入门到实践》

Python的入门很简单,网上有很多资料,但他们大部分都集中在Python语言的用法上,加上学习一些脚本写法,对语法思维和设计理念都是泛泛而谈,所以尽管有所实践,但是无法由浅入深去阐述一个概念,总是…

python入门书籍(爬虫方面)

python入门书籍(爬虫方面) 可以选以下几本书(个人看法): 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或…

孩子学Python入门书籍推荐

随着山东将Python编程语言加入小学信息技术教材,Python的学习也有低龄化的趋势。那么孩子学python要看什么入门书籍呢?小编的建议是,最好挑选能引起孩子兴趣,深入浅出讲解Python的书。 1、为什么Python的学习要从孩子抓起&#xf…

Python入门书籍推荐

许多刚入门Python选手,由于缺乏指导,导致往往培养不出爱好最后放弃 作为一个自学新手,我想将我要推荐的书籍介绍出来,来帮助类似像我一样的其他新手。 希望有用(仅仅是推荐书,不夹带任何私货,如有侵犯您的…

python学习:最适合初学者的8本Python书籍

Python是最友好的编程语言之一,也因此成为初学者的首选,为了帮助你更好更快的上手Python,并学会使用Python进行编程,本文我们为初学者分享了最好的Python书籍。希望能够对你有所帮助: 1、《Python编程:从入…