CNN和RNN的不同

在前面我们讲到了DNN,以及DNN的特例CNN的模型和前向反向传播算法,这些算法都是前向反馈的,模型的输出和模型本身没有关联关系。循环神经网络(Recurrent Neural Networks ,以下简称RNN)的输出和模型间有反馈,它广泛的用于自然语言处理中的语音识别,手写书别以及机器翻译等领域。

在前面讲到的DNN和CNN中,训练样本的输入和输出是比较的确定的。但是有一类问题DNN和CNN不好解决,就是训练样本输入是连续的序列,且序列的长短不一,比如基于时间的序列:一段段连续的语音,一段段连续的手写文字。这些序列比较长,且长度不一,比较难直接的拆分成一个个独立的样本来通过DNN/CNN进行训练。

而对于这类问题,RNN则比较的擅长。那么RNN是怎么做到的呢?RNN假设我们的样本是基于序列的。比如是从序列索引1到序列索引$\tau$的。对于这其中的任意序列索引号$t$,它对应的输入是对应的样本序列中的$x^{(t)}$。而模型在序列索引号$t$位置的隐藏状态$h^{(t)}$,则由$x^{(t)}$和在$t-1$位置的隐藏状态$h^{(t-1)}$共同决定。在任意序列索引号$t$,我们也有对应的模型预测输出$o^{(t)}$。通过预测输出$o^{(t)}$和训练序列真实输出$y^{(t)}$,以及损失函数$L^{(t)}$,我们就可以用DNN类似的方法来训练模型,接着用来预测测试序列中的一些位置的输出。

Recurrent Neural Networks(RNN)

阅读全文 »

在一般情况下,有人可能直接修改GRUB配置文件/boot/grub/grub.cfg,但使用sudu vim /boot/grub/grub.cfg发现提示这个是系统自动生成的文件,不建议直接编辑,而应该到/etc/grub.d/etc/default/grub去修改。

/etc/grub.d是操作系统菜单目录,一般由系统生成,我们无需修改,接下来就是修改/etc/default/grub文件了。使用sudo vim /etc/default/grub命令打开该配置文件。

1
sudo vim /etc/default/grub

其中的GRUB_DEFAULT=0就是设置的默认启动项了。GRUB启动项是按照启动菜单依次使用数字进行索引了,起始数字为0。结合前面的系统启动菜单,我们可以看到,Windows8的启动项在第5项,因此这里我们就需要修改为4(因为第一项是从0开始的)。

1
sudo update-grub

优化与深度学习

优化与深度学习的关系

虽然优化为深度学习提供了最小化损失函数的方法,但本质上,优化与深度学习的目标是有区别的。因为有训练误差和泛化误差的区别,而优化算法的目标函数通常是一个基于训练数据集的损失函数,优化的目标在于降低训练误差。而深度学习的目标在于降低泛化误差。为了降低泛化误差,除了使用优化算法降低训练误差以外,还需要注意应对过拟合。

本文中,我们只关注优化算法在最小化目标函数上的表现,而不关注模型的泛化误差。

优化在深度学习中的挑战

阅读全文 »

使用以下命令安装plasma-nm, 因为命令 ‘kde5-nm-connection-editor’ 来自于包 ‘plasma-nm’ (universe)

1
sudo apt-get install plasma-nm

打开kde5-nm-connection-editor

1
kde5-nm-connection-editor

添加—>Wi-Fi(共享),按照如图编辑,特别注意模式设置为“接入点(Access Point)”,因为这个才是android手机可识别的

阅读全文 »

安装codeblocks

1
sudo add-apt-repository ppa:damien-moore/codeblocks-stable

输入密码后,会提示你敲【Enter】继续,然后如果一切OK的话,就会安装好这个ppa源。
继续敲:

1
sudo apt-get update

对源进行更新,这个过程会下载一些东西,请保持网络畅通。最后,开始安装:

1
sudo apt-get install codeblocks

OK了,只要网络不出问题,就大功告成,CodeBlocks就会顺利安装完成!
剩下要做的就是把快捷方式拽到启动器上方便打开就行了。

阅读全文 »

准备知识

PPA,英文全称为 Personal Package Archives,即个人软件包档案。是 Ubuntu Launchpad 网站提供的一项源服务,允许个人用户上传软件源代码,通过 Launchpad 进行编译并发布为二进制软件包,作为 apt / 新立得(Synaptic)源供其他用户下载和更新。

PPA 的一般形式是: ppa:user/ppa-name

添加 PPA 源

添加 PPA 源的命令为

1
sudo add-apt-repository ppa:user/ppa-name

阅读全文 »

Python产生随机数的功能在random模块中实现,实现了各种分布的伪随机数生成器

该模块可以生成0到1的浮点随机数,也可以在一个序列中进行随机选择,产生的随机数可以是均匀分布,高斯分布,对数正态分布,负指数分布以及alpha,beta分布,但是呢,这些随机数不适合使用在以加密为目的的应用中

你也可以自己派生一个Random类的子类,自己去实现子类中的random(),seed(),getstate(),setstate()函数,一个新的产生器可以提供一个getrandbits()方法,这允许randrange()产生任意范围的随机数

警告:

这个模块中的随机数是伪随机数,不能应用于安全加密,如果你需要一个真正的密码安全随机数,你需要使用os.urandom()或者random模块中的SystemRandom类来实现

阅读全文 »

简介

目标:反向传播是利用链式法则递归计算表达式的梯度的方法。理解反向传播过程及其精妙之处,对于理解、实现、设计和调试神经网络非常关键

