python_new
  • Introduction
  • First Chapter
  • 一、python基础
    • 1.1 常识
      • sys
    • 1.2 基础语法(1)
    • 1.2 基础语法(2)
    • 1.3 常见问题求解
    • 1.4 算法
  • 二、爬虫
    • urllib库(1)
      • urllib库(2)
    • requests模块(1)
      • requests模块(2)
    • 2.1 爬虫基础(3)HTTP原理
    • 2.1 爬虫基础(4)会话和Cookies
    • 2.1 爬虫基础(5)数据存储
      • Mysql存储
      • MongoDB存储
      • Redis存储
    • 2.3 正则表达式
    • 2.4 解析库lxml
      • BeautifulSoup
      • pyquery(1)
      • pyquery(2)
    • 2.5 selenium(1)
    • 2.5 seleium(2)
    • 2.6 Json
    • 2.7 scrapy
      • scrapy(2)
    • 2.9 异步加载
    • 2.6 Splash
  • ORM框架
    • SQLAlchemy
  • Django
    • 1、初阶(一)
    • 初学:投票教程(一)
    • 初学:投票教程(二)
    • 初学:投票教程(三)
    • 初学:投票教程(总结)
    • 模型(一)
    • 模型(二)
    • 视图(一)
    • 视图(二)
    • 模板(一)
    • django实际使用笔记
  • 面试题收集总结
    • 数据结构原理
    • 算法篇
      • 排序
    • 题目篇
  • python数据分析
    • 基础了解(一)
    • 基础了解(二)
    • 基础了解(三)
  • 多线程
  • 深度学习
    • 疑问
  • keras(一)
  • 神经网络
  • 图像识别
  • Docker
    • 一、基础了解
Powered by GitBook
On this page
  • 部分概念补充
  • 1、聚类
  • 2、特征映射
  • 3、Gen
  • 4、范数
  • 5、归一化
  • 6、条件概率、贝叶斯
  • 7、softmax、信息熵、香农定理
  • 8、循环神经网络
  • 9、梯度消失、梯度爆炸
  • 10、优化器原理详解
  • 11、逻辑回归
  • 第四章
  • 4.1 激活函数去线性/异或问题
  • 4.2 损失函数
  • 4.3 神经网络优化算法
  • 4.4 神经网络进一步优化
  • 第六章
  • 6.1、卷积神经网络与图像识别、经典数据集
  • 6.2、卷积神经网络结构
  • 6.3、卷积层与池化层
  • 第十章
  • 10.1 TensorFlow高层封装
  • 10.2 Keras

Was this helpful?

深度学习

Previous多线程Next疑问

Last updated 6 years ago

Was this helpful?

参考资料:实战谷歌TensorFlow框架

部分概念补充

1、聚类

2、特征映射

卷积神经网络

3、Gen

4、范数

L0范数:向量中0的个数

L1范数:向量元素绝对值之和

L2范数:向量元素平方和再开方

L-P范数:向量元素p次方之和再开p方根

5、归一化

归一化:将数据变成某个特定范围之间的数值;把有量纲的数据变为无量纲的数据

优点:加快梯度下降求解最优解的速度;可能提高精度

归一化属于线性变化,不会影响原数据的性质

6、条件概率、贝叶斯

条件概率:在B发生的情况下,A发生的概率

p(A|B) = p(AB)/p(B) and p(B) > 0

贝叶斯公式:在A发生的情况,寻找导致A发生的Bi的可能性(图片怎么这么大?)

上面分数上是条件概率,代表AB事件同时发生的概率,下面是全概率公式,代表A发生的概率,然后这个分数也就是条件概率的变形,代表在A事件发生的情况下B事件发生的概率

7、softmax、信息熵、香农定理

  • softmax

  • 信息熵

信息熵是消除不确定性所需信息量的度量,也即未知事件可能含有的信息量

  • 奈奎斯特定理和香农定理

原文提到的波特率可能是错的,真实的应该是传递的符号数,

比特率 = 波特率 * 位数

确定了每个符号拥有的位数之后,才可以确定波特率

# 奈奎斯特定理:Cmax是指信道容量,B是带宽,L信号电平的个数
Cmax = 2 * B * log2(L)
# 香农定理:B是带宽,S/N是信噪比
Cmax = B * log2(1 + S/N)

8、循环神经网络

写论文、写诗、写程序

# S代表记忆,t为时刻,U、W、v为线性参数,对于所有的节点都是相同的,函数是激活函数
St = f(U*Xt + W*St-1)
# 输出
Ot = softmax(V*St)

9、梯度消失、梯度爆炸

梯度消失是指更新参数时会用到激活函数的导函数,如果这个导函数得到的结果总是小于1,那么不断相乘之下,结果就会很小,最终对末层的参数没有起到优化修改的作用;而梯度爆炸是指当导函数结果总是大于1时,对参数的修改会越来越大。

梯度消失和梯度爆炸的原因:反向传播法则,激活函数

问题:如果这些激活函数有这样的隐患的话,为什么还在用它们?

