目录

夜雨飘零

记录精彩的程序人生

构建深度神经网络实现猫的二分类 有更新!

前言 这次使用一个猫的数据集,我们使用深度神经网络来识别这个是猫或者不是猫。 导包 这里导入了两个工具类,可以从这里下载,这里包含了这个函数和用到的数据集,其中用到了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......

Python2实现简单的爬虫 有更新!

前言 有时候我们需要一些网络数据来工作、学习,比如我们做深度学习的。当做一个分类任务时,需要大量的图像数据,这个图像数据如果要人工一个个下载的,这很明显不合理的,这是就要用到爬虫程序。使用爬虫程序帮我们下载所需要的图像。那么我们就开始学习爬虫吧。 爬虫的框架 整体框架 下图是爬虫的整体框架,其中包括调度端、URL管理器、网页下载器、网页解析器、价值数据,它们的作用如下: 调度端:主要是调用URL管理器、网页下载器、网页解析器,也设置爬虫的入口; URL管理器:管理要爬网页的URL,添加新的URL,标记已爬过的URL,获取要爬的URL; 网页下载器:通过URL下载网页数据,并以字符串保存; 网页解析器:解析网页下载器获取到的字符串数据,获取用户需要的数据; 价值数据:所有有用的数据都存储在这里。 *图像来自慕课网课程 下图是爬虫的一个顺序图,从顺序图中可以看出调度器通过训练调用URL管理器、网页下载器、网页解析器来不断获取网络数据。 *图像来自慕课网课程 URL管理器 如图所示,URL管理器是负责管理要爬取网页的URL的。当有新的URL,就把新的URL添加到管理器中,在添加之前还有判......

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

深度学习的实践方面 如果有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)}$。 小批量梯度下降(在单个小批量上计算)的一次迭代比批量梯度下降.......

深度学习神经网络中权重的初始化 有更新!

前言 良好的初始化权重有以下的好处: 加快梯度下降的收敛速度 增加梯度下降收敛到较低训练(和泛化)错误的几率 所以一个良好的初始化也是非常重要的,这里尝试三种初始化化方式: 零初始化,将权重参数初始化为零。 随机初始化,使用随机的方式,初始化权重参数。 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() 其中使用的....

深度学习神经网络中正则化的使用 有更新!

前言 如果训练数据集不够大,由于深度学习模型具有非常大的灵活性和容量,以至于过度拟合可能是一个严重的问题,为了解决这个问题,引入了正则化的这个方法。要在神经网络中加入正则化,除了在激活层中加入正则函数,应该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() 以下就是我们使用到.....

深度学习神经网络中的梯度检查 有更新!

前言 反向传播计算梯度$\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.....

Ubuntu安装和卸载CUDA和CUDNN 有更新!

前言 最近在学习PaddlePaddle在各个显卡驱动版本的安装和使用,所以同时也学习如何在Ubuntu安装和卸载CUDA和CUDNN,在学习过程中,顺便记录学习过程。在供大家学习的同时,也在加强自己的记忆。本文章以卸载CUDA 8.0 和 CUDNN 7.05 为例,以安装CUDA 10.0 和 CUDNN 7.4.2 为例。 安装显卡驱动 禁用nouveau驱动 sudo vim /etc/modprobe.d/blacklist.conf 在文本最后添加: blacklist nouveau options nouveau modeset=0 然后执行: sudo update-initramfs -u 重启后,执行以下命令,如果没有屏幕输出,说明禁用nouveau成功: lsmod | grep nouveau 下载驱动 官网下载地址:https://www.nvidia.cn/Download/index.aspx?lang=cn ,根据自己显卡的情况下载对应版本的显卡驱动,比如笔者的显卡是RTX2070: 下载完成之后会得到一个安装包,不同版本文件名可能不一样: ....

CentOS搭建云服务平台 有更新!

