先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Python全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Python知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024c (备注Python)
正文
-
避免表征瓶颈,尤其是在网络的前面。前馈网络可以由从输入层到分类器或回归器的非循环图表示。这为信息流定义了一个明确的方向。对于分离输入输出的任何切口,可以访问通过切口的信息量。应该避免极端压缩的瓶颈。一般来说,在达到用于着手任务的最终表示之前,表示大小应该从输入到输出缓慢减小。理论上,信息内容不能仅通过表示的维度来评估,因为它丢弃了诸如相关结构的重要因素;维度仅提供信息内容的粗略估计。
-
更高维度的表示在网络中更容易局部处理。在卷积网络中增加每个图块的激活允许更多解耦的特征。所产生的网络将训练更快。
-
空间聚合可以在较低维度嵌入上完成,而不会在表示能力上造成许多或任何损失。例如,在执行更多展开(例如3×3)卷积之前,可以在空间聚合之前减小输入表示的维度,没有预期的严重不利影响。我们假设,如果在空间聚合上下文中使用输出,则相邻单元之间的强相关性会导致维度缩减期间的信息损失少得多。鉴于这些信号应该易于压缩,因此尺寸减小甚至会促进更快的学习。
-
平衡网络的宽度和深度。通过平衡每个阶段的滤波器数量和网络的深度可以达到网络的最佳性能。增加网络的宽度和深度可以有助于更高质量的网络。然而,如果两者并行增加,则可以达到恒定计算量的最佳改进。因此,计算预算应该在网络的深度和宽度之间以平衡方式进行分配。
虽然这些原则可能是有意义的,但并不是开箱即用的直接使用它们来提高网络质量。我们的想法是仅在不明确的情况下才明智地使用它们。
GoogLeNet网络的大部分初始收益来源于大量地使用降维。这可以被视为以计算有效的方式分解卷积的特例。考虑例如1×1卷积层之后接一个3×3卷积层的情况。在视觉网络中,预期相近激活的输出是高度相关的。因此,我们可以预期,它们的激活可以在聚合之前被减少,并且这应该会导致类似的富有表现力的局部表示。
在这里,我们将在各种设定中探索卷积分解的其它方法,特别是为了提高解决方案的计算效率。由于Inception网络是全卷积的,每个权重对应每个激活的一次乘法。因此,任何计算成本的降低会导致参数数量减少。这意味着,通过适当的分解,我们可以得到更多的解耦参数,从而加快训练。此外,我们可以使用计算和内存节省来增加我们网络的滤波器组的大小,同时保持我们在单个计算机上训练每个模型副本的能力。
3.1 分解到更小的卷积
具有较大空间滤波器(例如5×5或7×7)的卷积在计算方面往往不成比例地昂贵。例如,具有n个滤波器的5×5卷积在具有m个滤波器的网格上比具有相同数量的滤波器的3×3卷积的计算量高 25 / 9 = 2.78 25/9=2.78 25/9=2.78倍。当然,5×5滤波器在更前面的层可以捕获更远的单元激活之间、信号之间的依赖关系,因此滤波器几何尺寸的减小带来了很大的表现力。然而,我们可以询问5×5卷积是否可以被具有相同输入尺寸和输出深度的参数较小的多层网络所取代。如果我们放大5×5卷积的计算图,我们看到每个输出看起来像一个小的完全连接的网络,在其输入上滑过5×5的块(见图1)。由于我们正在构建视觉网络,所以通过两层的卷积结构再次利用平移不变性来代替全连接的组件似乎是很自然的:第一层是3×3卷积,第二层是在第一层的3×3输出网格之上的一个全连接层(见图1)。通过在输入激活网格上滑动这个小网络,用两层3×3卷积来替换5×5卷积(比较图4和5)。
该设定通过相邻块之间共享权重明显减少了参数数量。为了分析预期的计算成本节省,我们将对典型的情况进行一些简单的假设:我们可以假设 n = α m n=\alpha m n=αm,也就是我们想通过常数 α \alpha α因子来改变激活/单元的数量。由于5×5卷积是聚合的, α \alpha α通常比1略大(在GoogLeNet中大约是1.5)。用两个层替换5×5层,似乎可以通过两个步骤来实现扩展:在两个步骤中通过 α \sqrt \alpha α 增加滤波器数量。为了简化我们的估计,通过选择 α = 1 \alpha=1 α=1(无扩展),如果我们单纯地滑动网络而不重新使用相邻网格图块之间的计算,我们将增加计算成本。滑动该网络可以由两个3×3的卷积层表示,其重用相邻图块之间的激活。这样,我们最终得到一个计算量减少到 9 + 9 25 × \frac {9+9} {25} × 259+9×的网络,通过这种分解导致了28%的相对增益。每个参数在每个单元的激活计算中只使用一次,所以参数计数具有完全相同的节约。不过,这个设置提出了两个一般性的问题:这种替换是否会导致任何表征力的丧失?如果我们的主要目标是对计算的线性部分进行分解,是不是建议在第一层保持线性激活?我们已经进行了几个控制实验(例如参见图2),并且在分解的所有阶段中使用线性激活总是逊于使用修正线性单元。我们将这个收益归因于网络可以学习的增强的空间变化,特别是如果我们对输出激活进行批标准化[7]。当对维度减小组件使用线性激活时,可以看到类似的效果。
3.2 空间分解为不对称卷积
上述结果表明,大于3×3的卷积滤波器可能不是通常有用的,因为它们总是可以简化为3×3卷积层序列。我们仍然可以问这个问题,是否应该把它们分解成更小的,例如2×2的卷积。然而,通过使用非对称卷积,可以做出甚至比2×2更好的效果,即n×1。例如使用3×1卷积后接一个1×3卷积,相当于以与3×3卷积相同的感受野滑动两层网络(参见图3)。如果输入和输出滤波器的数量相等,那么对于相同数量的输出滤波器,两层解决方案便宜33%。相比之下,将3×3卷积分解为两个2×2卷积表示仅节省了11%的计算量。
在理论上,我们可以进一步论证,可以通过1×n卷积和后面接一个n×1卷积替换任何n×n卷积,并且随着n增长,计算成本节省显著增加(见图6)。实际上,我们发现,采用这种分解在前面的层次上不能很好地工作,但是对于中等网格尺寸(在m×m特征图上,其中m范围在12到20之间),其给出了非常好的结果。在这个水平上,通过使用1×7卷积,然后是7×1卷积可以获得非常好的结果。
引入了辅助分类器的概念,以改善非常深的网络的收敛。最初的动机是将有用的梯度推向较低层,使其立即有用,并通过抵抗非常深的网络中的消失梯度问题来提高训练过程中的收敛。Lee等人也认为辅助分类器促进了更稳定的学习和更好的收敛。有趣的是,我们发现辅助分类器在训练早期并没有导致改善收敛:在两个模型达到高精度之前,有无侧边网络的训练进度看起来几乎相同。接近训练结束,辅助分支网络开始超越没有任何分支的网络的准确性,达到了更高的稳定水平。
另外,在网络的不同阶段使用了两个侧分支。移除更下面的辅助分支对网络的最终质量没有任何不利影响。再加上前一段的观察结果,这意味着最初的假设,这些分支有助于演变低级特征很可能是不适当的。相反,我们认为辅助分类器起着正则化项的作用。这是由于如果侧分支是批标准化的[7]或具有丢弃层,则网络的主分类器性能更好。这也为推测批标准化作为正则化项给出了一个弱支持证据。
传统上,卷积网络使用一些池化操作来缩减特征图的网格大小。为了避免表示瓶颈,在应用最大池化或平均池化之前,需要扩展网络滤波器的激活维度。例如,开始有一个带有 k k k个滤波器的 d × d d \times d d×d网格,如果我们想要达到一个带有 2 k 2k 2k个滤波器的 d 2 × d 2 \frac{d}{2}\times \frac{d}{2} 2d×2d网格,我们首先需要用 2 k 2k 2k个滤波器计算步长为1的卷积,然后应用一个额外的池化步骤。这意味着总体计算成本由在较大的网格上使用 2 d 2 k 2 2d2k2 2d2k2次运算的昂贵卷积支配。一种可能性是转换为带有卷积的池化,因此导致 2 ( d 2 ) 2 k 2 2(\frac{d}{2})2k2 2(2d)2k2次运算,将计算成本降低为原来的四分之一。然而,由于表示的整体维度下降到 ( d 2 ) 2 k (\frac{d}{2})^2k (2d)2k,会导致表示能力较弱的网络(参见图9),这会产生一个表示瓶颈。我们建议另一种变体,其甚至进一步降低了计算成本,同时消除了表示瓶颈(见图10),而不是这样做。我们可以使用两个平行的步长为2的块: P P P和 C C C。 P P P是一个池化层(平均池化或最大池化)的激活,两者都是步长为 2 2 2,其滤波器组连接如图10所示。
在这里,我们连接上面的点,并提出了一个新的架构,在ILSVRC 2012分类基准数据集上提高了性能。我们的网络布局在表1中给出。注意,基于与3.1节中描述的同样想法,我们将传统的 7 × 7 7 \times 7 7×7卷积分解为3个 3 × 3 3\times 3 3×3卷积。对于网络的Inception部分,我们在$ 35 \times 35$处有 3 3 3个传统的Inception模块,每个模块有 288 288 288个滤波器。使用第5节中描述的网格缩减技术,这将缩减为 17 × 17 17\times 17 17×17的网格,具有 768 768 768个滤波器。这之后是图5所示的 5 5 5个分解的Inception模块实例。使用图10所示的网格缩减技术,这被缩减为 8 × 8 × 1280 8 \times 8 \times 1280 8×8×1280的网格。在最粗糙的 8 × 8 8 \times 8 8×8级别,我们有两个如图6所示的Inception模块,每个块连接的输出滤波器组的大小为2048。网络的详细结构,包括Inception模块内滤波器组的大小,在补充材料中给出,在提交的tar文件中的model.txt
中给出。然而,我们已经观察到,只要遵守第2节的原则,对于各种变化网络的质量就相对稳定。虽然我们的网络深度是 42 42 42层,但我们的计算成本仅比GoogLeNet高出约 2.5 2.5 2.5倍,它仍比VGGNet要高效的多。
我们提出了一种通过估计训练期间标签丢弃的边缘化效应来对分类器层进行正则化的机制。
对于每个训练样本 x x x,我们的模型计算每个标签的概率 k ∈ { 1 … K } k\in \lbrace 1\ldots K \rbrace k∈{1…K}: p ( k ∣ x ) = exp ( z k ) ∑ i = 1 K exp ( z i ) p(k|x) = \frac{\exp(z_k)}{\sum_{i=1}^K \exp(z_i)} p(k∣x)=∑i=1Kexp(zi)exp(zk)。这里, z i z_i zi是对数单位或未归一化的对数概率。考虑这个训练样本在标签上的实际分布 q ( k ∣ x ) q(k|x) q(k∣x),因此归一化后 ∑ k q ( k ∣ x ) = 1 \sum_k q(k|x) = 1 ∑kq(k∣x)=1。为了简洁,我们省略 p p p和 q q q对样本 x x x的依赖。我们将样本损失定义为交叉熵: ℓ = − ∑ k = 1 K log ( p ( k ) ) q ( k ) \ell = -\sum_{k=1}^K \log(p(k)) q(k) ℓ=−∑k=1Klog(p(k))q(k)。最小化交叉熵等价于最大化标签对数似然期望,其中标签是根据它的实际分布 q ( k ) q(k) q(k)选择的。交叉熵损失对于 z k z_k zk是可微的,因此可以用来进行深度模型的梯度训练。其梯度有一个更简单的形式: ∂ ℓ ∂ z k = p ( k ) − q ( k ) \frac{\partial\ell}{\partial z_k} = p(k) - q(k) ∂zk∂ℓ=p(k)−q(k),它的范围在 − 1 -1 −1到 1 1 1之间。
考虑单个真实标签 y y y的例子,对于所有 k ≠ y k\neq y k=y,有 q ( y ) = 1 q(y)=1 q(y)=1, q ( k ) = 0 q(k)=0 q(k)=0。在这种情况下,最小化交叉熵等价于最大化正确标签的对数似然。对于一个特定的样本 x x x,其标签为 y y y,对于 q ( k ) = δ k , y q(k)= \delta_{k,y} q(k)=δk,y,最大化其对数概率, δ k , y \delta_{k,y} δk,y为狄拉克δ函数,当且仅当 k = y k=y k=y时,δ函数值为1,否则为0。对于有限的 z k z_k zk,不能取得最大值,但对于所有 k ≠ y k\neq y k=y,如果 z y ≫ z k z_y\gg z_k zy≫zk——也就是说,如果对应实际标签的逻辑单元远大于其它的逻辑单元,那么对数概率会接近最大值。然而这可能会引起两个问题。首先,它可能导致过拟合:如果模型学习到对于每一个训练样本,分配所有概率到实际标签上,那么它不能保证泛化能力。第二,它鼓励最大的逻辑单元与所有其它逻辑单元之间的差距变大,与有界限的梯度 ∂ ℓ ∂ z k \frac{\partial\ell}{\partial z_k} ∂zk∂ℓ相结合,这会降低模型的适应能力。直观上讲这会发生,因为模型变得对它的预测过于自信。
我们提出了一个鼓励模型不那么自信的机制。如果目标是最大化训练标签的对数似然,这可能不是想要的,但它确实使模型正规化并使其更具适应性。这个方法很简单。考虑标签 u ( k ) u(k) u(k)的分布和平滑参数 ϵ \epsilon ϵ,与训练样本 x x x相互独立。对于一个真实标签为 y y y的训练样本,我们用
q ’ ( k ∣ x ) = ( 1 − ϵ ) δ k , y + ϵ u ( k ) q’(k|x) = (1-\epsilon) \delta_{k,y} + \epsilon u(k) q’(k∣x)=(1−ϵ)δk,y+ϵu(k)
代替标签分布 q ( k ∣ x ) = δ k , y q(k|x)=\delta_{k,y} q(k∣x)=δk,y,其由最初的实际分布 q ( k ∣ x ) q(k|x) q(k∣x)和固定分布 u ( k ) u(k) u(k)混合得到,它们的权重分别为 1 − ϵ 1-\epsilon 1−ϵ和 ϵ \epsilon ϵ。这可以看作获得标签 k k k的分布如下:首先,将其设置为真实标签 k = y k=y k=y;其次,用分布 u ( k ) u(k) u(k)中的采样和概率 ϵ \epsilon ϵ替代 k k k。我们建议使用标签上的先验分布作为 u ( k ) u(k) u(k)。在我们的实验中,我们使用了均匀分布 u ( k ) = 1 / K u(k) = 1/K u(k)=1/K,以便使得
q ’ ( k ) = ( 1 − ϵ ) δ k , y + ϵ K . q’(k) = (1-\epsilon) \delta_{k,y} + \frac{\epsilon}{K}. q’(k)=(1−ϵ)δk,y+Kϵ.
我们将真实标签分布中的这种变化称为_标签平滑正则化_,或LSR。
注意,LSR实现了期望的目标,阻止了最大的逻辑单元变得比其它的逻辑单元更大。实际上,如果发生这种情况,则一个 q ( k ) q(k) q(k)将接近 1 1 1,而所有其它的将会接近 0 0 0。这会导致 q ’ ( k ) q’(k) q’(k)有一个大的交叉熵,因为不同于 q ( k ) = δ k , y q(k)=\delta_{k,y} q(k)=δk,y,所有的 q ’ ( k ) q’(k) q’(k)都有一个正的下界。
LSR的另一种解释可以通过考虑交叉熵来获得:
H ( q ’ , p ) = − ∑ k = 1 K log p ( k ) q ’ ( k ) = ( 1 − ϵ ) H ( q , p ) + ϵ H ( u , p ) H(q’,p) = -\sum_{k=1}^K \log p(k) q’(k) = (1-\epsilon)H(q, p) + \epsilon H(u, p) H(q’,p)=−k=1∑Klogp(k)q’(k)=(1−ϵ)H(q,p)+ϵH(u,p)
因此,LSR等价于用一对这样的损失 H ( q , p ) H(q,p) H(q,p)和 H ( u , p ) H(u,p) H(u,p)来替换单个交叉熵损失 H ( q , p ) H(q,p) H(q,p)。第二个损失惩罚预测的标签分布 p p p与先验 u u u之间的偏差,其中相对权重为 ϵ 1 − ϵ \frac{\epsilon}{1-\epsilon} 1−ϵϵ。注意,由于 H ( u , p ) = D K L ( u ∣ p ) + H ( u ) H(u,p) = D_{KL}(u|p) + H(u) H(u,p)=DKL(u∣p)+H(u)和 H ( u ) H(u) H(u)是固定的,因此这个偏差可以等价地被KL散度捕获。当 u u u是均匀分布时, H ( u , p ) H(u,p) H(u,p)是度量预测分布 p p p与均匀分布不同的程度,也可以通过负熵 − H ( p ) -H§ −H§来度量(但不等价);我们还没有实验过这种方法。
在我们的 K = 1000 K=1000 K=1000类的ImageNet实验中,我们使用了 u ( k ) = 1 / 1000 u(k) = 1/1000 u(k)=1/1000和 ϵ = 0.1 \epsilon=0.1 ϵ=0.1。对于ILSVRC 2012,我们发现对于top-1
错误率和top-5
错误率,持续提高了大约 0.2 % 0.2\% 0.2%(参见表3)。
我们在TensorFlow[1]分布式机器学习系统上使用随机梯度方法训练了我们的网络,使用了 50 50 50个副本,每个副本在一个NVidia Kepler GPU上运行,批处理大小为 32 32 32, 100 100 100个epoch。我们之前的实验使用动量方法[19],衰减值为 0.9 0.9 0.9,而我们最好的模型是用RMSProp [21]实现的,衰减值为 0.9 0.9 0.9, ϵ = 1.0 \epsilon=1.0 ϵ=1.0。我们使用 0.045 0.045 0.045的学习率,每两个epoch以 0.94 0.94 0.94的指数速率衰减。此外,阈值为 2.0 2.0 2.0的梯度裁剪[14]被发现对于稳定训练是有用的。使用随时间计算的运行参数的平均值来执行模型评估。
做了那么多年开发,自学了很多门编程语言,我很明白学习资源对于学一门新语言的重要性,这些年也收藏了不少的Python干货,对我来说这些东西确实已经用不到了,但对于准备自学Python的人来说,或许它就是一个宝藏,可以给你省去很多的时间和精力。
别在网上瞎学了,我最近也做了一些资源的更新,只要你是我的粉丝,这期福利你都可拿走。
我先来介绍一下这些东西怎么用,文末抱走。
(1)Python所有方向的学习路线(新版)
这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
最近我才对这些路线做了一下新的更新,知识体系更全面了。
(2)Python学习视频
包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。
(3)100多个练手项目
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。
(4)200多本电子书
这些年我也收藏了很多电子书,大概200多本,有时候带实体书不方便的话,我就会去打开电子书看看,书籍可不一定比视频教程差,尤其是权威的技术书籍。
基本上主流的和经典的都有,这里我就不放图了,版权问题,个人看看是没有问题的。
(5)Python知识点汇总
知识点汇总有点像学习路线,但与学习路线不同的点就在于,知识点汇总更为细致,里面包含了对具体知识点的简单说明,而我们的学习路线则更为抽象和简单,只是为了方便大家只是某个领域你应该学习哪些技术栈。
(6)其他资料
还有其他的一些东西,比如说我自己出的Python入门图文类教程,没有电脑的时候用手机也可以学习知识,学会了理论之后再去敲代码实践验证,还有Python中文版的库资料、MySQL和HTML标签大全等等,这些都是可以送给粉丝们的东西。
这些都不是什么非常值钱的东西,但对于没有资源或者资源不是很好的学习者来说确实很不错,你要是用得到的话都可以直接抱走,关注过我的人都知道,这些都是可以拿到的。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注python)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
实很不错,你要是用得到的话都可以直接抱走,关注过我的人都知道,这些都是可以拿到的。**
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注python)
[外链图片转存中…(img-3azZeJ46-1713437798331)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!