解决方法:

  • 预训练

  • 梯度剪切、权重正则

  • 换激活函数(relu,leakrelu,elu)

  • batchnorm:在反向传播中乘以权重

10、优化器原理详解

11、逻辑回归

逻辑回归不仅可以做二分,而且可以给出属于该类的概率

12、channel和卷积核

在我看来就是深度,样本深度,过滤器深度(卷积核个数)

in_channel:此层输入的深度

out_channel:此层要输出的深度,也就是过滤器的深度

第四章

4.1 激活函数去线性/异或问题

深度神经网络中的线性和非线性模型,激活函数,隐藏层解决异或运算(提取高维特征)

# TensorFlow实现神经网络中的前向传播算法
a = tf.nn.relu(tf.matmul(x, w1) + biases1)
b = tf.nn.relu(tf.matmul(a, w2) + biases2)

4.2 损失函数

损失函数刻画推测结果与正确结果的落差,分类问题,回归问题

  • 分类问题

# 对x积分,没打出来
H(p,q) = -∫p(x)log(q(x))

交叉熵用来刻画两个概率分布之间的距离,不对称,实际意义是用q来表达p的难度,p为正确结果,q为输出结果

但神经网络的输出不是概率分布,于是使用softmax回归算法,去掉回归参数后,对原始输出结果做处理,得到概率分布,

# TensorFlow实现交叉熵的计算
cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y, 1e-10, 1.0)))
# 这其中包括了四个运算
# tf.clip_by_value(y, 下限,上限)
# tf.log()
# x * y
# tf.reduce_mean()  对矩阵取平均值,默认对所有元素求平均值

因为softmax和交叉熵经常一起使用,因此TensorFlow将两者合并了,直接就可以得到softmax回归之后的交叉熵

cross_entropy = tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y)

  • 回归问题

使用均方误差来刻画

mse = tf.reduce_mean(tf.square(y_ - y))
  • 自定义损失函数

# 如果v1和v2的长度不同时,会进行广播操作,就如同numpy中一样
loss = tf.reduce_sum(tf.where(tf.greater(v1, v2), (v1 - v2) * a, (v2 - v1) * b))

tf.placeholder、tf.Variable、tf.random_normal

4.3 神经网络优化算法

反向传播算法:所有参数;梯度下降算法:单个参数

学习率:每次参数移动的幅度

反向传播算法:首先前向传播得到预测值,然后计算预测值和实际值之间的差距,再然后使用反向传播算法计算每个参数的梯度,再然后使用梯度和学习率来更新每个参数

梯度下降算法的结果可能是局部最优,这个很容易理解,因此初始值对结果的影响就可能会变得很大;另外就是耗时间,每次迭代都要将所有数据计算一遍

随机梯度下降算法(SGD):提高效率,随机的问题也很明显,以偏概全,结果可信度下降

折中方法,batch,每次计算一块数据,时间不会比一条数据慢太多,其次降低迭代次数。

4.4 神经网络进一步优化

  • 学习率

指数衰减法设置学习率参数,前期较快接近,后期稳定靠近

tf.train.exponential_decay

该函数中有一个staircase的参数,默认为False,此时学习率的下降趋势就是指数衰减,如果为True,则为阶梯下降的趋势,较为集中的数据集在训练阶梯类型时会起到相同的作用,

代码部分:

global_step = tf.Variable(0)
learning_rate = tf.train.exponential_decay(0.1, global_step, 100, 0.96, staircase=True)
learning_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss, global_step=global_step)

learning_step能不能代入到Adm优化的算法中?

各个参数的意义

tf.train.exponential_decay(learning_rate, global_, decay_steps, decay_rate, staircase=True/False)

初始学习率,每隔decay_steps下降decay_rate,但这个global_step还是不太清楚

  • 过拟合问题(Dropout)

正则化避免过拟合,在损失函数中加入刻画模型复杂程度的指标,这样我们在优化参数的时候就不是只根据损失函数,而是根据损失函数和模型的复杂度之和

loss = j(θ)+λR(w)

前者代表原来的损失函数,参数θ包括模型中所有的参数,w和b;后者代表模型复杂度,一般只由w决定。

  • 正则化

L1正则化:绝对值相加;L2正则化:平方相加

L1的问题,参数变稀松(出现更多的0),L2不会;不可导,L2可导

当然也有将两者结合的优化方法

# L2正则化示例
w = tf.Variable(tf.random_normal([2, 1]), stddev=1, seed=1)
y = tf.matmul(x, w)
loss = tf.reduce_mean(tf.square(y_ - y)) + tf.contrib.layers.l2_regularizer(lambda)(w)

当神经网络结构变复杂之后,这样的正则化就可能很不方便了,解决这个问题,可以使用TensorFlow中提供的collection

3、滑动平均模型

滑动平均模型会对每个变量,(确定不是参数?),不是很懂在什么样的情形下使用影子变量

第六章

6.1、卷积神经网络与图像识别、经典数据集

神经网络的结构会对神经网络的准确率有很大的影响,常用的神经网络结构--卷积神经网络(CNN)

图像识别技术近年来的突破进展背后卷积神经网络就是最大的技术支持

