CapsNet学习笔记
理论学习胶囊结构胶囊可以看成一种向量化的神经元。对于单个神经元而言,目前的深度网络中流动的数据均为标量。例如多层感知机的某一个神经元,其输入为若干个标量,输出为一个标量(不考虑批处理);而对于胶囊而言,每个神经元输入为若干个向量,输出为一个向量(不考虑批处理)。前向传播如下所示:
其中$I_i$为第i个输入(向量),$W_i$为第i个权值(矩阵),$U_i$为中间变量(向量),由输入和权值叉乘获得。$c_i$为路由权值(标量),需要注意的是该标量是前向传播过程中决定(使用动态路由算法)的,不是通过反向传播优化的参数。Squash为一种激活函数。前向传播使用公式表示如下所示:
U_i = W_i^T \times I_iS = \sum \limits_{i = 0}^n c_i \cdot U_iResult = Squash(S) = \cfrac{||S||^2}{1+||S||^2} \cdot \cfrac{S}{||S||}由以上可以看出,胶囊结构中流动的数据类型为向量,其激活函数Squash输入一个向量,输出一个向量。
动态路由算法动态路由算法适用于确定胶囊结构中$c_i ...
基于numpy构建多层感知机
1import numpy as np
目标使用numpy实现多层感知机的正向和反向传播
层次构建全连接层正向传播正向传播的公式为:$Y = f(W \times X + b)$,其中,Y为输出,W为权值,b为偏置
反向传播对于反向传播,已知上一层传回的梯度为dY,对应的反向传播公式为:
dX = (W^{T} \times dY) \cdot f'(Y)dW = \cfrac{1}{m} dY \times X^{T}db = \cfrac{1}{m} \sum dY代码实现1234567891011121314151617181920212223242526class numpy_fc(object): def __init__(self, in_channel, out_channel, optim): self.weight = np.float64(np.random.randn(out_channel, in_channel) * 0.1) self.bias = np.zeros((out_channel, 1),dtype=np.flo ...
基本2D优先堆
基本优先队列考虑一种队列:每次取出的数据是队列中最小的元素。这种队列可用于程序调度,作业分配等领域,这种队列被称为优先队列,核心的方法有:
Insert()方法:将数据插入优先队列
DeleteMin()方法:将队列中的数据中最小的输出并删除
优先队列可以使用堆这一数据结构实现
二叉堆实现优先队列二叉堆二叉堆是除了底层外被完全填满的二叉树,最底层的数据也是从左到右填入(完全二叉树)。因为其填满的特性,可以直接使用数组实现该树型结构:一个位于数组i位置的节点的子节点分别是2*i和2*i+1
优先队列实现当一个二叉堆实现优先队列时,除了要满足堆的基本特性,还要满足一个特性:对任意一个节点,其值小于其所有的子节点(若有子节点)。则递归的来看,位于根(数组位置0)的节点即为最小的数据。
插入方法对于堆,每次插入的位置是固定的,若直接将插入元素插入该位置,则优先队列的特性被破坏,因此,需要找到合适的插入位置。操作方法为递归的比较插入位置和插入位置父节点的大小,若满足特性则插入,不满足则交换待插入位置和父节点的数据(将父节点数据写入待插入位置,待插入位置为新的父节点)
删除方法删除方法有两个 ...
CNN的反向传播
DNN中的反向传播反向传播算法是神经网络的训练的基本算法组成之一,在训练神经网络时,训练分为两个步骤:计算梯度和更新权值。其中反向传播负责的是梯度的计算,而训练算法的区分主要在更新权值的方式上。对于DNN,基本的反向传播思路为:
\cfrac{dz}{dw_{i}} = \cfrac{dz}{da_{i+1}} \times \cfrac{da_{i+1}}{dw_{i}}其中,$\cfrac{dz}{dw{i}}$为输出(多为代价函数输出)对第i层的权值的梯度,$\cfrac{da{i+1}}{dw_{i}}$为本层输出对权值的梯度。于是梯度的计算被分为反向传播链条上的几个部分,将复杂的求导分割为层内运算的求导,上一层的梯度可以由本层的梯度递归的求出。
卷积神经网络中的反向传播卷积神经网络相比于多层感知机,增加了两种新的层次——卷积层与池化层。由于反向传播链的存在,要求出这两种层结构的梯度,仅需要解决输出对权值的梯度即可。
池化层的梯度池化层用于削减数据量,在这一层上前向传播的数据会有损失,则在反向传播时,传播来的梯度也会有所损失。一般来说,池化层没有参数,于是仅需要计算梯度反向传播 ...
MIPS指令集与简单分析
R格式指令基本格式
标记
op
rs
rt
rd
shamt
funct
位数
31-26
25-21
20-16
15-11
10-6
5-0
功能
操作符
源操作数寄存器1
源操作数寄存器2
目的操作数寄存器
位移量
操作符附加段
指令算数类指令
指令
op
rs
rt
rd
shamt
funct
功能
add
000000
rs
rt
rd
00000
100000
rd=rs+rt
addu
000000
rs
rt
rd
00000
100001
rd=rs+rt(无符号数)
sub
000000
rs
rt
rd
00000
100010
rd=rs-rt
subu
000000
rs
rt
rd
00000
100011
rd=rs-rt(无符号数)
slt
000000
rs
rt
rd
00000
101010
rd=(rs<rt)?1:0
sltu
000000
rs
rt
rd
00000
101011
rd=(rs<rt)?1:0(无符号数)
逻辑类指令
指令
op
rs
r ...
基于MXnet的RNN简要剖析
1import mxnet as mx
官方github教程部分代码网络生成12345num_layers = 2num_hidden = 256stack = mx.rnn.SequentialRNNCell()for i in range(num_layers): stack.add(mx.rnn.LSTMCell(num_hidden=num_hidden, prefix='lstm_l%d_'%i))
mx.rnn.SequentialRNNCell():RNN容器,用于组合多个RNN层
mx.rnn.LSTMCell(num_hidden=num_hidden, prefix='lstm_l%d_'%i):LSTM单元
123456789101112131415161718192021num_embed = 256def sym_gen(seq_len): data = mx.sym.Variable('data') label = mx.sym.Variable('softmax_lab ...
关于巧克力数据集的数据分析
12import numpy as npimport pandas as pd
数据读取1dataset = pd.read_csv("./flavors_of_cacao.csv")
123dataset.columns = dataset.columns.map(lambda x:x.replace("\n"," "))dataset.columns = dataset.columns.map(lambda x:x.replace("\xa0",""))dataset.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1795 entries, 0 to 1794
Data columns (total 9 columns):
Company (Maker-if known) 1795 non-null object
Specific Bean Origin or Bar ...
开放地址法散列
开放地址法开放地址法是另一种(相对于分离链接法)解决散列冲突的方法。适用于装填因子(散列表中元素个数和散列表长度比)较小(小于0.5)的散列表。
开放地址法中索引的计算方法为h_{i}(x) = (Hash(X) + F(i)) \% TableSize,其中:
Hash(x)为索引的计算方法
F(i)为冲突的解决函数,有F(0) = 0,i为已经尝试计算索引的次数
F(i)一般有:
线性探测法:F(i) = i,即每次冲突则向下寻找1个位置,直到找到不冲突的位置,容易产生“一次聚集”的现象(数据集中在某一个地址区域)
平方探测法:F(i)=i^{2},每次冲突按平方寻找下一个位置,直到找到不冲突的位置
双散列:F(i) = i\cdot hash_{2}(x),即发生冲突后使用第二个散列函数计算下一个位置
代码实现数据结构结构体1234567891011// 节点数据type tableData struct { data int}// 节点type tableNode struct { flag bool //是否已经插入数据,用于冲突检测 ...
流水线乘加树
需求
计算两个长度为2的幂次方的向量的对应位置相乘相加结果
输入为补码,输出为补码(支持负数)
输入位宽可配置,输入向量的宽度可配置,输出位宽由以上两项决定
设计规划参数表
参数名称
说明
默认值
DIN_WIDTH
输入位宽
8
DIN_NUM_LOG
输入向量的宽度的log2值(宽度2^{DIN\_NUM\_LOG})
2
注:输出位宽由以上决定,为DOUT\_WIDTH = DIN\_WIDTH \times 2 + DIN\_NUM\_LOG - 1
端口列表
端口名
类型
位宽
说明
clk
input
1
系统时钟
rst_n
input
1
系统复位
din_valid
input
1
输入数据有效,高有效
mla_din1
input
(2 * DIN_NUM_LOG) DIN_WIDTH
输入向量1
mla_din2
input
(2 * DIN_NUM_LOG) DIN_WIDTH
输入向量2
dout_valid
output
1
输出信号有效,高有效
mla_dout
output
DIN_W ...
基于sklearn的特征筛选
理论特征筛选的作用样本中的有些特征是所谓的“优秀特征”,使用这些特征可以显著的提高泛化能力。而有些特征在样本类别区分上并不明显,在训练中引入这些特征会导致算力的浪费;另外有些特征对样本的分类有反作用,引入这些特征反而会导致泛化能力下降
特征筛选与PCA(主成分分析)不同,特征筛选不修改特征值,而是寻找对模型性能提升较大的尽量少的特征
代码实现123import numpy as npimport pandas as pdimport matplotlib.pyplot as plt
引入数据集——Titanic数据集12titan = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")titan.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1313 entries, 0 to 1312
Data columns (total 11 columns):
row ...