目录

夜雨飘零

记录精彩的程序人生

《深度学习》学习笔记一——线性代数 有更新!

标量、向量、矩阵和张量 标量(scalar):一个标量就是一个单独的数,它不同与线性代数中研究其他大部分对象(通常是多个数的数组)。我们用斜体表示标量。标量通常被赋予小写的变量名称,比如:$x$ 向量(vector): 一个向量是一列数。这些数都是有序排列的。通过次序中的索引,我们可以确定每个单独的数。通常我们赋予向量粗体的小写变量名称.比如:${\bf x}$ $$ {\bf x}=\left[\begin{matrix} x_1 \ x_2 \ \vdots \ x_n \end{matrix}\right]\tag{1} $$ 矩阵(matrix):矩阵是一个二维数组,其中的每一个元素由两个索引(而非一个)所确定。我们通常会赋予矩阵粗体的大写变量名称,比如:${\bf A}$ $$ {\bf A}=\left[\begin{matrix} A_{1,1}&A_{1,2} \ A_{2,1}&A_{2,2} \end{matrix}\right]\tag{2} $$ 张量(tensor):在某种情况下,我们会讨论坐标超过两维的数组。一般的,一个数组中的元素....

《深度学习》学习笔记二——概率论 有更新!

随机变量 随机变量(random variable)是可以随机地取不同值的变量.随机变量是可以离散的或者连续的,离散随机变量拥有有限或可数无限多的状态,连续随机变量伴随这实数值的. 概率分布 概率分布(probability distribution)用来描述随机变量或一簇随机变量在每一个可能取到的状态的可能性大小. 概率质量函数(probability mass function,PMF):离散型变量的概率分布可以用概率质量函数来描述,通常使用$P$表示概率质量函数 概率质量函数可以同时作用于多个随机变量.这种多个变量的概率分布被称为联合概率分布(joint probability distribution).$P({\bf x}=x,{\bf y}=y)$表示${\bf x}=x$和${\bf y}=y$同时发生的概率 一个函数$P$是随机变量$x$的PMF,必须满足以下条件: $P$的定义域必须是$x$所有可能状态的集合 $\forall x \in {\bf x},0 \leq P(x) \leq 1$ 不可能发生的事件概率为0,一定发生的事件概率为1 $\sum _{x.......

《深度学习》学习笔记三——数值计算 有更新!

上溢和下溢 下溢(underflow)是一种极具毁灭性的舍入误差.当接近零的数被四舍五入为零时发生下溢 上溢(overflow)是一种极具破坏力的数值错误形式.当大量级的数被近似为$\infty$或者$-\infty$时发生上溢,进一步的运算通常会导致这些无限值变成非数字. softmax 函数(softmax function)可以对上溢和下溢进行数值稳定的一个函数,softmax函数经常用于预测与Multinoulli分布相关联的概率,定义为: 基于梯度的优化方法 大多数深度学习算法都涉及某种形式的优化.优化指的是改变$x$以最小化或最大化某个函数$f(x)$的任务.我们通常以最小化$f(x)$指代大多数最优化问题,最大化可以经由最小化算法最小化$-f(x)$来实现 我们把要最小化或最大化的函数称为目标函数(objective function)或者准则(criterion).当我们对其进行最小化时,也把它称为代价函数(cost function),损失函数(loss function)或者误差函数(error function) 导数 导数(derivative):设函数$.......

《我的PaddlePaddle学习之路》笔记一——PaddlePaddle的安装 有更新!

环境 系统:Ubuntu 16.0.4(64位) 处理器:Intel(R) Celeron(R) CPU 内存:8G 环境:Python 2.7 Windows系统的安装 PaddlePaddle目前还不支持Windows,如果读者直接在Windows上安装PaddlePaddlePaddle的话,就会提示没有找到该安装包。如果读者一定要在Windows上工作的话,笔者提供两个建议:一、在Windows系统上使用Docker容器,在Docker容器上安装带有PaddlePaddle的镜像;二、在Windows系统上安装虚拟机,再在虚拟机上安装Ubuntu。 本篇文章基于 PaddlePaddle 0.11.0、Python 2.7 在Windows上安装Docker容器 首先下载Docker容器的工具包DockerToolbox,笔者使用这个安装包不仅仅只有Docker,它还包含了VirtualBox虚拟机,使用者工具包我们就不用单独去安装VirtualBox虚拟机了,DockerToolbox的官网下载地址: https://docs.docker.com/toolbox/too......

《我的PaddlePaddle学习之路》笔记二——MNIST手写数字识别 有更新!

*本篇文章基于 PaddlePaddle 0.11.0、Python 2.7 数据集的介绍 如题目所示,本次训练使用到的是MNIST数据库的手写数字,这个数据集包含60,000个示例的训练集以及10,000个示例的测试集.图片是28x28的像素矩阵,标签则对应着0~9的10个数字。每张图片都经过了大小归一化和居中处理.该数据集的图片是一个黑白的单通道图片,其中图片如下: 该数据集非常小,很适合图像识别的入门使用,该数据集一共有4个文件,分别是训练数据和其对应的标签,测试数据和其对应的标签.文件如表所示: |文件名称 |大小|说明| | :---: |:---:| :---:| |train-images-idx3-ubyte|9.9M|训练数据图片,60,000条数据| |train-labels-idx1-ubyte|28.9K|训练数据标签,60,000条数据| |t10k-images-idx3-ubyte|1.6M|测试数据图片,10,000条数据| |t10k-labels-idx1-ubyte|4.5K|测试数据标签,10,000条数据| 这个数据集针对170多M....

《我的PaddlePaddle学习之路》笔记三——CIFAR彩色图像识别 有更新!

本篇文章基于 PaddlePaddle 0.11.0、Python 2.7 数据集的介绍 本次项目中使用的是一个3232的彩色图像的数据集CIFAR-10,CIFAR-10数据集包含10个类的60000个32x32彩色图像,每个类有6000个图像。有50000个训练图像和10000个测试图像。数据集分为五个训练batch和一个测试batch,每个batch有10000个图像。测试batch包含来自每个类1000个随机选择的图像。训练batch按照随机顺序包含剩余的图像,但是一些训练batch可能包含比另一个更多的图像。在他们之间,训练的batch包含每个类别正好5000张图片。 下表是数据集文件内部的结构,如上所说,有五个训练batch和一个测试batch: 文件名称大小说明 test_batch31.0M10000个测试图像 data_batch_131.0M10000个训练图像 data_batch_231.0M10000个训练图像 data_batch_331.0M10000个训练图像 data_batch_431.0M10000个训练图像 data_batch_....

《我的PaddlePaddle学习之路》笔记四——自定义图像数据集的识别 有更新!

*本篇文章基于 PaddlePaddle 0.11.0、Python 2.7 数据集介绍 如果我们要训练自己的数据集的话,就需要先建立图像列表文件,下面的代码是Myreader.py读取图像数据集的一部分,从这些代码中可以看出,图像列表中,图像的路径和标签是以\t来分割的,所以我们在生成这个列表的时候,使用\t就可以了. def train_reader(self,train_list, buffered_size=1024): def reader(): with open(train_list, 'r') as f: lines = [line.strip() for line in f] for line in lines: img_path, lab = line.strip().split('\t') yield img_path, int(lab) return paddle.reader.xmap_readers(self.train_mapper, reader, cpu_count(), buffered_size) 生成的图像列表的结构是这样的: ../imag......

《我的PaddlePaddle学习之路》笔记五——验证码的识别 有更新!

本篇文章基于 PaddlePaddle 0.11.0、Python 2.7 数据集介绍 本次使用的验证码是方正系统,现在很多的大学的教务系统用的就是这个方正系统,刚好既然那么普遍,我们就用它练一练手。经过观察大量的验证码发现,该系统的验证码只有小写的字母和数字,这样分类就少了很多了。该系统的验证码如下: 验证码尺寸说明 7227只有数字和小写字母 1227第一个X方向的从5开始裁剪到17,Y取全部,即从0裁剪到27 1227第二个X方向的从17开始裁剪到29,Y取全部,即从0裁剪到27 1227第三个X方向的从29开始裁剪到41,Y取全部,即从0裁剪到27 1227第四个X方向的从41开始裁剪到53,Y取全部,即从0裁剪到27 通过上面表上说明,我们就可以开始裁剪验证码了。在裁剪之前我们先要下载编写一个程序,让它来帮我们下载更多的验证码 下载验证码 编写一个下载验证码的程序DownloadYanZhengMa.py,这里我们只需要传入保存路径和要下载的数量就可以了。 # -- coding:utf-8 -- import re import uuid i....

《我的PaddlePaddle学习之路》笔记六——验证码端到端的识别 有更新!

*本篇文章基于 PaddlePaddle 0.10.0、Python 2.7 前言 在上一篇文章中介绍了验证码的识别,但是使用的传统的验证码分割,然后通过图像分类的方法来实现验证码的识别的,这中方法比较繁琐,工作量比较多。在本篇文章会介绍验证码端到端的识别,直接一步到位,不用图像分割那么麻烦了。好吧,现在开始吧! 数据集介绍 在本篇文章中同样是使用方正系统的验证码,该数据集在上一篇文章《我的PaddlePaddle学习之路》笔记五——验证码的识别已有介绍,在这里我就不介绍了,需要了解的可以点击链接去到上一篇文章查看。 获取验证码 下载验证码和修改验证码同样在上一篇文章有介绍,如果读者需要同样可以回到上一篇文章查看。 验证码我们有了,有看过上一篇文章的读者会第一反应说还缺图像列表。没错,训练和测试都需要一个图像列表 把图像转成灰度图 在生成列表之前,我们还有对图像做一些处理,就是把图像灰度化。 **注意:**在此之前应该把图像文件命名,文件名为验证码对应的字符,并把所有的验证码放在data_temp 然后执行以下的程序批量处理 # coding=utf-8 import os f....

《我的PaddlePaddle学习之路》笔记七——车牌端到端的识别 有更新!

本篇文章基于 PaddlePaddle 0.10.0、Python 2.7 前言 车牌识别的应用场景有很多,比如在停车场。通过车牌识别登记入库和出库的车辆的情况,并计算该车停留时间,然后折算费用。还可以在公路上识别来往的车辆,方便交警的检查等等。接下来我们就是使用PaddlePaddle来做一个车牌识别,我们直接通过段端到端识别,不用分割即可完成识别。在阅读这篇文章时,你应该先阅读上一篇验证码端到端的识别,在上一篇的很多细节,在本篇中不会很说得很细。 车牌的采集 车牌的下载 在做车牌识别之前,我们要先数据。这些车牌数据我打算从百度图片中获取,所以我先编写一个程序来帮我们下载车牌图像。 # -- coding:utf-8 -*- import re import uuid import requests import os class DownloadImages: def init(self, download_max, key_word): self.download_sum = 0 self.download_max = download_max self.key_....

《我的PaddlePaddle学习之路》笔记八——场景文字识别 有更新!

*本篇文章基于 PaddlePaddle 0.10.0、Python 2.7 前言 在前两篇文章验证码端到端的识别和车牌端到端的识别这两篇文章中其实就使用到了场景文字识别了,在本篇中就针对场景文字识别这个问题好好说说。 场景文字识别到底有什么用呢,说得大一些在自动驾驶领域,公路上总会有很多的路牌和标识,这些路牌标识通常会有很多的文字说明,我们就要识别这些文字来了解它们的含义。还有老师在黑板上写的笔记,如果使用场景文字识别技术,我们直接拍个照,直接识别黑板中的文字内容,就可以省去很多抄笔记时间了。 数据集的介绍 场景文字是怎样的呢,来看看这张图像 这张图像中包含了大量的文字,我们要做的就是把这些文字识别出来。这张图像是SynthText in the Wild Dataset,这个数据集非常大,有41G。为了方便学习,我们在本项目中使用这个数据集,而是使用更小的Task 2.3: Word Recognition (2013 edition),这个数据集的训练数据和测试数据一共也就160M左右,非常适合我们做学习使用,该数据集的图像如下: 数据的读取 官方给出的数据读取列表有两....

《我的PaddlePaddle学习之路》笔记九——使用VOC数据集的实现目标检测 有更新!

*本篇文章基于 PaddlePaddle 0.11.0、Python 2.7 前言 目标检测的使用范围很广,比如我们使用相机拍照时,要正确检测人脸的位置,从而做进一步处理,比如美颜等等。在目标检测的深度学习领域上,从2014年到2016年,先后出现了R-CNN,Fast R-CNN, Faster R-CNN, ION, HyperNet, SDP-CRC, YOLO,G-CNN, SSD等神经网络模型,使得目标检测不管是在准确度上,还是速度上都有很大提高,几乎可以达到实时检测。 VOC数据集 VOC数据集介绍 PASCAL VOC挑战赛是视觉对象的分类识别和检测的一个基准测试,提供了检测算法和学习性能的标准图像注释数据集和标准的评估系统。 PASCAL VOC图片集包括20个目录: 人类; 动物(鸟、猫、牛、狗、马、羊); 交通工具(飞机、自行车、船、公共汽车、小轿车、摩托车、火车); 室内(瓶子、椅子、餐桌、盆栽植物、沙发、电视)。 这些类别在data/label_list文件中都有列出来,但这个文件中多了一个类别,就是背景(background) 下载VOC数据集 可以通....

《我的PaddlePaddle学习之路》笔记十——自定义图像数据集实现目标检测 有更新!

*本篇文章基于 PaddlePaddle 0.11.0、Python 2.7 前言 在阅读这一篇文章之前,要先阅读上一篇文章使用VOC数据集的实现目标检测,因为大部分的程序都是使用上一篇文章所使用到的代码和数据集的格式。在这篇文章中介绍如何使用自定义的图像数据集来做目标检测。 数据集介绍 我们本次使用的到的数据集是自然场景下的车牌,不知读者是否还记得在车牌端到端的识别这篇文章中,我们使用到的车牌是如何裁剪的,我们是使用OpenCV经过多重的的图像处理才达到车牌定位的,而且定位的效果比较差。在这篇文章中我们尝试使用神经网络来定位车牌位置。 下载车牌 我们先从网络上下载车牌数据,来提供给我们进行训练,核心代码片段如下: def start_download(self): self.download_sum = 0 gsm = 80 str_gsm = str(gsm) pn = 0 if not os.path.exists(self.save_path): os.makedirs(self.save_path) while self.download_sum < self.do......

《我的PaddlePaddle学习之路》笔记十一——新版本Fluid的使用 有更新!

*本篇文章基于 PaddlePaddle 0.13.0、Python 2.7 *Fluid版本的使用可以学习笔者的新系列教程:《PaddlePaddle从入门到炼丹》 前言 PaddlePaddle的Fluid是0.11.0提出的,Fluid 是设计用来让用户像Pytorch和Tensorflow Eager Execution一样执行程序。在这些系统中,不再有模型这个概念,应用也不再包含一个用于描述Operator图或者一系列层的符号描述,而是像通用程序那样描述训练或者预测的过程。而Fluid与PyTorch或Eager Execution的区别在于Fluid不依赖Python提供的控制流,例如 if-else-then或者for,而是提供了基于C++实现的控制流并暴露了对应的用with语法实现的Python接口。例如我们会在例子中使用到的代码片段: with fluid.program_guard(inference_program): test_accuracy = fluid.evaluator.Accuracy(input=out, label=label) test_ta.....

《我的PaddlePaddle学习之路》笔记十二——可视化工具VisualDL的使用 有更新!

*本篇文章基于 PaddlePaddle 0.13.0、Python 2.7 前言 VisualDL是一个面向深度学习任务设计的可视化工具,包含了scalar、参数分布、模型结构、图像可视化等功能。可以这样说:“所见即所得”。我们可以借助VisualDL来观察我们训练的情况,方便我们对训练的模型进行分析,改善模型的收敛情况。 之前我们使用的paddle.v2.plot接口,也可以观察训练的情况,但是只是支持CSOT的折线图而已。而VisualDL可以支持一下这个功能: scalar,趋势图,可用于训练测试误差的展示 image, 图片的可视化,可用于卷积层或者其他参数的图形化展示 histogram, 用于参数分布及变化趋势的展示 graph,用于训练模型结构的可视化 以上的图像来自VisualDL的Github 既然那么方便,那么我们就来尝试一下吧。VisualDL底层采用C++编写,但是它在提供C++ SDK的同时,也支持Python SDK,我们主要是使用Python的SDK。顺便说一下,VisualDL除了支持PaddlePaddle,之外,还支持pytorch,....

《我的PaddlePaddle学习之路》笔记十三——把PaddlePaddle部署到网站服务器上 有更新!

*本篇文章基于 PaddlePaddle 0.11.0、Python 2.7 前言 如果读者使用过百度等的一些图像识别的接口,比如百度的细粒度图像识别接口,应该了解这个过程,省略其他的安全方面的考虑。这个接口大体的流程是,我们把图像上传到百度的网站上,然后服务器把这些图像转换成功矢量数据,最后就是拿这些数据传给深度学习的预测接口,比如是PaddlePaddle的预测接口,获取到预测结果,返回给客户端。这个只是简单的流程,真实的复杂性远远不止这些,但是我们只需要了解这些,然后去搭建属于我们的图像识别接口。 环境 系统是:64位 Ubuntu 16.04 开发语言是:Python2.7 web框架是:flask 预测接口是:图像识别 flask的熟悉 安装flask 安装flask很简单,只要一条命令就可以了: pip install flask 同时我们也使用到flask_cors,所以我们也要安装这个库 pip install flask_cors 主要安装的是这两个库,如果还缺少哪些库,可以使用pip命令安装,*代表读者缺少的库: pip install * 测试fl....

《我的PaddlePaddle学习之路》笔记十四——把PaddlePaddle迁移到Android设备上 有更新!

*本篇文章基于 PaddlePaddle 0.11.0、Python 2.7 前言 PaddlePaddle还可以迁移到Android或者Linux设备上,在这些部署了PaddlePaddle的设备同样可以做深度学习的预测。在这篇文章中我们就介绍如何把PaddlePaddle迁移到Android手机上,并在Android的APP中使用PaddlePaddle。 编译PaddlePaddle库 使用Docker编译PaddlePaddle库 使用Docker编译PaddlePaddle真的会很方便,如果你对比了下面部分的使用Linux编译PaddlePaddle库,你就会发现使用Docker会少很多麻烦,比如安装一些依赖库等等。而且Docker是跨平台的,不管读者使用的是Windows,Linux,还是Mac,都可以使用Docker。以下操作方法都是在64位的Ubuntu 16.04上实现的。 首先安装Docker,在Ubuntu上安装很简单,只要一条命令就可以了 sudo apt install docker.io 安装完成之后,可以使用docker --version命令查看是.......

《Neural Networks and Deep Learning》的理论知识点 有更新!

目录 @[toc] 深度学介绍 AI比喻新电是是因为AI就像大约100年前的电力一样,正在改变多个行业,如: 汽车行业,农业和供应链。 深度学习最近起飞的原因是:硬件的开发,特别是GPU的计算,是我们获得更多的计算能力;深度学习已在一些重要的领域应用,如广告,语音识别和图像识别等等;目前数字化的时代使得我们拥有更多的数据。 关于迭代不同ML思想的图: 这个思维图能够快速尝试想法,可以让深度学习工程师更快速地迭代自己的想法; 可以加快团队迭代一个主意的时间;深度学习算法的新进展使得我们能更好地训练模型,即使不改变CPU或者GPU硬件。 寻找模型的特征是获取良好性能的关键,虽然经验可以提供帮助,但是需要多次迭代来建立一个良好的模型。 ReLU激活函数的图表如下: 猫的识别是一个“非结构化”的数据例子;统计不同城市人口,人均GDP,经济增长的人口统计数据集是反映图像,音频或者文本数据集的“结构化”数据的一个例子。 为什么使用RNN(循环神经网络)作为机器翻译,这是因为RNN是一个可以被训练的监督学习的问题;RNN的输入和输出是一个序列,翻译就是从一种语言序列映射到另一种语言的序....

使用Logistic回归实现猫的二分类 有更新!

前言 这里使用到的是一个猫的数据集,根据这个数据集训练图像是不是猫,数据集的图像如下: 导入包 如果没有安装对应的包,请使用pip安装对应的包,这个使用了一个lr_utils的工具类,这个工具类是加载数据集的工具,可以到这里下载。这个工具类也使用一个h5py,所以也要安装该包。 # coding=utf-8 import matplotlib.pyplot as plt import numpy as np import scipy from scipy import ndimage from lr_utils import load_dataset 获取数据 接下来就是加载数据和对数据进行处理 # 加载数据 train_set_x_orig, train_set_y, test_set_x_orig, test_set_y, classes = load_dataset() # 读取图像的大小 m_train = train_set_x_orig.shape[0] m_test = test_set_x_orig.shape[0] num_px = train_set_x_ori......

使用带有隐层的神经网络实现颜色二分类 有更新!

前言 数据集是一个红色和蓝色的的分布。其分布图如下: 导包 导入依赖包,这个两个分别是加载数据的工具函数和数据集,这个两个程序可以在这里下载。这个工具函数中使用到sklearn包,使用之前还要使用pip安装该函数。 from planar_utils import sigmoid, load_planar_dataset from testCases_v2 import * 加载数据 加载数据和获取数据的形状 # 加载数据 X, Y = load_planar_dataset() # 获取数据的形状 shape_X = X.shape shape_Y = Y.shape m = shape_X[1] 神经网络模型 定义神经网络结构 定义神经网络结构,比如数据的大小,对应的标签和有多少个隐层。 def layer_sizes(X, Y): """ 定义神经网络结构 :param X: 形状的输入数据集(输入大小,示例数量) :param Y: 形状标签(输出尺寸,示例数量) :return: n_x -- 输入层的大小。 n_h -- 隐藏层的大小。 n_y -- 隐藏层的大小。。.......