做了那么多年开发,自学了很多门编程语言,我很明白学习资源对于学一门新语言的重要性,这些年也收藏了不少的Python干货,对我来说这些东西确实已经用不到了,但对于准备自学Python的人来说,或许它就是一个宝藏,可以给你省去很多的时间和精力。
别在网上瞎学了,我最近也做了一些资源的更新,只要你是我的粉丝,这期福利你都可拿走。
我先来介绍一下这些东西怎么用,文末抱走。
(1)Python所有方向的学习路线(新版)
这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
最近我才对这些路线做了一下新的更新,知识体系更全面了。
(2)Python学习视频
包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。
(3)100多个练手项目
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。
(4)200多本电子书
这些年我也收藏了很多电子书,大概200多本,有时候带实体书不方便的话,我就会去打开电子书看看,书籍可不一定比视频教程差,尤其是权威的技术书籍。
基本上主流的和经典的都有,这里我就不放图了,版权问题,个人看看是没有问题的。
(5)Python知识点汇总
知识点汇总有点像学习路线,但与学习路线不同的点就在于,知识点汇总更为细致,里面包含了对具体知识点的简单说明,而我们的学习路线则更为抽象和简单,只是为了方便大家只是某个领域你应该学习哪些技术栈。
(6)其他资料
还有其他的一些东西,比如说我自己出的Python入门图文类教程,没有电脑的时候用手机也可以学习知识,学会了理论之后再去敲代码实践验证,还有Python中文版的库资料、MySQL和HTML标签大全等等,这些都是可以送给粉丝们的东西。
这些都不是什么非常值钱的东西,但对于没有资源或者资源不是很好的学习者来说确实很不错,你要是用得到的话都可以直接抱走,关注过我的人都知道,这些都是可以拿到的。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
关于更多激活函数的介绍,参考《深度学习常用激活函数》。
2.3 计算输出层值
现在我们已经计算了隐藏层的值,最后将计算输出层的值。在下图中,我们将隐藏层值通过随机初始化的权重值连接到输出层。计算隐藏层值和权重值乘积的总和,得到输出值:
o u t p u t = 0.73 × 0.3 + 0.79 × 0.5 + 0.69 × 0.9 = 1.235 output = 0.73\times 0.3+0.79\times 0.5 + 0.69\times 0.9= 1.235 output=0.73×0.3+0.79×0.5+0.69×0.9=1.235
使用隐藏层值和权重值,我们可以得到网络的输出值,如下图所示:
因为第一次正向传播使用随机权重,所以输出神经元的值与目标相差很大,相差为 +1.235
(目标值为0)。
2.4 计算损失值
损失值(也称为成本函数)是在神经网络中优化的值。为了了解如何计算损失值,我们分析以下两种情况:
-
连续变量预测
-
分类(离散)变量预测
2.4.1 在连续变量预测过程中计算损失
通常,当预测值为连续变量时,损失函数使用平方误差,也就是说,我们尝试通过更改与神经网络相关的权重值来最小化均方误差:
J ( θ ) = 1 m ∑ i = 1 m ( h ( x i ) − y i ) 2 J(\theta)=\frac 1 m \sum _{i=1} m(h(x_i)-y_i)2 J(θ)=m1i=1∑m(h(xi)−yi)2
其中, y i y_i yi 是实际值, h ( x ) h(x) h(x) 是我们对输入 x x x 进行变换以获得预测值 y y y 的网络模型, m m m 是输入数据集中的数据个数。
2.4.2 在分类(离散)变量预测中计算损失
当要预测的变量是离散变量时(也就是说,变量中只有几个类别),我们通常使用分类交叉熵损失函数。当要预测的变量具有两个不同的值时,损失函数为二分类交叉熵,而当要预测的变量具有多个不同的值时,损失函数为多分类交叉熵。
- 二分类交叉熵公式如下:
( y l o g ( p ) + ( 1 − y ) l o g ( 1 − p ) ) (ylog§+(1−y)log(1−p)) (ylog§+(1−y)log(1−p))
- 多分类交叉熵定义如下:
− ∑ i = 1 n y i l o g ( p n ) -\sum _{i=1} ^n y_i log(p_n) −i=1∑nyilog(pn)
其中, y y y 是输入实际对应的真实值, p p p 是输出的预测值, n n n 是数据量的总数。
2.4.3 计算网络损失值
由于我们在以上示例中预测的结果是连续的,因此损失函数值是均方误差,其计算方法如下:
e r r o r = 1.23 5 2 = 1.52 error = 1.235^2 = 1.52 error=1.2352=1.52
2.5 使用 Python 实现网络前向传播
通过以上学习,我们知道了通过在输入数据之上执行以下步骤以在前向传播中可以得出误差值:
-
随机初始化权重
-
通过将输入值乘以权重来计算隐藏层节点值
-
对隐藏层值执行激活
-
将隐藏层值连接到输出层
-
计算平方误差损失
计算所有数据点的平方误差损失值:
import numpy as np
def feed_forward(inputs, outputs, weights):
pre_hidden = np.dot(inputs,weights[0])+ weights[1]
hidden = 1/(1+np.exp(-pre_hidden))
out = np.dot(hidden, weights[2]) + weights[3]
squared_error = (np.square(pred_out - outputs))
return squared_error
在前面的函数中,我们将输入变量值、权重(如果是第一次迭代,则随机初始化)以及数据集中的实际输出作为 feed_forward
函数的输入。
我们通过对输入和权重进行矩阵乘法来计算隐藏层的值。此外,将偏置值添加到隐藏层中:
pre_hidden = np.dot(inputs,weights[0])+ weights[1]
其中 weights[0]
是权重值,weights[1]
是偏置值,利用此权重和偏置就可以将输入层连接到隐藏层。计算隐藏层的值后,就可以在隐藏层的值上使用激活函数:
hidden = 1/(1+np.exp(-pre_hidden))
通过将隐藏层的输出乘以将隐藏层连接到输出的权重,然后在输出上添加偏置项,来计算隐藏层的输出:
pred_out = np.dot(hidden, weights[2]) + weights[3]
一旦计算出输出,我们就可以计算出每一输入的平方误差损失,如下所示:
squared_error = (np.square(pred_out - outputs))
在前面的代码中,pred_out
是预测输出,而 outputs
是输入应对应的实际输出。通过以上简单的步骤,我们便可以在网络前向传播时计算损失值。
在正向传播中,我们将输入层与隐藏层连接到输出层。 在反向传播中,我们使用相反的过程。 每次将神经网络中的每个权重进行少量更改。权重值的变化将对最终损失值(增加或减少的损失)产生影响,我们需要朝着减少损失的方向更新权重。通过每次轻微更新权重并测量权重更新导致的误差变化,我们可以完成以下操作:
-
确定权重更新的方向
-
确定权重更新的幅度
在实施反向传播之前,我们首先了解神经网络的另一重要概念:学习率。学习率有助于我们建立更稳定的算法。例如,在确定权重更新的大小时,我们不会一次性就对其进行大幅度更改,而是采取更谨慎的方法来缓慢地更新权重。这使模型获得更高的稳定性;在之后的学习中,我们还将研究学习率如何帮助提高稳定性。
更新权重以减少误差的整个过程称为梯度下降技术,随机梯度下降是将误差最小化的手段。更直观地讲,梯度代表差异(即实际值和预测值之间的差异),而下降则表示差异减小;随机代表选择随机样本进行训练,并据此做出决策。除了随机梯度下降外,还有许多其他优化技术可以用于减少损失值。之后的学习中,还将讨论不同的优化技术。
反向传播的工作原理如下:
-
利用前向传播过程计算损失值。
-
略微改变所有的权重。
-
计算权重变化对损失函数的影响。
-
根据权重更新是增加还是减少了损失值,在损失减少的方向上更新权重值。
对数据集中的所有数据执行 1 次训练过程(前向传播+反向传播),称为 1 个 epoch
。
为了进一步巩固我们对神经网络中反向传播的理解,让我们拟合一个已知的简单函数,查看如何得出权重。假设,待拟合函数为 y = 3 x y = 3x y=3x,我们期望得出权重值和偏置值(分别为 3 和 0)。
| x | 1 | 3 | 4 | 8 | 10 |
| — | — | — | — | — | — |
| y | 3 | 9 | 12 | 24 | 30 |
以上数据集可以表示为线性回归 y = a x + b y = ax + b y=ax+b,我们将尝试计算 a a a 和 b b b 的值(虽然我们已知它们分别是 2 和 0,但我们的目的是研究如何使用梯度下降获得这些值),将 a a a 和 b b b 参数随机初始化为 2.269 2.269 2.269 和 1.01 1.01 1.01 的值。接下来,我们将从零构建反向传播算法,以便清楚地了解如何在神经网络中计算权重。简单起见下,将构建一个没有隐藏层的简单神经网络。
- 初始化数据集,如下所示:
x = np.array([[1], [3], [4], [8], [10]])
y = np.array([[3], [9], [12], [24], [30]])
- 随机初始化权重和偏差值(在尝试确定 y = a x + b y = ax + b y=ax+b 方程中 a a a 和 b b b 的最优值时,只需要一个权重和一个偏置值):
w = np.array([[[2.269]], [[1.01]]])
- 定义神经网络并计算平方误差损失值:
import numpy as np
def feed_forward(inputs, outputs, weights):
out = np.dot(inputs, weights[0]) + weights[1]
squared_error = np.square(out - outputs)
return squared_error
在上述代码中,对输入与随机初始化的权重值进行了矩阵乘法,然后将其与随机初始化的偏置值相加。得到输出值后,便可以计算出实际值与预测值之差的平方误差值。
- 少量增加每个权重和偏置值,并针对每个权重和偏差更新一次计算一个平方误差损失值。
如果平方误差损失值随权重的增加而减小,则权重值应增加,权重值应增加的大小与权重变化减少的损失值的大小成正比。反之亦然。另外,通过学习率确保增加的权重值小于因权重变化而导致的损失值变化,这样可以确保损失值更平稳地减小。
接下来,创建一个名为 update_weights
的函数,该函数执行反向传播过程以更新在权重,该函数运行 epochs
次:
from copy import deepcopy
def update_weights(inputs, outputs, weights, epochs):
for epoch in range(epochs):
- 将输入通过神经网络传递,以计算权重未更新时的损失:
org_loss = feed_forward(inputs, outputs, weights)
- 确保对权重列表进行深复制,由于权重将在后续步骤中进行操作,深复制可解决由于子变量的更改而影响父变量的问题:
wts_tmp = deepcopy(weights)
wts_tmp2 = deepcopy(weights)
- 循环遍历所有权重值,然后对其进行较小的更改 (
+0.0001
):
for ix, wt in enumerate(weights):
wts_tmp[ix] += 0.0001
- 当权重修改后,计算更新的前向传播损失。计算由于权重的微小变化而造成的损失变化,因为我们要计算所有输入采样的均方误差,因此将损失的变化除以输入的数据数量:
loss = feed_forward(inputs, outputs, wts_tmp)
del_loss = np.sum(org_loss - loss)/(0.0001*len(inputs))
以较小的值更新权重,然后计算其对损失值的影响,等效于计算权重变化的导数(即反向梯度传播)。
- 通过损失变化来更新权重。通过将损失的变化乘以一个很小的数字(0.01)来缓慢更新权重,这就是学习率参数:
wts_tmp2[ix] += del_loss*0.01
wts_tmp = deepcopy(weights)
- 返回更新的权重和偏差值:
weights = deepcopy(wts_tmp2)
return wts_tmp2
现在能在网上找到很多很多的学习资源,有免费的也有收费的,当我拿到1套比较全的学习资源之前,我并没着急去看第1节,我而是去审视这套资源是否值得学习,有时候也会去问一些学长的意见,如果可以之后,我会对这套学习资源做1个学习计划,我的学习计划主要包括规划图和学习进度表。
分享给大家这份我薅到的免费视频资料,质量还不错,大家可以跟着学习
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!