网络的模型的参数计算(杂乱):

https://www.cnblogs.com/wushaogui/p/9176617.html

目录

CNN 卷积层:

线性层:

CNN 卷积层:

LeNet-5

在这里插入图片描述

 

局部感受野(local receptive fields):图像的空间联系是局部的,就像人通过局部的感受野去感受外界图像一样,每个神经元只感受局部的图像区域,然后在更高层,将这些感受不同局部的神经元综合起来就可以得到全局的信息了。

LeNet-5网络

模型 大小计算:

  1. C1: 5 x 5 x 20 = 500,5x5卷积核, 20个feature map输出,20个kernel--->(28-5+1)/1 = 24       pool 2*2   ------ P1 :24 / 2 = 13

  2. C2: 20x 5 x 5 x 50 = 25000 ,20维度输入,则20x5x5 kernel,50个feature map输出,即相当于20通道的图像输入,则需要20x5x5的kernel来卷积乘,50个这样的卷积核操作得到50个feature map,50个kernel----> (12-5+1)/1 = 8  P2: 8 / 2 = 4

  1. F1: 50x4x4x500 = 400000,50维度特征图输入,全连接,每个点做卷积乘,则kernel大小为50x4x4,共500个feature map输出,500个kernel  

  2. F2 : 500x1x1x10 = 5000,500维度特征图输入,全连接,kernel大小为500x1x1,共10个feature map输出,10个kernel

 

总参数:500 + 25000 + 400000 + 5000 + (20 + 50 + 500 + 10) =  431080

用4bytes的float类型来存储参数,则总的参数量大小为:

431080 x 4 = 1724320 ≈ 1683.90625kb ≈ 1.64M 
对比实际LeNet-5网络基于caffe训练出来的模型大小为:1.64 MB (1,725,025 字节),基本接近,因为模型中可能还带有附加特性参数。

线性层:

 

 LSTM:

这里的  实际上是一个句子的 embedding(不考虑 batch 维度),shape 一般为 [seq_length, embedding_size]。图中的  就是 cell,  中的词依次进入这个 cell 中进行处理。可以看到其实只有这么一个 cell,所以每次词进去处理的时候,权重是共享的,将这个过程平铺展开,就是下面这张图了:

始终要记住这么多  都是一样的,权重是一样的,  到  是一个个词,每一次的处理都依赖前一个词的处理结果,这也是 RNN 系的网络难以像 CNN 一样并行加速的原因。同时, 这就像一个递归过程,如果把求  的公式展开写, A 里的权重记为 [公式] ,那么就会发现需要 [公式] 个 [公式] 相乘,即 [公式] ,这是非常恐怖的:

LSTM的神经元个数 - 好奇不止,探索不息 - 博客园

总体来说,假设lstm层的一个时间点上的输入特征长度是n,输出长度是m,那么参数量是4*((n+m)*m+m)。

from keras.layers import LSTM
from keras.models import Sequential

time_step=13
featrue=5
hidenfeatrue=10

model=Sequential()
model.add( LSTM(hidenfeatrue,input_shape=(time_step,featrue)))
model.summary()

输出:

  1. Layer (type) Output Shape Param #
  2. =====================================================================
  3. lstm_8 (LSTM) (None, 10) 640
  4. =====================================================================
  5. Total params: 640
  6. Trainable params: 640
  7. Non-trainable params: 0

Attention: 

从矩阵角度理解self-attention - 知乎:

仅定义q和k两个够吗?可能也还是不够的。找出来的关系是要用的,不用等于白找。权重a 是要对输入信息做加权,才能体现找到的关系的价值的。那跟输入直接加权行吗?这么做也不是不行,就是显得直接和生硬了点。所以又定义了个v。要知道,v和q、k一样,都是通过系数矩阵对输入a做乘法得到的。所以定义了个v大概等于又对a加了一层可以学习的参数,然后对经过参数调整后的a再去做加权、把通过注意力机制学到的关系给用上。所以,通过a和v的乘法进行加权操作,最终得到输出o。
链接:https://www.zhihu.com/question/325839123/answer/1903376265

假如一个男生B,面对许多个潜在交往对象B1,B2,B3...,他想知道自己谁跟自己最匹配,应该把最多的注意力放在哪一个上。那么他需要这么做:
1、他要把自己的实际条件用某种方法表示出来,这就是Value;
2、他要定一个自己期望对象的标准,就是Query;
3、别人也有期望对象标准的,他要给出一个供别人参考的数据,当然不能直接用自己真实的条件,总要包装一下,这就是Key;
4、他用自己的标准去跟每一个人的Key比对一下(Q*K),当然也可以跟自己比对,然后用softmax求出权重,就知道自己的注意力应该放在谁身上了

 

 单头 head 的attention:

 

 Mask : 理解

对于Transformer中的mask理解_weixin_44729115的博客-CSDN博客

1. encoder mask:

在这里插入图片描述

首先确定mask的形状是 batch_size*seq_length
对于小于最大长度的句子进行补0操作,对于大于最大长度的句子进行截断操作。

在这里插入图片描述 

2. decoder端的mask 

在这里插入图片描述

 decoder的mask形状是一个下三角矩阵,解码器在翻译单词时只能看到前面已经翻译的单词,不能看到后面的答案,所以使用一个下三角矩阵进行遮盖,每一次解码只给解码器看前面的单词。

def subsequentmask(size):
    "Mask out subsequent positions."
    attn_shape = (1, size, size)
    subsequent_mask = np.triu(np.ones(attn_shape), k=1).astype('uint8')
    return subsequent_mask == 0

print(subsequentmask(5))

>>

[[[ True False False False False]
  [ True  True False False False]
  [ True  True  True False False]
  [ True  True  True  True False]
  [ True  True  True  True  True]]]

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值