step1:深度学习和机器学习的概念
因为没怎么接触过,我一直没有分清楚“深度学习”、“机器学习”和“神经网络”这几个十分常见的词到底是干什么的。所以当我要开始相关方面的学习时,第一件事情就是弄清它们的概念。由于学习了数据挖掘的课程,我大概了解到神经网络是一个算法,所以这里就不与深度学习、机器学习放在一起比较了。
机器学习
机器学习是人工智能技术的补充,有如下几种常用算法:
机器学习算法通常分为以下三大类:
- 有监督学习:需要从有标签的数据中学到或者建立一个模式。
- 无监督学习:数据是无标签的,机器学习算法需要先将数据分类,然后对数据结构进行描述,使复杂的数据看起来简单,以便进行后续分析工作。
- 强化学习:与监督学习相似,通过不断地探索学习,从而获得一个好的策略。
深度学习
深度学习是通过模拟人类决策能力的神经网络找出问题解决方法。深度学习可看作是特殊的机器学习,我们可以利用深度学习来解决任何需要思考的问题。
深度神经网络由三种类型的层组成:
区别?
我们使用机器学习算法解析数据,并根据从数据中学习到的知识做出决策。深度学习利用各个层组合创建人工“神经网络”,它能够智能地学习和做出决策。深度学习可以说是机器学习的子领域。
之前我在准备联系导师的时候,查阅到一些深度学习相关的资料(原文忘了),大致就是说人类大脑处理问题时并不是直接决策的,而是一层一层处理,每层有各自的功能,所以神经网络其实是模仿人脑,构造出这个模型。
-
数据依赖 深度学习与机器学习的主要区别是在于性能。当数据量很少的时候,深度学习的性能并不好,因为深度学习算法需要大量数据才能很好理解其中蕴含的模式。 -
硬件支持 深度学习算法严重依赖高端机,而传统的机器学习算法在低端机上就能运行。深度学习需要GPUs进行大量的矩阵乘法运算。 -
特征工程 特征工程就是将领域知识输入特征提取器,降低数据复杂度。从时间和专业性来讲,这个过程开销很高。 在机器学习中,大多数应用的特征都需要专家确定然后编码为一种数据类型。特征可以是像素值、形状、纹理、位置和方向。大多数机器学习算法的性能依赖于所提取的特征的准确度。深度学习尝试从数据中直接获取高等级的特征,这是深度学习与传统机器学习算法的主要的不同。基于此,深度学习削减了对每一个问题设计特征提取器的工作。 -
解决方案 通常,我们使用传统的算法解决问题,这需要将问题化整为零,分别解决,得到结果后再将其进行组合。传统机器学习通常会将问题分解为多个子问题并逐个子问题解决最后结合所有子问题的结果获得最终结果。相反,深度学习提倡直接的端到端的解决问题。 假设有一个多物体检测的任务需要图像中的物体的类型和各物体在图像中的位置。 传统机器学会将问题分解为两步:物体检测和物体识别。首先,使用一个边界框检测算法扫描整张图片找到可能的是物体的区域;然后使用物体识别算法对上一步检测出来的物体进行识别。相反,深度学习会直接将输入数据进行运算得到输出结果。 -
执行时间 由于深度学习中含有非常多的参数,较机器学习而言会耗费更多的时间。机器学习在训练数据的时候费时较少,同时只需几秒到几小时。 -
可解释性 由于太过复杂,深度学习是机器学习中的黑盒子,无法解释深度学习的可解释性。在一些需要可解释性的场景,例如数据挖掘,需要结合结果和原始特征进行一些解释,这时候就只能用机器学习。
总结——本质区别
机器学习是人手动选取特征,而深度学习是给出大量的数据然后让机器自己去学习选择特征 后者是前者的进一步智能化,智能化在对象的特征提取。 机器学习还是有部分人工干预,而深度学习几乎无人工干预了。后者更像是人类思考的过程,知道其结果是对的,但不知道是怎么做到的。
脉络清晰了!
step2:基本语法复习
学了Python课,笔记全都记在书上了。后续也许会放一些重点(但是现在没有)。
step3:深度学习常用库
了解深度学习是什么之后,就开始正式入门。我虽然没学过,但一直都知道深度学习要用Python,就不解释为什么了。
我的学习环境: 语言:Python 操作系统:Windows 编程软件:pycharm Python版本:Python3.9(好像是,之后验证一下)
NumPy
基本概念
NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。 NumPy 通常与 SciPy(Scientific Python)和 Matplotlib(绘图库)一起使用, 这种组合广泛用于替代 MatLab,是一个强大的科学计算环境.。
NumPy 是一个运行速度非常快的数学库,主要用于数组计算。
安装 由于我把Anaconda删掉了,所以我选择用pip安装。因为之前安装过,具体的安装方法和问题处理之前的博客已经说得很清楚了,此处不赘述: 在pycharm用python画图【概要】
1. numpy对象——Ndarray
ndarray 对象是用于存放同类型元素的多维数组,ndarray 中的每个元素在内存中都有相同存储大小的区域。它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。
介绍:
- 一个指向数据(内存或内存映射文件中的一块数据)的指针。
- 数据类型或 dtype,描述在数组中的固定大小值的格子。
- 一个表示数组形状(shape)的元组,表示各维度大小的元组。
- 一个跨度元组(stride),其中的整数指的是为了前进到当前维度下一个元素需要"跨过"的字节数。
创建:numpy.array()
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
其中参数为:
名称 | 描述 |
---|
object | 数组或嵌套的数列 | dtype | 数组元素的数据类型(可选) | copy | 对象是否需要复制(可选) | order | 创建数组的样式,C为行方向,F为列方向,A为任意方向(默认) | subok | 默认返回一个与基类类型一致的数组 | ndmin | 指定生成数组的最小维度 |
举例:
import numpy as np
a = np.array([[1, 2], [3, 4]])
print(a)
print("********")
a = np.array([1, 2, 3, 4, 5], ndmin=2)
print(a)
print("********")
a = np.array([1, 2, 3, 4, 5], ndmin=3)
print(a)
print("********")
a = np.array([1, 2, 3], dtype=complex)
print(a)
print("********")
输出:
2. numpy对象——dtype
介绍:
数据类型对象:numpy.dtype用来描述与数组对应的内存区域是如何使用,它描述了数据的以下几个方面:
- 数据的类型(整数,浮点数或者 Python 对象)。
- 数据的大小(例如, 整数使用多少个字节存储)。
- 数据的字节顺序(小端法或大端法)。字节顺序是通过对数据类型预先设定 < 或 > 来决定的。 < 意味着小端法(最小值存储在最小的地址,即低位组放在最前面)。> 意味着大端法(最重要的字节存储在最小的地址,即高位组放在最前面)。
- 在结构化类型的情况下,字段的名称、每个字段的数据类型和每个字段所取的内存块的部分。
- 如果数据类型是子数组,那么它的形状和数据类型是什么。
创建:numpy.dtype()
dtype 对象是使用以下语法构造的:
numpy.dtype(object, align, copy)
"""
object - 要转换为的数据类型对象
align - 如果为 true,填充字段使其类似 C 的结构体。
copy - 复制 dtype 对象 ,如果为 false,则是对内置数据类型对象的引用
"""
举例:
附:np中的数据类型:
名称 | 描述 |
---|
bool_ | 布尔型数据类型(True 或者 False) | int_ | 默认的整数类型(类似于 C 语言中的 long,int32 或 int64) | intc | 与 C 的 int 类型一样,一般是 int32 或 int 64 | intp | 用于索引的整数类型(类似于 C 的 ssize_t,一般情况下仍然是 int32 或 int64) | int8 | 字节(-128 to 127) | int16 | 整数(-32768 to 32767) | int32 | 整数(-2147483648 to 2147483647) | int64 | 整数(-9223372036854775808 to 9223372036854775807) | uint8 | 无符号整数(0 to 255) | uint16 | 无符号整数(0 to 65535) | uint32 | 无符号整数(0 to 4294967295) | uint64 | 无符号整数(0 to 18446744073709551615) | float_ | float64 类型的简写 | float16 | 半精度浮点数,包括:1 个符号位,5 个指数位,10 个尾数位 | float32 | 单精度浮点数,包括:1 个符号位,8 个指数位,23 个尾数位 | float64 | 双精度浮点数,包括:1 个符号位,11 个指数位,52 个尾数位 | complex_ | complex128 类型的简写,即 128 位复数 | complex64 | 复数,表示双 32 位浮点数(实数部分和虚数部分) | complex128 | 复数,表示双 64 位浮点数(实数部分和虚数部分) |
分割线
最后说一点题外话:作为一个不经常上网的人,对于网络方面窍门了解甚少,一直以为学代码最好的地方就是CSDN,偶然发现知乎上有许多更宏观的探讨,也很有价值,如果有和我一样的同学,不要错过知乎。
参考来源: 深度学习和机器学习有什么区别? NumPy 教程
【欢迎指正】
|