Skip to content

Commit

Permalink
Update some files, but i have forget details.
Browse files Browse the repository at this point in the history
  • Loading branch information
HarleysZhang committed Nov 14, 2020
1 parent 4d94e58 commit f1ff253
Show file tree
Hide file tree
Showing 5 changed files with 96 additions and 258 deletions.
64 changes: 61 additions & 3 deletions latex2pic.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,52 @@
import re
from urllib.parse import quote
import sys, os
current_dir = os.path.abspath(os.path.dirname(__file__)).replace('\\', '/')
sys.path.append(current_dir)

if __name__ == "__main__":
text = open("深度学习/神经网络压缩算法总结.md",encoding="utf-8").read()
def count_file_num(self, directory, file_type = "md"):
"""count the number of json/image/.py files in directory path.
Args:
directory: root path of dat files directory.
Returns:
file_list: The file path list that require specified file type("dat").
file_number: total file number of files that require specified file type.
"""
if file_type == "image":
file_types = ['jpg', 'JPG', 'png', 'PNG']
else:
file_types = []
file_types.append(file_type)
file_list = [] # specified file list
size = 0
try:
# traverse subfolders in root directory
for root, _, files in os.walk(directory): # sub_dir is 3 tuple object
if len(files) >= 1:
for sub_file in files:
sub_file = osp.join(root, sub_file).replace('\\', '/')
file_extension = osp.splitext(sub_file)[1].strip('.') # 'png'?
if not file_extension in file_types:
continue
else:
file_list.append(sub_file)
size += os.path.getsize(sub_file)
except Exception as e:
print(e)

file_number = len(file_list)
print(149*"*")
print('In 【"%s"】 directory, all 【 "%s" 】 file size is: %.3f Mb.' % (directory, file_type, size / 1024 / 1024))
print("There are 【 %d 】 %s files." % (file_number, file_type))
print(149*"*")

return file_list, file_number

def show_sgl_github_md(md_path):
assert os.path.splitext(path)[1] == '.md'
text = open(md_path, encoding="utf-8").read()

parts = text.split("$$")

Expand All @@ -21,5 +65,19 @@
lines[lid] = ' '.join(parts)
text_out = "\n".join(lines)

