一、本学期的的总结:
本学期从第一个网络LeNet写起,到AlexNet,再到VGG16。期间使用LeNet做了手写数字识别,使用AlexNet做了猫狗大战的分类。
卷积神经网络的基本单元:
卷积层、Kernel-size、Zero-padding、池化层、非线性激活函数
、全连接层
LetNet网络结构:
AlexNet网络结构:
Vgg网络结构:
RestNet网络结构:
具体实现代码在仓库:
https://coding.net/u/Qinxianshen/p/Tensorflow-Learning/git?public=true
二、自己对机器学习的理解:
我在念高中期间,做了不少题目的。会通过刷题目,总结一类题目的解法,以后遇到这类题目,就用这个“套路”去解决。这其实就说明了一种学习方式,从特殊到抽象一般规律,再用一般规律去解决特殊问题。这种从一般到特殊的过程,被称为“泛化”,而从一般到特殊的过程,被称为“演绎”。
我们可以通过这个例子来理解机器学习,在做的事情。机器学习,顾名思义。也就是让机器去学习。这其实是一个研究“学习”的过程。通过,让机器从一群数据中摸索,得出一个模型,当新的样本出现的时候,用这个模型,来解决问题。
对于人来说,我们可以从数据中得到一些规律,进而抽象出一些概念,发展出一门学科。这被称为“概念形成”,“概念学习”。但是,当数据的特征,属性太多的时候,人们往往很难得出概念,或者说概念无法被人类理解。举一个例子,我们可以很容易理解3维、4维空间的事物,在脑海中,可以很容易形成这些画面。但是随着维度的增加,我们就很难从脑海中想象了。
这里举一些例子,来理解接下来的概念。
首先,我们来问一个问题,“什么样的蘑菇是有毒的?”你可能会回答,“颜色太鲜艳的是有毒的”。很好,你提到了蘑菇的颜色。这个是蘑菇的一个特征(Feature),当然还有很多很多。味道,气味,触摸感等等。随着你的参考特征的增加,这个问题的研究维度就在不断的增加。我们把这些特征张成的空间称为“属性空间”或者“样本空间”,空间的维度与你研究这个问题选取的特征数有关。就如同,你在做平面几何的时候,参考的是x 和 y 两个坐标轴,那么x,y张成的空间是2维的,当你研究立体几何的时候,增加了z轴这个参考,4维的话,你可以加上时间轴。5维的话,根据你研究的问题,选取对应的特征。是有些抽象,可以停一下,再读下去。
好,我们继续。我们说过,学习的过程往往要从很多案例中学习,这一个个案例,被称为“样本”。假设我们有足够的案例,是否可以继续来研究“什么样的蘑菇是有毒的”这个问题呢?或许还不行,最好我们还能知道,每个案例的结果,也就是每个样本我都知道,哪些是有毒的,哪些是没有毒的。也就是样本的“标签”(Target)。而这些有标记信息的示例张成的空间被称为“标记空间”或者“输出空间”。我们把样本作为行,特征作为列,把这些例子写在一张表上。看看我们能不能从这张表中得出规律。不知道,看到这里你有没有注意到,这张表是不是和你学的矩阵很类似。其实潜移默化中,我们已经把问题转化成,在一个空间里寻找最优解的问题了。
“矩阵不仅仅是数字排列而成的表而已。比如M*N的矩阵A,它表示了从n维空间到m维空间的“映射”。具体来讲就是把n维空间中的点x(n维列向量)变换到m维空间的点(m维列向量)Ax的映射”。
上面这一段是节选自《程序员的数学》这一册书的第三本《线性代数》里的综述。我很建议大家读读这本书,对大家理解线性代数,有很大的帮助。矩阵的运算,可以理解为空间的变换。
回到我们的蘑菇,“什么样的蘑菇有毒?”实际上就是把众多的案例分类成“有毒”、“没毒”。这种问题被称为“分类”问题。而这个例子,只分成两类,那么就是“二分类”问题。
想象一下,这个问题就可以转化成,例子就是散落在一个高维空间的一个个点,你要用一个线或者超平面,去把这些点优雅地分开。
当然这个例子只是一个分类问题,因为我们预测的值是离散的,比如明天是阴天还是晴天。但是,当研究问题变成明天会是多少度。预测的值变成连续的,定量的,那么这就是一个回归问题。
当然这些问题都是,你已经知道了案例的结果而定的。如果说,你不知道“标签”,也就是Target时,怎么办?事实上,现实生活中,这样的例子挺多的。你事先不知道结果。这些数据,是否能够拿来学习呢?答案是可以的,我们可以分析,这些案例之间的特征相似度,把他们分成一个个组,或者叫做“簇类”。“物以类聚,人与群分”。这就是一个聚类的过程。
前者能够,知道标签的学习,被称为“监督学习”,没有标签的学习,被称为“非监督学习”。
上述理解是我本学期时写的一段理解,现在记录在此处:
https://www.bilibili.com/read/cv331390
三、使用深度学习做的一些小尝试:
(1)用机器学习算法实现简单图像分类
运行效果:
实现说明:
数据集:Kaggle 猫狗大战数据集合
地址:https://www.kaggle.com/c/dogs-vs-cats/data
PS:该数据集分为 train 和 test 两个文件夹 一共有25000张图片。由于数据集文件太大,就没有放到项目里了。
Logs文件夹:存放这训练的保存文件。每2000保存一次,我们训练的总次数10000次 所以保存了 2000 4000 6000 8000 9999步的训练模型。
主要代码:
input_data.py 文件:
用于数据处理和解析。get_files函数,对图片的路径进行切片,取出图片名字里的标签,猫和狗,给图片进行标签。并随机打乱。get_batch函数,对处理好的数据每次只取一定数量,我们是每次取出了64张。(根据电脑的不同,选择不同,内存如果大可以选择多一些)
model.py文件:
定义了网络的结构。具体网络结构写在后文。除了定义网络结构,还写了一些辅助的函数,方便训练时操作。losses,evaluation,trainning等。
train_and_val.py文件:
程序的入口。主要编写了training的函数,训练模型的函数。和随机从25000张图片里取出一张用模型进行检测。
网络结构:(该网络并非经典的letnet,alexnet,vgg16等等)
输入:
208*208 |
卷积:3*3 步长:1 输入通道:3 输出通道16 |
208*208 |
池化:3*3 步长:2 |
104*104 |
卷积:3*3 步长:1 输入通道:16 输出通道16 |
104*104 |
池化:3*3 步长:1 |
104*104 |
全连接 输入:104*104*16 输出128 |
全连接 输入:128 输出128 |
全连接 输入:128 输出2(分成2类) |
相关参数说明:
最终分类:2类(2分类问题,数据集可以拓展)
输入图片宽度:208
输入图片长度:208
训练集和测试集:8:2
每次取出64张图片进行训练。
分配程序内存:2000mb
训练次数:10000
学习率:0.0001
非线性函数:relu
正则化处理:lrn(虽然已经过时了,但是在这个简单的网络还是很适用的)
优化器:Adapoptimizer
拓展:
上述代码是二分类问题。手写数字识别可以实现多分类问题。
上述实验,我们在答辩的时候也有演示,使用的是Lenet网络。
具体代码已经存放在我们的代码仓库:
https://coding.net/u/Qinxianshen/p/Tensorflow-Learning/git?public=true
(2)使用Google开源的API 进行object detection:
使用前的准备工作:
https://www.zhihu.com/question/61173908
可以加入opencv 通过摄像头实时识别:
首先要加入opencv的库
sudo apt-get install opencv-python
调用官方的api的代码在 object-detection-change.py
参考了这个教程:
https://www.youtube.com/watch?v=COlbP62-B-U
四、本学期了解的其他有趣的案例:
1.RNN的通俗解释
http://blog.csdn.net/qq_39422642/article/details/78676567
2.机器学习如何用GPU实现优化
http://blog.csdn.net/Uwr44UOuQcNsUQb60zk2/article/details/79049210
3.使用Tensorflow RNN来写诗
https://github.com/hzy46/Char-RNN-TensorFlow
4.使用Tensorflow RNN来预测比特币的股价
https://gitee.com/fendouai/TensorFlow-Bitcoin-Robot
5.详细配置Caffe
http://blog.csdn.net/A_Z666666/article/details/72853346
6.Tensorflow1.7新特性
http://blog.csdn.net/dqcfkyqdxym3f8rb0/article/details/79572577
7.如何在ubuntu16.04安装TensorflowGPU
http://blog.csdn.net/qin_xian_shen/article/details/79574056
8.如何安装Ubuntu16.04
https://www.bilibili.com/video/av16053502/
9.Tensorflow入门经典教程(CNN RNN 等等)
https://github.com/aymericdamien/TensorFlow-Examples
10.Tensorflow物体识别
https://github.com/tensorflow/models/tree/master/research/object_detection
对应的中文教程:
https://www.zhihu.com/question/61173908
11.Tensorflow的生成艺术的模型: https://github.com/tensorflow/magenta/tree/master/magenta/models
12.Tensorflow音乐生成
(1)Google Magenta Github地址 https://github.com/tensorflow/magenta
(2)用Tensorflow创作曲子: https://github.com/llSourcell/Music_Generator_Demo
13.用Tensorflow画画
(1)Skatch RNN 论文地址: https://arxiv.org/pdf/1704.03477.pdf
(2)Skatch RNN Tensorflow官网的介绍: https://magenta.tensorflow.org/sketch_rnn
(3)Google Blog 对Skatch RNN的介绍: https://research.googleblog.com/2017/04/teaching-machines-to-draw.html
(4)Sketch RNN的notebook地址: https://github.com/tensorflow/magenta-demos/blob/master/jupyter-notebooks/Sketch_RNN.ipynb
(5)Quick Draw 感受一下这个画图的识别游戏: https://quickdraw.withgoogle.com/data