Makefile 文件的编写

学习前的准备

GCC、GDB、Makefile

  • gcc编译器可以将C、C++等语言源程序、汇编程序编译、链接成可执行程序。
  • gdb是 GNU 开发的一个Unix/Linux下强大的程序调试工具。
  • gcc可以按照Makefile内容对C语言进行批量编译

GCC简介

阅读全文 »

1. Makefile 简介

Makefile 是和 make 命令一起配合使用的.

很多大型项目的编译都是通过 Makefile 来组织的, 如果没有 Makefile, 那很多项目中各种库和代码之间的依赖关系不知会多复杂.

Makefile的组织流程的能力如此之强, 不仅可以用来编译项目, 还可以用来组织我们平时的一些日常操作. 这个需要大家发挥自己的想象力.

本篇博客是基于 {精华} 跟我一起写 Makefile 而整理的, 有些删减, 追加了一些示例.

阅读全文 »

常见的压缩方式

jpg、png等
以手机中照片为例:格式为jpg,大小为3000x4000,则存储需要的字节为

这里的乘以3表示有三通道,乘以8表示每一个像素点占用8位,除以8即为占用的字节,除以1024为kb,再除以1024为MB。

约为34.3M,但是手机中只占用了2.47M,这就是使用算法进行了压缩。即拍完照片手机按照某种算法进行编码并进行编码,当使用图像查看器查看图片的时候,首先进行读取图片,接着使用内嵌在图像查看器的解码方法进行解码,还原出4000x3000的像素并展示。

常见的压缩算法流程

阅读全文 »

Tensorflow支持基于cuda内核与cudnn的GPU加速,Keras出现较晚,为Tensorflow的高层框架,由于Keras使用的方便性与很好的延展性,之后更是作为Tensorflow的官方指定第三方支持开源框架。但两者在使用GPU时都有一个特点,就是默认为全占满模式。在训练的情况下,特别是分步训练时会导致显存溢出,导致程序崩溃。可以使用自适应配置来调整显存的使用情况。

Tensorflow

指定显卡

代码中加入

1
2
3
4
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "0"
# os.environ["CUDA_VISIBLE_DEVICES"]='6, 7'
print('CUDA Device: ' + os.environ["CUDA_VISIBLE_DEVICES"])
阅读全文 »

Ubuntu16.04配置

更改Ubuntu源

所谓源,可以理解为Ubuntu从何处下载软件。默认的源是server for china,个人测试这是从美国的服务器下载软件进行安装的,为了加快下载安装软件的速度,我们通常把软件源更改为国内的服务器。

打开软件中心,找到Software&Updates:

阅读全文 »

一般地,CNN的基本结构包括两层,其一为特征提取层,每个神经元的输入与前一层的局部接受域相连,并提取该局部的特征。一旦该局部特征被提取后,它与其它特征间的位置关系也随之确定下来;其二是特征映射层,网络的每个计算层由多个特征映射组成,每个特征映射是一个平面,平面上所有神经元的权值相等。特征映射结构采用影响函数核小的sigmoid函数作为卷积网络的激活函数,使得特征映射具有位移不变性。此外,由于一个映射面上的神经元共享权值,因而减少了网络自由参数的个数。卷积神经网络中的每一个卷积层都紧跟着一个用来求局部平均与二次提取的计算层,这种特有的两次特征提取结构减小了特征分辨率。

CNN主要用来识别位移、缩放及其他形式扭曲不变性的二维图形。由于CNN的特征检测层通过训练数据进行学习,所以在使用CNN时,避免了显式的特征抽取,而隐式地从训练数据中进行学习;再者由于同一特征映射面上的神经元权值相同,所以网络可以并行学习,这也是卷积网络相对于神经元彼此相连网络的一大优势。卷积神经网络以其局部权值共享的特殊结构在语音识别和图像处理方面有着独特的优越性,其布局更接近于实际的生物神经网络,权值共享降低了网络的复杂性,特别是多维输入向量的图像可以直接输入网络这一特点避免了特征提取和分类过程中数据重建的复杂度。

卷积

对于1维的卷积,公式(离散)与计算过程(连续)如下,要记住的是其中一个函数(原函数或者卷积函数)在卷积前要翻转180度。

阅读全文 »

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

Python安装包应该是一件很简单的事情,但是因为部分安装包太高版本已经不支持Python2了,所以这里记录一下。

pip指令

pip指定路径安装:

1
sudo pip3 install -U ipython --target=/usr/local/lib/python3.5/dist-packages

upgrade pip:

阅读全文 »

优化与深度学习

优化与深度学习的关系

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

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

优化在深度学习中的挑战

阅读全文 »