问题陈述:这节的核心问题是:给定函数$f(x)$ ,其中$x$是输入数据的向量,需要计算函数$f$关于$x$的梯度,也就是$\nabla f(x)$。

目标:之所以关注上述问题,是因为在神经网络中$f$对应的是损失函数$(L)$,输入$x$里面包含训练数据和神经网络的权重。举个例子,损失函数可以是SVM的损失函数,输入则包含了训练数据$(x_i,y_i),i=1…N$、权重$W$和偏差$b$。注意训练集是给定的(在机器学习中通常都是这样),而权重是可以控制的变量。因此,即使能用反向传播计算输入数据$x_i$上的梯度,但在实践为了进行参数更新,通常也只计算参数(比如$W,b$)的梯度。然而$x_i$的梯度有时仍然是有用的:比如将神经网络所做的事情可视化便于直观理解的时候,就能用上。

简单表达式和理解梯度

阅读全文 »

残差网络

1. 神经网络越深越好么?

2014年,GoogleNet和VGGNet在当年的ILSVRC中各自使用深度卷积神经网络取得了优异的成绩,并在分类错误率上优于2012年AlexNet数个百分点。两种结构相较于AlexNet,继续选择了增加网络复杂程度的策略来增强网络的特征表示能力。2015年,何凯明等人使用残差网络ResNet参加了当年的ILSVRC,在图像分类、目标检测等任务中的表现大幅超越前一年的比赛的性能水准,并最终取得冠军。残差网络的明显特征是有着相当深的深度,从32层到152层,其深度远远超过了之前提出的深度网络结构,而后又针对小数据设计了1001层的网络结构。残差网络ResNet的深度惊人,极其深的深度使该网络拥有极强大的表达能力。
因此,可以明显发现,网络的表达能力是随着网络深度的增加而增强的。何恺明等人的实验也证明,时间复杂度相同的两种网络结构,深度较深的网络性能会有相对的提升。

He, Kaiming, and Jian Sun. “Convolutional neural networks at constrained time cost.” Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2015.

然而,网络并非越深越好。计算代价很会大,在网络深度较深时,继续增加层数并不能提高性能,很有可能导致不收敛问题,虽然有一些方法可以弥补,如归一初始化,各层输入归一化,使得可以收敛的网络的深度提升为原来的十倍。然而,虽然收敛了,但网络却开始退化了,即增加网络层数却导致更大的误差,如图1所示。可以看到,在“平整”网络(与本文所介绍的残差网络复杂程度相同,但未使用残差结构的网络)中,随着网络层数的增加,其性能不但没有提升,反而出现了显著的退化。由于训练误差也随着层数增加而提升,所以这个现象可能并非参数的增加造成的过拟合;此外,这个网络在训练时也使用了ReLU激活、BN等手段,一定程度上缓解了梯度消失,这个现象可能也并非完全由梯度消失造成的。这个问题仍有待理论层面的研究和解决。

            图1使用Cifar-10数据集对“平整”网络进行训练和测试对应的误差
那么没有办法让网络更深了吗?假设上面的实验场景中,多增加的26层全部为单位映射,那么完全可以认为不会产生性能的损失。当然实际应用中这样做是没有意义的,但如果增加的层可以近似为单位映射,或者增加了些许扰动的单位映射,那么就有可能实现上述假设。在这一思路的引导下,深度残差学习(Deep Residual Learning)应运而生。

阅读全文 »

多项式拟合范例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import matplotlib.pyplot as plt
import numpy as np
#潘海东,2014/1/13
x = np.arange(1, 17, 1)
y = np.array([4.00, 6.40, 8.00, 8.80, 9.22, 9.50, 9.70, 9.86, 10.00, 10.20, 10.32, 10.42, 10.50, 10.55, 10.58, 10.60])
z1 = np.polyfit(x, y, 3)#用3次多项式拟合
p1 = np.poly1d(z1)
print(p1) #在屏幕上打印拟合多项式
yvals=p1(x)#也可以使用yvals=np.polyval(z1,x)
plot1=plt.plot(x, y, '*',label='original values')
plot2=plt.plot(x, yvals, 'r',label='polyfit values')
plt.xlabel('x axis')
plt.ylabel('y axis')
plt.legend(loc=4)#指定legend的位置,读者可以自己help它的用法
plt.title('polyfitting')
plt.show()
plt.savefig('p1.png')

python曲线拟合

指定函数拟合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#潘海东,2014/1/13
#使用非线性最小二乘法拟合
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
import numpy as np
#用指数形式来拟合
x = np.arange(1, 17, 1)
y = np.array([4.00, 6.40, 8.00, 8.80, 9.22, 9.50, 9.70, 9.86, 10.00, 10.20, 10.32, 10.42, 10.50, 10.55, 10.58, 10.60])
def func(x,a,b):
return a*np.exp(b/x)
popt, pcov = curve_fit(func, x, y)
a=popt[0]#popt里面是拟合系数,读者可以自己help其用法
b=popt[1]
yvals=func(x,a,b)
plot1=plt.plot(x, y, '*',label='original values')
plot2=plt.plot(x, yvals, 'r',label='curve_fit values')
plt.xlabel('x axis')
plt.ylabel('y axis')
plt.legend(loc=4)#指定legend的位置,读者可以自己help它的用法
plt.title('curve_fit')
plt.show()
plt.savefig('p2.png')
阅读全文 »