前言 最近在学习在centOS上搭建一个云服务平台,所以写下该文章当做笔者的学习笔记,提供给大家一起学习。虽然我们没有办法实现像百度云、腾讯云、阿里云那么强大的云服务平台,但是可以学习它们这些思维,做一个简单的云平台给自己的团队或公司使用。 创建主机 我们的云服务器平台的结构是这样的: 这个平台是在一个主机,然后在主机中创建多个虚拟机给用户使用,所以我们首先要有一个主机。这个主机理论上是真正的物理机,同时有着非常多的物理资源,比如内存,磁盘,CPU等等。为了学习,我们在VMware中创建一个机器当做我们的主机,使用的系统是CentOS6.5。我们先要下载这个镜像,笔者使用的镜像是CentOS-6.5-x86_64-minimal.iso这个镜像,其下载地址是:http://vault.centos.org/6.5/isos/x86_64/CentOS-6.5-x86_64-minimal.iso 。 我们在VMware创建一个新的虚拟机,操作如小: 然后选择经典模型开始创建: 接下来是选择第三个的稍后安装操作系统: 选择的系统类型是Linux,具体的是CentOS 64位: ....

在CentOS上使用Nginx和Tomcat搭建高可用高并发网站 有更新!

前言 本篇文章将介绍如何搭建使用Nginx和Tomcat的高可用高并发的网站,我们将会在CentOS系统上搭建这样一个网站后端。这个系统的架构如下: 虚拟IP地址:192.168.204.221 主虚拟服务器:192.168.204.121 备虚拟服务器:192.168.204.122 Nginx服务器1:192.168.204.123 Nginx服务器2:192.168.204.124 Tomcat服务器1:192.168.204.123 Tomcat服务器2:192.168.204.124 创建CentOS虚拟机 我们这次安装的虚拟机是CentOS迷你版,镜像为:CentOS-6.5-x86_64-minimal.iso,该镜像可以到这里下载:http://vault.centos.org/6.5/isos/x86_64/CentOS-6.5-x86_64-minimal.iso。参考笔者的这一篇文章CentOS搭建云服务平台的前半部分创建4个CentOS虚拟机,用来模仿后台的多个系统,要注意的是这篇文章CentOS搭建云服务平台安装的的桌面版,我们在本文章用的迷你版,但是安.......

初步了解TensorFlow 有更新!

前言 在本章中,我们一起来学习下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,如下,.....

CentOS下安装和使用Mycat实现分布式数据库 有更新!

前言 在笔者的《在CentOS上使用Nginx和Tomcat搭建高可用高并发网站》这篇文章中,笔者介绍了如何在CentOS上搭建一个可支持高可用高并发的Java web后端服务器。善于思考的读者可能会想到,在上一篇文章中,我们只是实现Java web服务器的分布式来应对高并发,但是高并发对数据库的的负担也是很重的。在上一篇文章中,我们只是使用到一个MySQL服务器,但是但数据量非常大的时候,比如有一千万的用户,如果只有单个数据库存储,那一张用户表就有一千万条数据。庞大的数据量使得我们对数据进行查询的时候非常慢,但出现高并发的时候,大量的查询请求发送到数据库服务器,而数据库来不及响应,随时可能出现数据库崩溃的情况。 面对这个问题,我们使用Mycat来实现分布式数据库,假设我们有两个数据库服务器,那么一千万条的数据分开来存储,这样每个数据库只有五百万条数据,可以大大提高查询速度。如果有更多的数据库服务器,那么每个数据库所需要存储的数据就更少了,查询速度就会更快。基于这一个问题,我们就来学习如何在CentOS下安装和使用Mycat实现分布式数据库。 分布式数据库的整体架构: 总体架构 我们.....

MySQL数据库实现主从复制 有更新!

