深度学习入门

2020-03-27  本文已影响0人  陈道乐

一、应用场景

1.内容优化

根据用户习惯和当前热点推荐感兴趣的内容, 包含:游戏推荐列表优化, 广告内容优化, 活动列表优化等等。

2.环境监控

拦截反社会,不健康的评论, 包含: 语音内容,游戏评论。

3.安全和防护

在支付场景中的应用,包含:刷脸支付,语音登陆等

二、基础知识

首先先认识一下,人工智能、机器学习和深度学习者三者的关系,如下图。可以看出深度学习知识人工智能的子集。

image

目前深度学习在it领域应用的最成熟,目前可选的框架有google公司的tensorflow 和 facebook公司的pytorch。这两者的基础都源于神经网络学习, 神经网络学习具有很浅的自适应能力和容错能力。神经网络学习的模型源于生物。人脑大约包含 10的12次方神经,每个神经虽然都很简单,却能演化出复杂的行为方式。基础的结构如下图:

image

通过上述的结构演化出如下的人工神经元模型,它是对生物神经元的模拟和简化。 是一个多端输入,单输出的非线性结构。

image

上述结构转换成数学模型如下:

image

其中 Xj(j=1,2,....,n )是从其他神经元传递来的输入信号. Wji表示的时连接权值(权重),θ为阀值,f(*) 为激发函数。 通常情况下,将-θ 简化为恒等于1的输入x0的权值,公式就可以简化如下:

image

激发函数的输出只有 0 和 1 ,常见的常见的激发函数如下

image

以a图为例子,可以转换如下公式,称为阶跃函数


image

上面说的都是基础的每个神经元的抽象,接下来,我们需要将多个神经元组合成不同的拓扑结构,常见的结构有两种:==前馈型网络==和==反馈型网络==。

==前馈型网络结构(Feedforward NN)==, 可以拆分为:输入层,隐层, 输出层, 每一层的神经元只接收前一层的神经元的输入。


image

==反馈型神经网络(Feedback NN)==,是一种反馈动力学系统,它需要工作一段时间后才能趋于稳定。


image

搞定了网络拓扑,我们还需要对网络进行训练,训练的本质就是对网络参数的调优(W参数),训练的方式可以根据有无导师,进行分类: 有教师学习和无教师学习。==在有教师学习中==,通过比较网络输出值和期望值(教师信号)来调整网络的权值,最终使差异变小。无教师学习中,从输入模式进入网络后,通过预先设置的规则,自动调整网络,使得网络具有模式分类的功能。

反馈网络(重点)

Hopfied离散型网络结构, 这是一种单层的网络结构。具有n个神经元,没每个神经元均连接到其他神经元的输入。各节点没有自反馈。

image

这种拓扑图拥有两个工作模式:异步方式, 同步方式。
异步方式,即一个神经元点,进行状态调整计算,其他保持不变,调整次序可以随机选定,也可以按照规定调整。

==同步方式==,所有神经元同时调整状态, 可用公式表达。


image

如果网络趋于稳定时,可以视为一个记忆样本,那么初态收敛的过程就是寻找记忆样本的过程

通过上述的学习我们可以做一下,总结公式:

Yj = Wij*Xi - Kj

e = Yj - Y(期望值)

通过调整 Wij权值,减少e 偏差。

三、tensorflow

上一个章节认识了一下深度学习的基础理论,下面我们看一是你的tensorflow是如何实现的。

image

从图上可以分为五个部分: 输入层、卷积层、池化层、全连接层、softmax层

1. 输入层

输入层是整个神经网络的输入不能分泌,在处理图像的神经网络中,它一般代表了一张图片的像素矩阵,矩阵的长和宽代表了图像的大小, 矩阵的深度,代表了图像的色彩通道。

  a[;;0]         a[;;1]       a[;;2]

   1,  2         0,  1       2,  0
[         ]   [         ]  [        ]
   0,  1         2,  1       0,  1

2. 卷积层(特征提取)

卷基层时神经网络中最重要的部分,和传统全连接层不同,卷积中的每一个节点输入只是上层神经网络的一小块,这个小块的大小通常有 3x3 或 5x5。卷积层将神经网络中的每一小块进行更加深入的分析从而得到抽象程度更高的特征, 一般来说通过卷积层之后的矩阵深度会增加。
在tensorflow中卷基层称为过滤器,==过滤器可以将当前层的神经网络的上的一个子节点矩阵转化为下一层神经网络上的一个单位节点矩阵, 单位节点矩阵是一个长度和宽度都为1,但深度不限制的矩阵。==

a[;;0]         a[;;1]       a[;;2]                  b[1;1;n]

 1,  2         0,  1      2,  0
[         ]   [        ]  [       ]   ==filter==>>  [0] [1] ...
 0,  1         2,  1      0,  1

过滤器的深度和上一层矩阵的深度是一直的, 不需要设置,但是需要用户手动设置过滤器的宽度 、高度 和 输出深度。看一下在处理深度只有1的矩阵,卷积核为一个时是如何计算的。


image

可以看出通过滑动累加,计算出一层特征, 当设置的输入深度为k时,就会有k个卷积核进行处理,累加产生深度为k的输出,如下图

image

提取的每一层的特征图直接观看是看不出什么的,它代表的是一种模式,卷积核能将周围的数据压缩,泛化,代表着该区域的一种特征。

3.池化层

池化层可以非常有效的缩小矩阵的尺寸,从而减少最后全连接层中的参数。使用池化层既可以加快计算速度也可以防止==过度拟合==的问题。

