本文适合于对机器学习和数据挖掘有所了解,想深入研究深度学习的读者
1.对概率基本概率有所了解
2.具有微积分和线性代数的基本知识
3.有一定的编程基础(Python)

Java软件研发工程师转行之深度学习进阶:算法与应用

  • 1 绪论
  • 2 监督学习(Supervised Learning)-分类(Classification)
    • 2.1 基本概念(Basic Concepts)
      • 2.1.1 什么是深度学习?
      • 2.1.2 深度学习是什么时间段发展起来的?
      • 2.1.3 深度学习能用来干什么?
      • 2.1.4 深度学习目前有哪些代表性的研究机构?
      • 2.1.5 深度学习范畴
    • 2.2 神经网络算法(Neural Network)
      • 2.2.1 人脑识别图像
      • 2.2.2 手写数字识别
      • 2.2.3 随机梯度下降算法
      • 2.2.4 神经网络识别手写数字
      • 2.2.5 基于机器学习手写数字识别
        • 第一种 基于灰度值手写数字识别
        • 第二种 基于SVM手写数字识别
      • 2.2.6 Backpropagation算法
    • 2.3 梯度下降(Gradient Descent)
    • 2.4 卷积神经网络(Convolutional Neural Network)
      • 人脸识别
    • 2.5 深度卷积神经网络(Deep Convolutional Neural Network)
      • 视频分类
  • 3 非监督学习(Unsupervised Learning)
    • 3.1 限制波尔兹曼机(Restricted Boltzman Machine)
      • 图像与文字特征合并应用对图像分类
    • 3.2 自动编码(Autoencoder)
      • 图像中的物体识别
    • 3.3 深度信念网络(Deep Belief Network)
      • 猫狗分类
  • 4 小结