new_file_name = os.path.basename(md_path) + '_show'
new_file_path = osp.join(os.path.dirname(md_path), new_file_name
with open("./深度学习/神经网络压缩算法总结new.md", "w", encoding='utf-8') as f:
f.write(text_out)
f.write(text_out)

def show_multi_github_md(md_file):
pass

if __name__ == "__main__":
path = "C:/Users/zhanghonggao/Documents/my_project/2020_algorithm_intern_information-master"
if os.path.isfile(path):
show_sgl_github_md(path)
elif os.path.isdir(path):
show_multi_github_md(path)
else:
print(FileNotFoundError)
23 changes: 16 additions & 7 deletions 深度学习/深度学习基础.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
# 深度学习基础
## 一,滤波器与卷积核
在只有一个通道的情况下,“卷积核”就相当于 “filter”,这两个概念是可以互换的。但在一般情况下,它们是两个完全不同的概念。每个 “filter” 实际上恰好是“卷积核”的一个集合,在当前层,每个通道都对应一个卷积核,且这个卷积核是独一无二的。

**滤波器的数量,卷积核的shape。**
在只有一个通道的情况下,“卷积核”就相当于 “filter”,这两个概念是可以互换的。一个 `“Kernel”` 更倾向于是 `2D` 的权重矩阵。而 `“filter”` 则是指多个Kernel堆叠的 `3D` 结构。如果是一个 2D 的 filter,那么两者就是一样的。但是一个3Dfilter,在大多数深度学习的卷积中,它是包含 kernel 的。**每个卷积核都是独一无二的,主要在于强调输入通道的不同方面**

## 二,卷积层和池化输出大小计算

Expand Down Expand Up @@ -312,13 +310,18 @@ Layer Name = pool5, Output size = 5, Stride = 32, RF size = 195

### 参考资料
魏秀参-《解析卷积神经网络》

## 十,卷积层conv与全连接层dense的区别

+ 卷积层学习到的是局部模式(对于图像,学到的就是在输入图像的二维小窗口中发现的模式)
+ 全连接层学习到的是全局模式(全局模式就算设计所有像素)

## 十一,CNN权值共享问题

首先**权值共享就是滤波器共享**,滤波器的参数是固定的,即是用相同的滤波器去扫一遍图像,提取一次特征特征,得到feature map。在卷积网络中,学好了一个滤波器,就相当于掌握了一种特征,这个滤波器在图像中滑动,进行特征提取,然后所有进行这样操作的区域都会被采集到这种特征,就好比上面的水平线。

## 十二,CNN结构特点
## 十二,CNN 结构特点

典型的用于分类的CNN主要由**卷积层+激活函数+池化层**组成,最后用全连接层输出。卷积层负责提取图像中的局部特征;池化层用来大幅降低参数量级(降维);全连接层类似传统神经网络的部分,用来输出想要的结果。

`CNN` 具有局部连接、权值共享、池化操作(简单说就是下采样)和多层次结构的特点。
Expand All @@ -328,11 +331,12 @@ Layer Name = pool5, Output size = 5, Stride = 32, RF size = 195
+ 池化操作与多层次结构一起,实现了数据的降维,将低层次的局部特征组合成为较高层次的特征,从而对整个图片进行表示。
+ 卷积神经网络学到的模式具有平移不变性(`translation invariant`),且可以学到模式的空间层次结构。

##
### Reference

[(二)计算机视觉四大基本任务(分类、定位、检测、分割](https://zhuanlan.zhihu.com/p/31727402)

## 十三,深度特征的层次性

卷积操作可获取图像区域不同类型特征,而汇合等操作可对这些特征进行融合和抽象,随着若干卷积、汇合等操作的堆叠,各层得到的深度特征逐渐从泛化特征(如边缘、纹理等)过渡到高层语义表示(躯干、头部等模式)。

## 十四,什么样的数据集不适合深度学习
Expand All @@ -341,20 +345,25 @@ Layer Name = pool5, Output size = 5, Stride = 32, RF size = 195
+ 数据集没有局部相关特性,目前深度学习表现比较好的领域主要是图像/语音/自然语言处理等领域,这些领域的一个共性是局部相关性。图像中像素组成物体,语音信号中音位组合成单词,文本数据中单词组合成句子,这些特征元素的组合一旦被打乱,表示的含义同时也被改变。对于没有这样的局部相关性的数据集,不适于使用深度学习算法进行处理。举个例子:预测一个人的健康状况,相关的参数会有年龄、职业、收入、家庭状况等各种元素,将这些元素打乱,并不会影响相关的结果。

## 十五,什么造成梯度消失问题

+ 神经网络的训练中,通过改变神经元的权重,使网络的输出值尽可能逼近标签以降低误差值,训练普遍使用BP算法,核心思想是,计算出输出与标签间的损失函数值,然后计算其相对于每个神经元的梯度,进行权值的迭代。
+ 梯度消失会造成权值更新缓慢,模型训练难度增加。造成梯度消失的一个原因是,许多激活函数将输出值挤压在很小的区间内,在激活函数两端较大范围的定义域内梯度为0,造成学习停止。

## 十六,Overfitting怎么解决

首先所谓过拟合,指的是一个模型过于复杂之后,它可以很好地“记忆”每一个训练数据中随机噪音的部分而忘记了去“训练”数据中的通用趋势。
**过拟合具体表现在:模型在训练数据上损失函数较小,预测准确率较高;但是在测试数据上损失函数比较大,预测准确率较低**。解决办法如下:

+ `数据增强`, 增加数据多样性;
+ Parameter Norm Penalties(参数范数惩罚), `L1, L2正则化`;
+ `dropout`;
+ 模型融合, 比如Bagging 和其他集成方法;
+ `BN` ,batch normalization;
+ Early Stopping(提前终止训练)。

## 十七,L1和L2区别
L1 范数(`L1 norm`)是指向量中各个元素绝对值之和,也有个美称叫“稀疏规则算子”(Lasso regularization)。 比如 向量 A=[1,-1,3], 那么 A 的 L1 范数为 |1|+|-1|+|3|。简单总结一下就是:
## 十七,L1 和 L2 区别

L1 范数(`L1 norm`)是指向量中各个元素绝对值之和,也有个美称叫“稀疏规则算子”(Lasso regularization)。 比如 向量 A=[1,-1,3], 那么 A 的 L1 范数为 |1|+|-1|+|3|。简单总结一下就是:

+ L1 范数: 为 x 向量各个元素绝对值之和。
+ L2 范数: 为 x 向量各个元素平方和的 1/2 次方,L2 范数又称 Euclidean 范数或 Frobenius 范数
Expand Down
12 changes: 8 additions & 4 deletions 深度学习/神经网络压缩算法总结.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
# 模型压缩算法总结

## 神经网络的压缩方法

+ 低秩近似
+ 剪枝与稀疏约束
+ 参数量化
Expand All @@ -20,9 +23,10 @@
> 一般地,行阶梯型矩阵的秩等于其“台阶数”-非零行的行数。
**低秩近似算法能减小计算开销的原理**如下:
给定权重矩阵 $W\epsilon R^{m*n}$ , 若能将其表示为若干个低秩矩阵的组合,即 $W=\sum_{i=1}^{n}\alpha_{i}M_{i}$ , 其中 $W\epsilon R^{m*n}$ 为低秩矩阵,其秩为 $r_{i}$ , 并满足 $r_{i}<<min(m,n)$ ,则其每一个低秩矩阵都可分解为小规模矩阵的乘积,$M_{i}=G_{i}H_{i}^{T}$ ,其中 $G_{i}\epsilon R^{m*r_{i}}$ ,$H_{i}\epsilon R^{m*r_{i}}$。当 $r_{i}$ 取值很小时,便能大幅降低总体的存储和计算开销。

基于以上想法,Sindhwani 等人提出使用结构化矩阵来进行低秩分解的算法,具体原理可自行参考论文。另一种比较简便的方法是使用矩阵分解来降低权重矩阵的参数,如 Denton 等人提出使用`奇异值分解`(Singular Value Decomposition,简称 SVD)分解来重构全连接层的权重。
给定权重矩阵 $W\epsilon R^{m*n}$ , 若能将其表示为若干个低秩矩阵的组合,即 $W=\sum_{i=1}^{n}\alpha_{i}M_{i}$ , 其中 $W\epsilon R^{m*n}$ 为低秩矩阵,其秩为 $r_{i}$ , 并满足 $r_{i}<<min(m,n)$ ,则其每一个低秩矩阵都可分解为小规模矩阵的乘积,$M_{i}=G_{i}H_{i}^{T}$ ,其中 $G_{i}\epsilon R^{m*r_{i}}$ ,$H_{i}\epsilon R^{m \times r_{i}}$。当 $r_{i}$ 取值很小时,便能大幅降低总体的存储和计算开销。

基于以上想法,`Sindhwani` 等人提出使用结构化矩阵来进行低秩分解的算法,具体原理可自行参考论文。另一种比较简便的方法是使用矩阵分解来降低权重矩阵的参数,如 Denton 等人提出使用`奇异值分解`(Singular Value Decomposition,简称 SVD)分解来重构全连接层的权重。

### 1.1,总结

Expand Down Expand Up @@ -112,11 +116,11 @@ def residual_unit(data, num_filter, stride, dim_match, num_bits=1):

+ 直接根据权重的正负进行二值化:$x^{b}=sign(x)$。符号函数 `sign(x)` 定义如下:
$$
sign(x) = \left\{ \begin{matrix}
sign(x) = \left\{\begin{matrix}
-1 & x < 0 \\
0 & x = 0 \\
1 & x > 0
\end{matrix}\right\}
\end{matrix}\right.
$$
![sign(x)公式](../images/sign(x)公式.png)
+ 进行随机的二值化,即对每一个权重,以一定概率取 $\pm 1$
Expand Down
Loading

0 comments on commit f1ff253

Please sign in to comment.