# 经典数据集
MINIST、CIFAR、ImageNet
CCIFAR:IFAR-10,CIFAR-100

全连接层神经网络,卷积神经网络、循环神经网络

卷积神经网络中每一个节点都是一个神经元(在所有的神经网络结构中不都是这样的吗?)

在相邻两层只有部分节点相连,

“为了展示每一层神经元的维度,一般会将每一层卷积层的节点组织成一个三维矩阵”

输入为原始像素,输出为每个类别的可信度,与全连接神经网络的唯一区别就是神经网络中相邻两层的连接方式

全连接神经网络失败的原因:在处理图像识别时,参数过多,容易导致过拟合,计算速度变慢,因此要有效减少神经网络中的参数个数

6.2、卷积神经网络结构

  • 输入层:原始图片像素组成的三维矩阵,长×宽×深度

  • 卷积层:每一个节点的输入只是上一层神经网络的一小块(提取抽象程度更高的特征),大小3×3,或5×5,经过卷积层处理的矩阵会变得更深,

  • 池化层:作用是缩小矩阵的大小,深度不变,减少节点数,主要目的是为了减少参数,

  • 全连接层:

  • softmax层:

6.3、卷积层与池化层

1、卷积层

过滤器需要指定三个参数,长宽,深度;长宽是过滤器要处理的节点矩阵的长宽,深度是指处理得到的矩阵的深度

输入图片集,数据为四维矩阵,第一个参数代表第几张图片,后面三维矩阵代表图片信息;然后创建过滤器的变量,需要确定尺寸和当前层的深度和过滤器深度,其中当前层的深度是由当前层的神经网络的深度确定的,其余需要设置;确定好之后,使用下面的函数

# 这里的权重生成出来之后是一个四维矩阵,
filter_weight = tf.get_variable('weights', [5, 5, 3, 16], initializer=tf.truncated_normal_initializer(stddev=0.1))
# input:图片数据,四维矩阵
# filter_weight:过滤器权重参数
# strides:步长
# padding:填充
conv = tf.nn.conv2d(input, filter_weight, strides=[1, 1, 1, 1], padding='SAME')

来操作卷积层的操作,

w权重矩阵与原数据截取出来的那一部分尺寸是相同,因为它们是点乘,所以最后结果一定是一个数据,也因此过滤器得到的结果是一个1×1×deep的矩阵(深度不限)

问题:当过滤器移动在同一层的神经网络上时,同一层使用权重参数是不是相同的?

# 这里不能直接加bias
bias = tf.nn.bias_add(conv, biases)

问题:在numpy矩阵可以与常数相加,结果便是矩阵中每个数据都加上这个数据,在tensorflow中不行吗?

2、池化层

使用最大值操作的池化层被称为最大池化层,用得最多,使用平均值操作的叫做平均池化层,用得较少

卷积层中间往往会添加一个池化层,用于缩减矩阵尺寸,减少节点和参数的个数

这一层的操作不会影响矩阵的深度,只会影响长宽,效果是提取数据特征

怪不得这种方法可以很好地用于图片识别

形式与卷积层类似

tf.nn.max_pool(actived_conv, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1], pedding='SAME')

问题:ksize定义的过滤器尺寸中每个位置参数的意义是不是与卷积层过滤器中的参数意义不相同?

答:先别管了,ksize一四参数为1,其余为池化层过滤器尺寸;strides,一四参数为1,其余为步长幅度

第十章

10.1 TensorFlow高层封装

TensorFlow_slim,TFlearn,Keras,Estimator

10.2 Keras

  • 基础用法:

训练过程可以分为数据处理,模型定义和模型训练三个部分。

Keras如何实现lenet5结构,暂时跳过循环神经网络的部分

  • 高级用法:

Sequential只适合实现顺序性的模型结构,但是如Inception这类的就不适用了。

还有用keras实现多输入多输出的结构

缺点:

1、原生态的Keras API对训练数据的处理流程支持得不太好,基本上需要一次性把数据全部加载到内存

2、原生态Keras API无法支持分布式训练

解决方法就是讲Keras和Tensorflow API结合起来

https://www.jianshu.com/p/2fa67f9bad60
https://www.cnblogs.com/nsnow/p/4562308.html
https://www.cnblogs.com/bonelee/p/9166084.html
https://blog.csdn.net/qq_28618765/article/details/78221571
https://www.jianshu.com/p/95a8f035c86c
https://blog.csdn.net/qq_31073871/article/details/81077386
https://blog.csdn.net/Codeur/article/details/78573003
https://blog.csdn.net/saltriver/article/details/53056816
https://blog.csdn.net/dallin0408/article/details/59510405#commentBox
https://blog.csdn.net/qq_39422642/article/details/78676567
https://www.cnblogs.com/pinard/p/6509630.html
https://blog.csdn.net/qq_25737169/article/details/78847691
https://blog.csdn.net/weixin_37933986/article/details/69255863
http://ruder.io/optimizing-gradient-descent/
https://blog.csdn.net/liulina603/article/details/78676723
https://blog.csdn.net/sscc_learning/article/details/79814146