前言 我们用的在这篇文章《在CentOS上使用Nginx和Tomcat搭建高可用高并发网站》使用的只有一个MySQL数据库。 从安全角度来说这是非常不安全的,比如这个数据库服务器磁盘突然损坏了,里面的数据全部丢失了。这种情况如果一开始只是部署一个数据库的话就非常危险了,这表明我们要丢失全部数据,而数据对网站来说是最最重要的,所以我们要保证数据的安全。 从性能上来说,我们在《CentOS下安装和使用Mycat实现分布式数据库》这篇文章中介绍了分布式数据库,性能虽然比单个数据库的性能要好。但是当使用分布式数据库时,数据量还是很大,在查询数据时,可能会变得非常慢,导致锁表,一旦锁表就无法写入数据,就会影响其他用户的写入数据的操做。所以就需要读写分离,主(master)数据库负责写入数据,从(slave)数据库负责查询数据,就算从(slave)数据库在查询数据时出现了锁表,也不会影响到主(master)数据库的的写入操作,最多也是从(slave)数据库的数据更新的慢一些。基于这种情况,就出现了主从复制这个技术。 **主从复制:**就是有两个数据库服务器,一个是主(master)数据库服务器......

Mycat中间件实现一主一从和双主双从的读写分离 有更新!

前言 笔者在《MySQL数据库实现主从复制》这一篇文章中有提到读写分离这个技术,这个技术时基于主从复制之后的一种技术。在数据库主从复制中,一个主数据库有一个或者多个从数据库,我们可以对主数据库进行写入操作(insert,delete,update),对一个或者多个从数据库进行读取操作(select)。这个的操作方式,就是大量的查询请求也会分布到各个从数据库上,达到负载均衡,比如3个从数据库,有9条查询请求,那么每一个从数据库只要处理3条查询请求就可以了,大大减少了数据库的查询压力。 在Mycat中,读写分离可以说有两种,一种是一主一从,另一种是一主多从。我们分别来介绍这两种方式: 一主一从: 是一个主数据库一个从数据库,如果我们对主数据库进行写入操作,那么从数据库也会执行相应的操作。笔者把一主多从也归为这种方式,因为一主多从其实也就是增加多几个从数据库而已,具体的结构每个变动太大。在一主一从中,最大的好处是实现了读写分离,在Mycat的调度下,把所有写的操作都是在主数据库中,把所有的读的操作都放在从数据库中。可能有读者可能会有疑问,这中读取分离也可以使用后端代码实现,为什么要使用Myc....

TensorFlow的安装 有更新!

前言 在本篇文章中,我们将会介绍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安装时最简单的,直接安装使用一条命令就可以安装完成了....

Android的单个或多个权限动态申请 有更新!

前言 在Android 6.0(API 级别 23)以下申请权限是非常简单的,直接在AndroidManifest.xml这个配置文件中加入申请权限的列表就可以了,比如我要申请四个权限,如下: <!--打电话--> <uses-permission android:name="android.permission.CALL_PHONE" /> <!--使用相机--> <uses-permission android:name="android.permission.CAMERA" /> <!--写入内存卡--> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!--读取内存卡--> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 但是在Android 6.0(API 级别 23)以.....

在Android手机上使用PaddleMobile实现图像分类 有更新!

前言 现在越来越多的手机要使用到深度学习了,比如一些图像分类,目标检测,风格迁移等等,之前都是把数据提交给服务器完成的。但是提交给服务器有几点不好,首先是速度问题,图片上传到服务器需要时间,客户端接收结果也需要时间,这一来回就占用了一大半的时间,会使得整体的预测速度都变慢了,再且现在手机的性能不断提高,足以做深度学习的预测。其二是隐私问题,如果只是在本地预测,那么用户根本就不用上传图片,安全性也大大提高了。现在的手机深度学习会计有很多,比如百度的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....

使用PaddlePaddle实现人脸对比和人脸识别 有更新!

前言 本文章我们来学习一下使用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学习之路》笔记四——自....

Caffe模型转PaddlePaddle的Fluid版本预测模型 有更新!

前言 有不少开发者在学习深度学习框架的时候会开源一些训练好的模型,我们可以使用这些模型来运用到我们自己的项目中。如果使用的是同一个深度学习框架,那就很方便,可以直接使用,但是如果时不同深度学习框架,我们就要对模型转换一下。下面我们就介绍如何把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....

在Android手机上使用MACE实现图像分类 有更新!

前言 在之前笔者有介绍过《在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....

在Android手机上使用腾讯的ncnn实现图像分类 有更新!

前言 在之前笔者有介绍过《在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......