记录精彩的程序人生
前言 开发人脸识别系统,人脸数据集是必须的。所以在我们开发这套人脸识别系统的准备工作就是获取人脸数据集。本章将从公开的数据集到自制人脸数据集介绍,为我们之后开发人脸识别系统做好准备。 公开人脸数据集 公开的人脸数据集有很多,本中我们就介绍几个比较常用的人脸数据集。 CelebA人脸数据集 官方提供的下载地址:https://pan.baidu.com/s/1eSNpdRG#list/path=%2F 该数据集下载后有3个文件夹,Anno文件夹是存放标注文件的,Eval文件夹是存放评估列表文件的,Img文件是存放图片文件的。 Img中有3中类型的图像文件,其中 img_align_celeba.zip是经过对人脸居中,裁剪,并统一大小为178*178的jpg图片; img_align_celeba_png.7z中的图片跟img_align_celeba.zip中的图片一样,唯一不同的是这些图片是png格式的,所以这些图片要大得多。 img_celeba.7z这个是人脸图片的原始图片,没有经过居中裁剪等处理的图片。 Anno文件夹中有5个标注文件,其中 identity_CelebA.......
前言 中央民族大学创业团队巨神人工智能科技在科赛网公开了一个TibetanMNIST正是形体藏文中的数字数据集,TibetanMNIST数据集的原图片中,图片的大小是350*350的黑白图片,图片文件名称的第一个数字就是图片的标签,如0_10_398.jpg这张图片代表的就是藏文的数字0。在本项目中我们结合第四章所学的卷积神经网络,来完成TibetanMNIST数据集的分类识别。 导入所需的包 主要是使用到PaddlePaddle的fluid和paddle依赖库,cpu_count库是获取当前CPU的数量的,matplotlib用于展示图片。 import paddle.fluid as fluid import paddle import numpy as np from PIL import Image import os from multiprocessing import cpu_count import matplotlib.pyplot as plt 生成图像列表 因为TibetanMNIST数据集已经在科赛网发布了,所以我们创建项目之前还需要在科赛网中把数据集下载下来.....
前言 TensorFlow Lite是一款专门针对移动设备的深度学习框架,移动设备深度学习框架是部署在手机或者树莓派等小型移动设备上的深度学习框架,可以使用训练好的模型在手机等设备上完成推理任务。这一类框架的出现,可以使得一些推理的任务可以在本地执行,不需要再调用服务器的网络接口,大大减少了预测时间。在前几篇文章中已经介绍了百度的paddle-mobile,小米的mace,还有腾讯的ncnn。这在本章中我们将介绍谷歌的TensorFlow Lite。 Tensorflow Lite的GitHub地址:https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite Tensorflow的版本为:Tensorflow 1.14.0 转换模型 手机上执行预测,首先需要一个训练好的模型,这个模型不能是TensorFlow原来格式的模型,TensorFlow Lite使用的模型格式是另一种格式的模型。下面就介绍如何使用这个格式的模型。 获取模型主要有三种方法,第一种是在训练的时候就保存tflite模型,另外一种就是使用其他....
前言 Caffe是目前比较常用的深度学习框架,这个框架安装没有其他一下主流框架那么简单,直接使用pip命令安装,它更常用的是使用编译的方式安装。所以写下这个文章记录一下。 在Ubuntu上安装Caffe 如果Ubuntu版本是>= 17.04的,就可以使用以下的方式安装Caffe,注意安装的是Python 3的版本。 apt install caffe-cpu 如果是低于这版本,就要使用源码编译了,笔者的系统是64位的Ubuntu 16.04,下面就介绍安装步骤,使用的Python 2。 安装依赖环境 首先我们要安装依赖环境,依赖环境有点多,需要保证都安装了,以免在编译的时候出错。如果之前安装过了,重复执行命令也没有问题的。 apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler apt-get install --no-install-recommends libboost-all-dev apt-get in.....
前言 在之前笔者有介绍过《在Android设备上使用PaddleMobile实现图像分类》,使用的框架是百度开源的PaddleMobile。在本章中,笔者将会介绍使用腾讯的开源手机深度学习框架ncnn来实现在Android手机实现图像分类,这个框架开源时间比较长,相对稳定很多。 ncnn的GitHub地址:https://github.com/Tencent/ncnn 使用Ubuntu编译ncnn库 1、首先要下载和解压NDK。 wget https://dl.google.com/android/repository/android-ndk-r17b-linux-x86_64.zip unzip android-ndk-r17b-linux-x86_64.zip 2、设置NDK环境变量,目录是NDK的解压目录。 export NDK_ROOT="/home/test/paddlepaddle/android-ndk-r17b" 设置好之后,可以使用以下的命令查看配置情况。 root@test:/home/test/paddlepaddle# echo $NDK_ROOT /hom......
前言 在之前笔者有介绍过《在Android设备上使用PaddleMobile实现图像分类》,使用的框架是百度开源的PaddleMobile。在本章中,笔者将会介绍使用小米的开源手机深度学习框架MACE来实现在Android手机实现图像分类。 MACE的GitHub地址:https://github.com/XiaoMi/mace 编译MACE库和模型 编译MACE库和模型有两种方式,一种是在Ubuntu本地上编译,另一种是使用docker编译。下面就介绍使用这两种编译方式。 使用Ubuntu编译 使用Ubuntu编译源码比较麻烦的是就要自己配置环境,所以下面我们就来配置一下环境。以下是官方给出的环境依赖: 所需依赖 SoftwareInstallation commandTested version Python 2.7 Bazelbazel installation guide0.13.0 CMakeapt-get install cmake>= 3.11.3 Jinja2pip install -I jinja2==2.102.10 PyYamlpip install....
前言 有不少开发者在学习深度学习框架的时候会开源一些训练好的模型,我们可以使用这些模型来运用到我们自己的项目中。如果使用的是同一个深度学习框架,那就很方便,可以直接使用,但是如果时不同深度学习框架,我们就要对模型转换一下。下面我们就介绍如何把Caffe的模型转换成PaddlePaddle的Fluid模型。 环境准备 在线安装最新发布的PaddlePaddle,可以使用pip命令直接在线安装PaddlePaddle。 pip install paddlepaddle 下在安装最新的PaddlePaddle,可以在下面选择适合自己PaddlePaddle的版本,这里下载的是最新编译得到的,然后使用pip命令安装。 http://www.paddlepaddle.org/documentation/docs/zh/0.14.0/new_docs/beginners_guide/install/install_doc.html#id26 克隆PaddlePaddle下的models源码。 git clone https://github.com/PaddlePaddle/mod....
前言 本文章我们来学习一下使用PaddlePaddle实现人脸对比和人脸识别,使用的训练数据集是CASIA-WebFace。 数据集介绍 我们使用的是CASIA-WebFace数据集,该人脸数据集是目前最大的公开人脸数据集。该人脸数据集一共有包含10,575个人,494,414张图像,包含彩色图和灰图。各大人脸数据集情况如下表。 DatasetSubjectsImagesAvailability LFW [1]5,74913,233Public WDRef [2]2,99599,773Public (feature only) CelebFaces [3]10,177202,599Private SFC [4]4,0304,400,000Private CACD [5]2,000163,446Public (partial annotated) CASIA-WebFace10,575494,414Public 训练模型 为了方便读取数据集,我们要生成一个图像列表,用于训练时读取数据,这个列表的作用具体可以阅读笔者之前的文章《我的PaddlePaddle学习之路》笔记四——自....
前言 现在越来越多的手机要使用到深度学习了,比如一些图像分类,目标检测,风格迁移等等,之前都是把数据提交给服务器完成的。但是提交给服务器有几点不好,首先是速度问题,图片上传到服务器需要时间,客户端接收结果也需要时间,这一来回就占用了一大半的时间,会使得整体的预测速度都变慢了,再且现在手机的性能不断提高,足以做深度学习的预测。其二是隐私问题,如果只是在本地预测,那么用户根本就不用上传图片,安全性也大大提高了。现在的手机深度学习会计有很多,比如百度的paddle-mobile、小米的MACNE、腾讯的NCNN、谷歌的TensorFlow lite,而我们在本章使用的是百度的paddle-mobile。 PaddleMobile的GitHub地址:https://github.com/PaddlePaddle/paddle-mobile 编译paddle-mobile库 想要使用paddle-mobile,就要编译Android能够使用的CPP库,在这一部分中,我们介绍两种编译Android的paddle-mobile库,分别是使用Docker编译paddle-mobile库、使用Ubunt....
前言 在本篇文章中,我们将会介绍TensorFlow的安装,TensorFlow是Google公司在2015年11月9日开源的一个深度学习框架。 官网文档地址为:https://www.tensorflow.org/ 官方GitHub仓库:https://github.com/tensorflow/tensorflow TensorFlow目前支持4种开发语言,分别是Python(包括Python2和Python3)、Java、Go、C。笔者使用的环境如下: 开发语言:Python 3.6 使用操作系统:Ubuntu 16.04、Windows 10 硬件环境:CPU 基于这些环境,我们来安装TensorFlow吧,笔者将会通过两种操作系统来安装,分别是Ubuntu 16.04和Windows 10。 Ubuntu下安装TensorFlow 在Ubuntu上我们准备两种安装方式,分别是原生pip、Virtualenv 环境 和 Docker容器,下面我们就在三个环境下安装。 原生pip安装TensorFlow 使用原生的pip安装时最简单的,直接安装使用一条命令就可以安装完成了....
前言 在本章中,我们一起来学习下TensorFlow。我们将会学习到TensorFlow的一些基本库。通过计算一个线性函数来熟悉这些库。最后还学习使用TensorFlow搭建一个神经网络来识别手势。本章用到的一些库在这里下载。 TensorFlow的基本库 首先是导入所需的库,其中最重要的库就是tensorflow的,我们给它一个别名tf。 import math import numpy as np import h5py import tensorflow as tf from tensorflow.python.framework import ops from tf_utils import load_dataset, random_mini_batches, convert_to_one_hot, predict 下面我们使用TensorFlow计算一个损失函数,损失函数公式如下: $$ loss = \mathcal{L}(\hat{y}, y) = (\hat y^{(i)} - y^{(i)})^2 \tag{1} $$ 首先定义两个变量,对应是公式的y帽和y,如下,.....
前言 反向传播计算梯度$\frac{\partial J}{\partial \theta}$, $\theta$表示模型的参数。 $J$是使用正向传播和损失函数来计算的。 计算公式如下: $$ \frac{\partial J}{\partial \theta} = \lim_{\varepsilon \to 0} \frac{J(\theta + \varepsilon) - J(\theta - \varepsilon)}{2 \varepsilon} \tag{1} $$ 因为向前传播相对容易实现,所以比较容易获得正确的结果,确定要计算成本$J$ 正确。因此,可以通过计算$J$ 验证计算$\frac{\partial J}{\partial \theta}$ 。 一维梯度检查 一维线性函数$J(\theta) = \theta x$。该模型只包含一个实值参数$\theta$,并采取x作为输入。 一维线性模型 上图显示了关键的计算步骤:首先从开始$x$,然后评估该功能 $J(x)$(“前向传播”)。然后计算导数 $\frac{\partial J}{\partial \thet.....
前言 如果训练数据集不够大,由于深度学习模型具有非常大的灵活性和容量,以至于过度拟合可能是一个严重的问题,为了解决这个问题,引入了正则化的这个方法。要在神经网络中加入正则化,除了在激活层中加入正则函数,应该dropout也是可以起到正则的效果。我们来试试吧。 前提工作 在使用之前,我们还要先导入所需的依赖包,和加载数据,其中有些依赖包可以在这里下载。 # coding=utf-8 import matplotlib.pyplot as plt from reg_utils import compute_cost, predict, forward_propagation, backward_propagation, update_parameters from reg_utils import sigmoid, relu, initialize_parameters, load_2D_dataset from testCases import * # 加载数据 train_X, train_Y, test_X, test_Y = load_2D_dataset() 以下就是我们使用到.....
前言 良好的初始化权重有以下的好处: 加快梯度下降的收敛速度 增加梯度下降收敛到较低训练(和泛化)错误的几率 所以一个良好的初始化也是非常重要的,这里尝试三种初始化化方式: 零初始化,将权重参数初始化为零。 随机初始化,使用随机的方式,初始化权重参数。 He初始化,这个公式的初始化方式。 我们来尝试这个三种方法吧。 模型函数 编写一个 model函数,使用这个函数可以测试各种初始化权重参数的效果。 在编写 model函数之前,我们先要导入对于依赖包,其中有些依赖包可以在这里下载。 # coding=utf-8 import numpy as np from init_utils import compute_loss, forward_propagation, backward_propagation from init_utils import update_parameters, predict, load_dataset # 加载图像数据集:蓝色/红点在圆圈中 train_X, train_Y, test_X, test_Y = load_dataset() 其中使用的....
深度学习的实践方面 如果有10,000,000个例子,数据集拆分一般是98%训练,1%验证,1%测试。 验证和测试的数据集通常是来自同样的分配。 如果神经网络模型有很大的差异,一般的解决办法是增加数据集和添加正则。 当训练集错误较小,而验证集较大时,通常是增加正则lambda、增加数据集。 当增加正则化超参数lambda时,权重会被推向更小,接近0. 将参数keep_prob从(比如说)0.5增加到0.6可能会导致减少正则效应、最终导致更小的训练集数据的错误。 增加训练集、添加Dropout、加正则可以减少方差(减少过度拟合)。 权重衰减是一种正则化技术(如L2正规化), 导致梯度下降在每次迭代中收缩权重。 我们归一化输入的X,是因为这个可以使得损失函数更快地进行优化。 在测试使用反向dropout方法时,不要使用dropout(不要使用随机消除单位),也不要在训练中使用计算中保留的1/keep_prob因子。 优化算法 当输入是来自第8个小批次的第7个示例时,表示第3层的激活的符合是:$a^{[3]{8}(7)}$。 小批量梯度下降(在单个小批量上计算)的一次迭代比批量梯度下降.......
前言 有时候我们需要一些网络数据来工作、学习,比如我们做深度学习的。当做一个分类任务时,需要大量的图像数据,这个图像数据如果要人工一个个下载的,这很明显不合理的,这是就要用到爬虫程序。使用爬虫程序帮我们下载所需要的图像。那么我们就开始学习爬虫吧。 爬虫的框架 整体框架 下图是爬虫的整体框架,其中包括调度端、URL管理器、网页下载器、网页解析器、价值数据,它们的作用如下: 调度端:主要是调用URL管理器、网页下载器、网页解析器,也设置爬虫的入口; URL管理器:管理要爬网页的URL,添加新的URL,标记已爬过的URL,获取要爬的URL; 网页下载器:通过URL下载网页数据,并以字符串保存; 网页解析器:解析网页下载器获取到的字符串数据,获取用户需要的数据; 价值数据:所有有用的数据都存储在这里。 *图像来自慕课网课程 下图是爬虫的一个顺序图,从顺序图中可以看出调度器通过训练调用URL管理器、网页下载器、网页解析器来不断获取网络数据。 *图像来自慕课网课程 URL管理器 如图所示,URL管理器是负责管理要爬取网页的URL的。当有新的URL,就把新的URL添加到管理器中,在添加之前还有判......
前言 这次使用一个猫的数据集,我们使用深度神经网络来识别这个是猫或者不是猫。 导包 这里导入了两个工具类,可以从这里下载,这里包含了这个函数和用到的数据集,其中用到了h5py,如果读者没有安装的话,要先用pip安装这个库,还有以下用到的库也要安装。 # coding=utf-8 from dnn_utils_v2 import sigmoid, sigmoid_backward, relu, relu_backward from lr_utils import load_dataset import numpy as np import matplotlib.pyplot as plt import scipy from scipy import ndimage 初始化网络参数 在网络定义之前,需要先对网络的参数进行初始化,这里分两个来初始化,一个是两层网络的,另一个是L层网络的。 两层网络的初始化 对两层网络的参数初始化要用到输入层的大小、隐藏层的大小、输出层的大小。 def initialize_parameters(n_x, n_h, n_y): """ 初始化参数 :par......
前言 数据集是一个红色和蓝色的的分布。其分布图如下: 导包 导入依赖包,这个两个分别是加载数据的工具函数和数据集,这个两个程序可以在这里下载。这个工具函数中使用到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 -- 隐藏层的大小。。.......
前言 这里使用到的是一个猫的数据集,根据这个数据集训练图像是不是猫,数据集的图像如下: 导入包 如果没有安装对应的包,请使用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......
目录 @[toc] 深度学介绍 AI比喻新电是是因为AI就像大约100年前的电力一样,正在改变多个行业,如: 汽车行业,农业和供应链。 深度学习最近起飞的原因是:硬件的开发,特别是GPU的计算,是我们获得更多的计算能力;深度学习已在一些重要的领域应用,如广告,语音识别和图像识别等等;目前数字化的时代使得我们拥有更多的数据。 关于迭代不同ML思想的图: 这个思维图能够快速尝试想法,可以让深度学习工程师更快速地迭代自己的想法; 可以加快团队迭代一个主意的时间;深度学习算法的新进展使得我们能更好地训练模型,即使不改变CPU或者GPU硬件。 寻找模型的特征是获取良好性能的关键,虽然经验可以提供帮助,但是需要多次迭代来建立一个良好的模型。 ReLU激活函数的图表如下: 猫的识别是一个“非结构化”的数据例子;统计不同城市人口,人均GDP,经济增长的人口统计数据集是反映图像,音频或者文本数据集的“结构化”数据的一个例子。 为什么使用RNN(循环神经网络)作为机器翻译,这是因为RNN是一个可以被训练的监督学习的问题;RNN的输入和输出是一个序列,翻译就是从一种语言序列映射到另一种语言的序....