池化层的计算也是通过滑动的方式,但是计算过程不是节点的加权和,而是采用最简单的最大值或者平均值计算, 实用最大值的操作被称为最大池化层,这是使用最多的池化层结构。使用平均值操作的池化层被称之平均池化层,实用的比较少。
池化层也是需要人工指定尺寸、是否采用全0填充,设置移动步长。
==池化层和卷积层的区别在于==,卷积层使用的过滤器是横跨整个深度。池化层不仅要在长宽维度上滑动,还需要在深度这个维度上移动。
下面来看一下使用最大池化层将 3x3x2的矩阵变换为 2x2x2的矩阵的处理步骤:

image

4.全连接层

全连接层在深度学习中处于核心地位,我们需要优化的参数都在全连接层的各个节点中,这个部分属于黑箱,不可见。 我们能看到的是他的拓扑结构。从上层获取的特征输入到全连接层,全连接层根据训练获取的特征,如果匹配特征,神经元就被激活。从而得到的分数越高。
全连接层 每个神经元与前一层所有的神经元全部连接, 而卷积神经网络只和输入数据中的一个局部区域连接, 并且输出的神经元每个深度切片共享参数。一般经过了一系列的卷积层和池化层之后, 提取出图片的特征图, 比如说特征图的大小是3×3×512, 这个时候, 将特征图中的所有神经元变成全连接层的样子, 直观上也就是将一个3D的立方体重新排列, 变成一个全连接层, 里面有3×3×512=4608个神经元, 再经过几个隐藏层, 最后输出结果。在这个过程中为了防止过拟合会引入Dropout。 最近的研究表明, 在进入全连接层之前, 使用全局平均池化能够有效地降低过拟合。

image

5. softmax层

在tensorflow中softmax用于优化分类结果,将全连接层输出结果变换成一个概率分布。


image

四、tensorflow2.0基础教程

1.环境搭建

开发环境 Anaconda + pycharm
依赖 tensoflow 2.0

数据加载

google有一个预先处理好的数据集,用于训练和测试


//加载一组数,分为训练集,测试集
import tensorflow as tf

mnist = tf.keras.datasets.mnist

(x_train, y_train), (x_test, y_test) = mnist.load_data()

print(x_train.shape, y_train.shape)

print(x_test.shape, y_test.shape)


//输出一下,看一下数据结构

train (60000, 28, 28) (60000,)   //一个60000 * 28 * 28 的矩阵, 60000的数组
test: (10000, 28, 28) (10000,)

训练数据集中提供60000 张28 * 28 像素的黑白图片,并且对应60000 个结果

2. 数据处理

import tensorflow as tf

mnist = tf.keras.datasets.mnist

(x_train, y_train), (x_test, y_test) = mnist.load_data()

'''
 对矩阵中的每一个像素进行 除以 255 变成浮点型
'''

x_train, x_test = x_train / 255, x_test / 255

print("shape:", x_train.shape)
print("result:", x_train[0])

2.构建模型

构建模型在tensorflow中是描述为构建图。 2.0版本很人性化,但是屏蔽了很多我们看不到的过程


import tensorflow as tf

mnist = tf.keras.datasets.mnist

(x_train, y_train), (x_test, y_test) = mnist.load_data()

'''
 对矩阵中的每一个像素进行 除以 255 变成浮点型
'''

x_train, x_test = x_train / 255, x_test / 255

'''
 构建模型,通过全连接层中间增加一层 Dropout 来防止过度拟合 
'''

model = tf.keras.Sequential([
    tf.keras.layers.Flatten(input_shape=(28, 28)), # 第一个层,包含输入层 卷积层 池化层
    tf.keras.layers.Dense(128, activation="relu"), # 这个层比较重要,包含了全连接层和激活函数, 128 为输出层节点数量
    tf.keras.layers.Dropout(0.2), # 用于处理过度拟合,在训练中按照 0 - 0.2的随机比例,将输入单元的参数设置为0
    tf.keras.layers.Dense(10, activation="softmax") # 又是一层全连接层 + softmax, 输出层有10个节点对应,10种不同类型
])

3.训练

import tensorflow as tf

mnist = tf.keras.datasets.mnist

(x_train, y_train), (x_test, y_test) = mnist.load_data()

'''
 对矩阵中的每一个像素进行 除以 255 变成浮点型
'''

x_train, x_test = x_train / 255, x_test / 255

'''
 构建模型,通过全连接层中间增加一层 Dropout 来防止过度拟合 
'''

model = tf.keras.Sequential([
    tf.keras.layers.Flatten(input_shape=(28, 28)), # 第一个层,包含输入层 卷积层 池化层
    tf.keras.layers.Dense(128, activation="relu"), # 这个层比较重要,包含了全连接层和激活函数, 128 为输出层节点数量
    tf.keras.layers.Dropout(0.2), # 用于处理过度拟合,在训练中按照 0 - 0.2的随机比例,将输入单元的参数设置为0
    tf.keras.layers.Dense(10, activation="softmax") # 又是一层全连接层 + softmax, 输出层有10个节点对应,10种不同类型
])

'''
optimizer(优化方式) : w 优化策略, adam指的是梯度下降
loss(局部) : 用于衡量当前模型的准确性, loss = f(期望值, 实际值) ,计算出来的loss用于优化模型的方向
metrics(总体): 衡量模型是否往争取方向发展的度量方式 ,accuracy 指的是正确预测的样本数占总预测样本数的比值
'''

model.compile(optimizer="adam", loss="sparse_categorical_crossentropy", metrics=["accuracy"])

'''
 开始训练模型
'''

model.fit(x_train, y_train, epochs=5) # 训练轮数

'''
评估模型准确性
'''

model.evaluate(x_test, y_test, verbose=2)

上一篇下一篇

猜你喜欢

热点阅读