前言
从我开始读书的那一天起,每天都在学习不同的知识,都在接触不同的人。而一直以来,我却只能做一个知识的输入者,可是......噢对了,自我介绍一下,我是一个在重庆读书的大学生,我的专业是车辆工程。今天是我打开知乎的第977天,但是我决定做一件和往常不同的事情。从今天开始,我会写下一篇篇笔记,从深度学习一直写到汽车测试技术、写到材料力学。我会记录每一件特别的事情,从车辆工程的发展到如今炙手可热的人工智能。
本系列我会为大家讲解深度学习中关于计算机视觉方面的应用——目标检测。但是作为本系列的开篇作,我不打算直接讲解它的原理和代码。现在夜深了,人也静下来。我只想给大家分享分享一些关于计算机方面的事情,一些关于深度学习的事情,还有一些说也说不清楚的事情。从我的亲身经历,给屏幕前的同行一些参考。
一位物理老师
我的老师曾经说过:“这个大学或许不是你的理想大学,但是这里却有着理想的老师,理想的同学,理想的环境和一个不理想的你。”
从C语言到C语言
我想和大家好好地梳理一下。
不管是我身边还是知乎上,很多人都不明白为什么我们要学C语言。我想谈谈我的看法。
角度一:可能你觉得C语言显得很底层。
都怪那本书,它说C语言更接近于汇编语言,更像是一门中级语言。
都怪我们C语言老师,明明是一门很无聊的课,她可以讲的更无聊。
这里我想给大家科普一下,C语言是上个世纪70年代的产物,那个时候计算机发展得十分缓慢,也非常初级。所以一门新语言的诞生,就势必要关注计算机的内存,必须在有限的空间里创造无限的可能。因此C语言就会给我们介绍什么是指针,变量名的意义等等。因此C语言课上,就常常有以下内容。
![f412f17775873a51941c4ad17fb7e283.png](https://i-blog.csdnimg.cn/blog_migrate/850e94cd93336d8a334ee99fb8a17be5.png)
总之,C语言常常告诉你:要关注内存,要关注数据在内存里面是如何存放的。
正因为它十分“底层”,可能会消磨你学习兴趣。但重要的是,当你在学习其他语言时,就会得心应手。在学习完C语言后,我又自学了Swift、Matlab和Python。如果把Matlab和Python这些语言比作物理学,那么C语言的重要性就好比数学。可能在学习Python这些语言的时候,你不会关注内存,不会关注数据如何存放,不会在乎数据是否连续。但是正因为你学了高数,你才可以明白物理中的公式是怎么一回事。所以,C语言其实是为以后的深入学习计算机语言打下了基础。但如果你对计算机语言完全不感兴趣,也保证以后不会学习其他语言,那就是另一码事了。
角度二:为什么我们要学习计算机语言。
前面提到,我的专业是和车辆有关的。那么我会接触到大量关于机械、力学、材料方面的知识。可以这么说,大一学了C语言后,大部分同学是不会再接触计算机语言了。这就可以很好地解释,到现在的阶段,很多人都有疑惑,为什么我们要学习计算机语言。
我想首先从工作这个方面入手。曾经我和一些同学探讨过,从我们的角度来说现在的高科技产品,无非涉及三个方面的内容:计算机、电子和机械。因此,如果我们立足于机械和电子并学习计算机的知识,无非使我们的就业面更广。而且现在已经是一个高度信息化、数字化的时代,本身就要求我们要具备这些知识才能有立足之地。
给大家分享一句很流行的话:工具决定思维。学习了计算机语言,我们看待问题的方式和角度无疑会增加不少,在面对高计算量、高复杂度的问题,我们就会想到两个字——编程。在面对一些数学难题时,我们肯定会绞尽脑汁地去想一个巧妙的方式来解决,但是大多数时候,这种巧妙的方式不容易被想到。那么这时,你会自然而然地想到用编程的方式来解决,因为计算机可以挨个挨个去计算,并且不容易算错。你可以用编程去验证所有可能,最终找到解决问题的方案。
选择Python?
前文提到,在学完C语言后,大部分同学是不会去学习其它语言了。
当初我也是这样的想法,C语言的确消磨了我对计算机的兴趣。也就是那个时候,一个计算机学院的同学转到我们班上,那时我会花很多时间去帮助他学习机械制图,他也就给我讲了很多很多关于计算机方面的知识。当然仅靠这些是不足以引起我的兴趣,直到我看见了一串代码:
print("Hello World")
我还没有见过这么清新脱俗的代码。
可能那时我才明白了计算机语言的意义,计算机语言和英语一样,都只是一个工具而已。那么我们学了计算机语言,根本上是为了解决问题,如果我们把大部分时间都花在编写一个程序上,那么我们就不会有太多精力去解决问题。因此这是我后来学习Python的重要原因。
![6375b0b21822523a0ba38866b4cac220.png](https://i-blog.csdnimg.cn/blog_migrate/1cd10d654fbf17a960a4701a3e77e4db.jpeg)
下面是我的Python学习路线,供大家参考。
- 中国大学Mooc --> 学习Python基础
- 《Python编程:从入门到实践》 --> 再次学习Python基础
- 《利用Python进行数据分析》 --> 学习Numpy、Pandas和Matplotlib等数据处理库
- 《Python科学计算》 --> 学习Scipy、Sympy等科学计算库
- 《深度学习之PyTorch实战计算机视觉》 --> 学习PyTorch等深度学习框架
- 《OpenCV轻松入门:面向Python》 --> 学习传统计算机视觉算法
- 《深度学习之PyTorch物体检测实战》 --> 学习目标检测算法
- 《笨办法学Python》 --> 嘿嘿,刚买回来,准备巩固之前学的Python
之间一直是断断续续地学习,所以花了大概一年时间。
深度学习:从入门到放弃
在这个世界上,存在着很多听起来感觉很高大上的东西:
- 人工智能
- 机器学习
- 深度学习
它们之间大概是以下关系:
![32eee2ce7e97e13af2bcbd1884aed9c3.png](https://i-blog.csdnimg.cn/blog_migrate/af5da30480e10f4c9dedb2d82fa7406f.jpeg)
- 人工智能(Artificial Intelligence, AI):人工智能的发展可以如下概括:人工智障 --> 弱人工智能 --> 强人工智能。很明显,目前我们停留在弱人工智能阶段,因为很多事情还是需要人类的干预和决策,在很多领域也无法使计算机完全代替人类。
- 机器学习(Machine Learning, ML):和我们学的《概率论与数理统计》很类似,即用统计的思想来解决问题。
- 深度学习(Deep Learning, DL):按我的理解,深度学习
深度神经网络。深度学习就好比教小朋友认识东西。你会给许多带有动物的卡片让他们学习,渐渐的,他们就可以看懂纪录片《动物世界》了。所以你必须把深度神经网络和大脑里的神经网络联系起来,当你搭建了一个神经网络后,你就要用大量数据去训练它。
目前,深度学习有着以下应用:
- 计算机视觉
- 自然语言处理 NLP
- 语言识别
下面让我们来欣赏一段代码:
import numpy as np
# 设置神经网络的尺寸
batch_n = 100
input_data = 1000
output_data = 10
hidden_layer = 100
# 设置初始值
x = np.random.randn(batch_n,input_data)
y = np.random.randn(batch_n,output_data)
w1 = np.random.randn(input_data,hidden_layer)
w2 = np.random.randn(hidden_layer,output_data)
# 定义超参数
epoch_n = 20
learning_rate = 1e-6
for epoch in range(epoch_n):
# 正向传播
h = np.dot(x,w1)
h = np.where(h > 0,h,0)
y_pred = np.dot(h,w2)
# 反向传播
loss = pow((y_pred - y),2).sum() # 损失计算
print("Epoch:{} ,Loss:{:.2f}".format(epoch,loss))
grad_y_pred = 2 * (y_pred - y) # 梯度计算
grad_w2 = np.dot(h.T,grad_y_pred)
grad_h = np.dot(grad_y_pred,w2.T)
grad_h = np.where(grad_h > 0,grad_h,0)
grad_w1 = np.dot(x.T,grad_h)
w1 -= learning_rate * grad_w1 # 梯度更新
w2 -= learning_rate * grad_w2
以上代码就是构建了一个含单层隐藏层的神经网络。
结语
现在已经是凌晨一点半了,本期分享就到这里。第一次写知乎难免会有一些不足之处,希望大家能够批评指正。
下期我将给大家详细讲解目标检测中的YOLO v3检测器。