1 绪论

  1. 理解深度学习常用模型的算法
  2. 学会应用深度学习库(TheanoPyleanrn2
  3. 学会使用深度学习的方法根据数据集训练模型并开发应用
  4. 基于深度学习的方法对手写数字图片进行自动识别
  5. 基于深度学习的方法自动生成自然的符合逻辑的语句

2 监督学习(Supervised Learning)-分类(Classification)

2.1 基本概念(Basic Concepts)

2.1.1 什么是深度学习?

  • 深度学习是基于机器学习延申出来的一个新的领域,以人脑结构为启发的神经网络算法为起源,加之模型结构深度的增加发展,并伴随着大数据和计算能力的提高而产生的一系列算法。

2.1.2 深度学习是什么时间段发展起来的?

  • 由著名科学家Hinton等人在2006年和2007年于《Sciences》发表的文章被提出。

2.1.3 深度学习能用来干什么?

  • 深度学习作为机器学习延申出来的一个领域,被应用在图像处理与计算机视觉,自然语言处理及语音识别等领域
  • 2006年至今,学术界与工业界在深度学习方面的研究与应用,在以上领域取得了突破性进展。
  • ImageNet为数据库的经典图像中的物体识别竞赛为例,击败了所有传统算法,取得了前所未有的精确度。

2.1.4 深度学习目前有哪些代表性的研究机构?

  • 学术机构以多伦多大学、纽约大学、斯坦福大学为代表,工业界以GoogleFaceBook百度为代表走在深度学习研究与应用的前沿。
from sklearn.datasets import fetch_mldatamnist = fetch_mldata('MNIST original')
print mnist.data.shape

2.1.5 深度学习范畴

  • 深度学习的基本模型
  • 深度学习与机器学习

2.2 神经网络算法(Neural Network)

2.2.1 人脑识别图像


  • 深度学习识别图像
  • 计算机识别图像
  • 神经元
  • 实际模型更加复杂
  • 与非门可以模拟任何方程

  • Sigmoid神经元
  • 为了模拟更细微的变化,输入和输出值从01,到01之间任何数

2.2.2 手写数字识别

  • 假设识别一个手写数字图片
  • 如果图片是64*64,输入层总共有64*64=4096个神经元
  • 如果图片是28*28,输入层总共有28*28=784个神经元
  • 如果输出层只有一个神经元,大于0.9说明是9,小于0.5说明不是9
  • FeedForward Network:神经网络中没有环,信息单向前传递

  • 输入层:28*28=784个神经元
  • 每个神经元代表一个像素:0.0表示全白,1.0表示全黑
  • 一个隐藏层:n个神经元,图中有15
  • 输出层:10个神经元。分别代表手写数字识别可能的0-9数字。例如,第一个神经元(代表0)的输出值为1,其他的小于1,数字被识别为0
  • 训练集:6000张图片,用来训练
  • 测试集:1000张图片,用来测试准确率
  • x:训练输入,28*28=784d向量,每个值代表灰度图像的像素值
  • y=y(x)10d图像
  • 如果输入的某个图片是数字6,理想的输出:y(x)=(0,0,0,0,0,0,1,0,0,0)
  • 目标函数
  • 最小化问题可以用梯度下降解决(gradient descent)
  • C(v)中v有两个变量v1,v2
  • 通常可以用微积分解决,如果为v包含的变量过多,则无法用微积分解决
  • 一个变量的情况

2.2.3 随机梯度下降算法

  • 目标函数
  • 变化量
  • 以上三个公式推出
  • 设定
  • 所以C不断减小
  • 回顾目标函数
  • 权重和偏向更新方程
  • 一层神经网络结构
  • 两层神经网络结构:MLPMultiLayer Perceptions

2.2.4 神经网络识别手写数字

neural network and deep learning

  • 源代码地址:https://github.com/mnielsen/neural-networks-and-deep-learning
  • 两层神经网络核心代码
# coding=utf-8
import numpy as np
import randomclass Network(object):def __init__(self, sizes):"""构造函数:param sizes: 每层神经元的个数,net = Network([2,3,1])"""self.num_layers = len(sizes)self.sizes = sizes# np.random.randn(y, 1) 随机从正太分布(均值0,方差1)中生成self.biases = [np.random.randn(y, 1) for y in sizes[1:]]# weights[1]存储连接第二层和第三层的权重self.weights = [np.random.randn(x, y) for x, y in zip(sizes[:-1], sizes[1:])]def feedforward(self, a):"""return the output of the network if 'a' is input:param a::return:"""for b, w in zip(self.biases, self.weights):a = sigmoid(np.dot(w, a) + b)return adef SGD(self, training_data, epochs, mini_batch_size, eta, test_data=None):"""Train the neural network using mini-batch stochastic gradient descent.随机梯度下降算法:param training_data: 训练集training_data is a list of tuples "(x,y)" representing the training inputs and the desired outputs:param epochs: 迭代次数:param mini_batch_size: 每一小块包含多少个实例:param eta: 学习率:param test_data: 测试集:return:"""if test_data: n_test = len(test_data)n = len(training_data)for j in xrange(epochs):random.shuffle(training_data)  # 随机打乱mini_batches = [training_data[k:k + mini_batch_size]for k in xrange(0, n, mini_batch_size)]  # 从0到n,间隔为mini_batch_sizefor mini_batch in mini_batches:self.update_mini_batch(mini_batch, eta)if test_data:print "Epoch {0}: {1} / {2}".format(j, self.evaluate(test_data), n_test)else:print "Epoch {0} complete".format(j)def update_mini_batch(self, mini_batch, eta):"""Update the network's weights and biases by applying gradient descentusing back propagation to a single mini batch.:param mini_batch: list of tuples "(x,y)":param eta: learning rate:return:"""nabla_b = [np.zeros(b.shape) for b in self.biases]nabla_w = [np.zeros(w.shape) for w in self.weights]for x, y in mini_batch:delta_nabla_b, delta_nabla_w = self.backprop(x, y)nabla_b = [nb + dnb for nb, dnb in zip(nabla_b, delta_nabla_b)]nabla_w = [nw + dnw for nw, dnw in zip(nabla_w, delta_nabla_w)]self.weights = [w - (eta / len(mini_batch)) * nw for w, nw in zip(self.weights, nabla_w)]self.biases = [b - (eta / len(mini_batch)) * nb for b, nb in zip(self.biases, nabla_b)]# sizes = [2, 3, 1]
# print sizes[1:]
# bias = [np.random.randn(y, 1) for y in sizes[1:]]
# print bias
# for x, y in zip(sizes[:-1], sizes[1:]):
#     print (x, y)net = Network([2, 3, 1])
print net.num_layers
print net.sizes
print net.biases
print net.weights
  • Demo Application
# coding=utf-8
import mnist_loader  # 下载数据
import network  # 神经网络def main():"""training_data 训练集 50kvalidation_data 验证集 10ktest_data 测试集 10k"""training_data, validation_data, test_data = mnist_loader.load_data_wrapper()print 'training data'print 'type:', type(training_data)print 'len:', len(training_data)print training_data[0][0].shape  # 输入print training_data[0][1].shape  # 输出print 'validation_data'print 'len:', len(validation_data)print 'test_data'print 'len:', len(test_data)'''输入层:784个神经元隐藏层:30个神经元输出层:10个神经元training_data:训练集epochs:30 迭代次数mini_batch_size:10 每次训练实例个数eta:3.0 学习率test_data:测试集'''net = network.Network([784, 30, 10])net.SGD(training_data, 30, 10, 3.0, test_data=test_data)# net = network.Network([784, 100, 10])# net.SGD(training_data, 30, 10, 3.0, test_data=test_data)# net = network.Network([784, 10])# net.SGD(training_data, 30, 10, 3.0, test_data=test_data)if __name__ == '__main__':main()
  • 结果
  • 随着每一轮的迭代,手写数字识别的准确率大概在94.76%

2.2.5 基于机器学习手写数字识别

第一种 基于灰度值手写数字识别

  • 核心代码
from collections import defaultdict# My libraries
import mnist_loaderdef main():training_data, validation_data, test_data = mnist_loader.load_data()# training phase: compute the average darknesses for each digit,# based on the training dataavgs = avg_darknesses(training_data)# testing phase: see how many of the test images are classified# correctlynum_correct = sum(int(guess_digit(image, avgs) == digit)for image, digit in zip(test_data[0], test_data[1]))print "Baseline classifier using average darkness of image."print "%s of %s values correct." % (num_correct, len(test_data[1]))def avg_darknesses(training_data):""" Return a defaultdict whose keys are the digits 0 through 9.For each digit we compute a value which is the average darkness oftraining images containing that digit.  The darkness for anyparticular image is just the sum of the darknesses for each pixel."""digit_counts = defaultdict(int)darknesses = defaultdict(float)for image, digit in zip(training_data[0], training_data[1]):digit_counts[digit] += 1darknesses[digit] += sum(image)avgs = defaultdict(float)for digit, n in digit_counts.iteritems():avgs[digit] = darknesses[digit] / nreturn avgsdef guess_digit(image, avgs):"""Return the digit whose average darkness in the training data isclosest to the darkness of ``image``.  Note that ``avgs`` isassumed to be a defaultdict whose keys are 0...9, and whose valuesare the corresponding average darknesses across the training data."""darkness = sum(image)distances = {k: abs(v - darkness) for k, v in avgs.iteritems()}return min(distances, key=distances.get)if __name__ == "__main__":main()
  • 识别的准确率只有22.5%

第二种 基于SVM手写数字识别

  • 核心代码
def svm_baseline():training_data, validation_data, test_data = mnist_loader.load_data()# trainclf = svm.SVC()clf.fit(training_data[0], training_data[1])# testpredictions = [int(a) for a in clf.predict(test_data[0])]num_correct = sum(int(a == y) for a, y in zip(predictions, test_data[1]))print "Baseline classifier using an SVM."print "%s of %s values correct." % (num_correct, len(test_data[1]))if __name__ == "__main__":svm_baseline()
  • 识别的准确率只有32.5%

2.2.6 Backpropagation算法

  1. 通过迭代来处理训练集中的实例
  2. 对比经过神经网络后输入层预值(predict value)与真实值(target value)之间
  3. 反方向(从输出层 --> 隐藏层 --> 输入层
  4. 算法详细介绍
  • 输入:数据集,学习率(Learning Rate),一个多层前向神经网络
  • 输出:一个训练好的神经网络(a trained neural network
  • 初始化权重(weights)和偏向(bias):随机初始化到-1或者1之间,或者-0.5到0.5之间,每个单元都有一个偏向
  • 对于每一个训练实例X,执行以下步骤:

  • 根据误差反向传送
  • 终止条件:权重的更新低于某个阈值 预测的错误率低于某个阈值 达到一定的循环次数
  • Overfitting:在训练集上表现好,但是不能泛化到测试集,测试集表现差

2.3 梯度下降(Gradient Descent)

2.4 卷积神经网络(Convolutional Neural Network)

人脸识别

2.5 深度卷积神经网络(Deep Convolutional Neural Network)

视频分类

3 非监督学习(Unsupervised Learning)

3.1 限制波尔兹曼机(Restricted Boltzman Machine)

图像与文字特征合并应用对图像分类

3.2 自动编码(Autoencoder)

图像中的物体识别

3.3 深度信念网络(Deep Belief Network)

猫狗分类

4 小结

持续更新中. . .

Java软件研发工程师转行之深度学习(Deep Learning)进阶:手写数字识别+人脸识别+图像中物体分类+视频分类+图像与文字特征+猫狗分类相关推荐

  1. 深度学习(3)手写数字识别问题

    深度学习(3)手写数字识别问题 1. 问题归类 2. 数据集 3. Image 4. Input and Output 5. Regression VS Classification 6. Compu ...

  2. 深度学习(4)手写数字识别实战

    深度学习(4)手写数字识别实战 Step0. 数据及模型准备 1. X and Y(数据准备) 2. out=relu{relu{relu[X@W1+b1]@W2+b2}@W3+b3}out=relu ...

  3. 深度学习 卷积神经网络-Pytorch手写数字识别

    深度学习 卷积神经网络-Pytorch手写数字识别 一.前言 二.代码实现 2.1 引入依赖库 2.2 加载数据 2.3 数据分割 2.4 构造数据 2.5 迭代训练 三.测试数据 四.参考资料 一. ...

  4. Deep Learning之手写数字识别

    Chapter1:使用神经网络识别手写数字 前言 Perceptrons(感知机) Sigmoid neurons(sigmoid 神经元) The architecture of neural ne ...

  5. 深度学习——CNN实现MNIST手写数字的识别

    ​活动地址:CSDN21天学习挑战赛 目录 知识点介绍 MNIST 介绍 下载 数据的简单处理 CNN神经网络 CNN的作用 CNN的主要特征 CNN的神经网络结构 CNN的相关参数 MNIST识别的 ...

  6. 利用python卷积神经网络手写数字识别_Keras深度学习:卷积神经网络手写数字识别...

    引言:最近在闭关学习中,由于多久没有写博客了,今天给大家带来学习的一些内容,还在学习神经网络的同学,跑一跑下面的代码,给你一些自信吧!Nice 奥里给! 正文:首先该impor的库就不多说了,不会的就 ...

  7. 【深度学习Deep Learning】资料大全

    感谢关注天善智能,走好数据之路↑↑↑ 欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答.求职一站式搞定! 对商业智能BI.大数据分析挖掘.机器学习, ...

  8. 机器学习(Machine Learning)深度学习(Deep Learning)资料汇总

    本文来源:https://github.com/ty4z2008/Qix/blob/master/dl.md 机器学习(Machine Learning)&深度学习(Deep Learning ...

  9. 机器学习(Machine Learning)深度学习(Deep Learning)资料【转】

    转自:机器学习(Machine Learning)&深度学习(Deep Learning)资料 <Brief History of Machine Learning> 介绍:这是一 ...

最新文章

  1. Blender+SP+UE5游戏艺术工作流程学习
  2. 可变数组集合ArrayList
  3. 【奥运代表团加油】ABAP字符处理杂例
  4. VLC测试IPv4 IGMP/IPv6 MLD协议
  5. 取余运算怎么算_c语言中的基本运算其一!
  6. 四十五岁了,存款三十万,是放手一搏,还是安于现状?
  7. Java导出导入Excel方法
  8. ipad iphone开发_如何通过Chromecast观看iPhone / iPad视频?
  9. H2单元测试数据库使用调研
  10. Mac如何读写NTFS硬盘,NTFSTool让Mac也可以轻松读写NTFS硬盘
  11. 使用cocoapods导入第三方后 报错_OBJC_CLASS_$_XXX
  12. 用C++制作一款电话簿
  13. linux fping命令使用
  14. 正定矩阵的相关性质,凸锥
  15. 小猫爪:汽车电子小知识02- ISO14229-1(UDS)简介
  16. 检查 Windows 版本与 Windows 更新
  17. 51nod-The Captain
  18. 爬虫Scrapy安装笔记
  19. python学生数据完善程序_「Python」每日一练:学生数据完善程序
  20. flinkx 部署,on yarn模式运行

热门文章

  1. 【可持久化线段树?!】rope史上最全详解
  2. 为什么做Web开发要选择PHP
  3. Exchange环境搭建心得
  4. 正则表达式。部分实例及说明(摘)
  5. 2010 February
  6. 聊聊我对黑客技术的思考
  7. 拾取物品怎么实现_Dynamo如何实现图层的效果
  8. 2008 mysql 本地安全_如何在Linux系统中建立mysql的本地安全机制?
  9. cpu功耗排行_2020 主流手机处理器排行榜
  10. java 索取了多表联合查询分页,mybatis-plus多表联合分页查询