元学习论文总结||小样本学习论文总结

2017-2019年计算机视觉顶会文章收录 AAAI2017-2019 CVPR2017-2019 ECCV2018 ICCV2017-2019 ICLR2017-2019 NIPS2017-2019


博客详细推导了LSTM模型的前向和反向传播,下面主要展示源码实现。

#!/usr/bin/env python
# -*- coding: UTF-8 -*-import matplotlib.pyplot as plt
import numpy as np
from cnn import element_wise_op
from activators import SigmoidActivator, TanhActivator, IdentityActivatorclass LstmLayer(object):def __init__(self, input_width, state_width, learning_rate):self.input_width = input_widthself.state_width = state_widthself.learning_rate = learning_rate# 门的激活函数self.gate_activator = SigmoidActivator()# 输出的激活函数self.output_activator = TanhActivator()# 当前时刻初始化为t0self.times = 0       # 各个时刻的单元状态向量cself.c_list = self.init_state_vec()# 各个时刻的输出向量hself.h_list = self.init_state_vec()# 各个时刻的遗忘门fself.f_list = self.init_state_vec()# 各个时刻的输入门iself.i_list = self.init_state_vec()# 各个时刻的输出门oself.o_list = self.init_state_vec()# 各个时刻的即时状态c~self.ct_list = self.init_state_vec()# 遗忘门权重矩阵Wfh, Wfx, 偏置项bfself.Wfh, self.Wfx, self.bf = (self.init_weight_mat())# 输入门权重矩阵Wfh, Wfx, 偏置项bfself.Wih, self.Wix, self.bi = (self.init_weight_mat())# 输出门权重矩阵Wfh, Wfx, 偏置项bfself.Woh, self.Wox, self.bo = (self.init_weight_mat())# 单元状态权重矩阵Wfh, Wfx, 偏置项bfself.Wch, self.Wcx, self.bc = (self.init_weight_mat())def init_state_vec(self):'''初始化保存状态的向量'''state_vec_list = []state_vec_list.append(np.zeros((self.state_width, 1)))return state_vec_listdef init_weight_mat(self):'''初始化权重矩阵'''Wh = np.random.uniform(-1e-4, 1e-4,(self.state_width, self.state_width))Wx = np.random.uniform(-1e-4, 1e-4,(self.state_width, self.input_width))b = np.zeros((self.state_width, 1))return Wh, Wx, bdef forward(self, x):'''根据式1-式6进行前向计算'''self.times += 1# 遗忘门fg = self.calc_gate(x, self.Wfx, self.Wfh, self.bf, self.gate_activator)self.f_list.append(fg)# 输入门ig = self.calc_gate(x, self.Wix, self.Wih,self.bi, self.gate_activator)self.i_list.append(ig)# 输出门og = self.calc_gate(x, self.Wox, self.Woh,self.bo, self.gate_activator)self.o_list.append(og)# 即时状态ct = self.calc_gate(x, self.Wcx, self.Wch,self.bc, self.output_activator)self.ct_list.append(ct)# 单元状态c = fg * self.c_list[self.times - 1] + ig * ctself.c_list.append(c)# 输出h = og * self.output_activator.forward(c)self.h_list.append(h)def calc_gate(self, x, Wx, Wh, b, activator):'''计算门'''h = self.h_list[self.times - 1] # 上次的LSTM输出net = np.dot(Wh, h) + np.dot(Wx, x) + bgate = activator.forward(net)return gatedef backward(self, x, delta_h, activator):'''实现LSTM训练算法'''self.calc_delta(delta_h, activator)self.calc_gradient(x)def update(self):'''按照梯度下降,更新权重'''self.Wfh -= self.learning_rate * self.Whf_gradself.Wfx -= self.learning_rate * self.Whx_gradself.bf -= self.learning_rate * self.bf_gradself.Wih -= self.learning_rate * self.Whi_gradself.Wix -= self.learning_rate * self.Whi_gradself.bi -= self.learning_rate * self.bi_gradself.Woh -= self.learning_rate * self.Wof_gradself.Wox -= self.learning_rate * self.Wox_gradself.bo -= self.learning_rate * self.bo_gradself.Wch -= self.learning_rate * self.Wcf_gradself.Wcx -= self.learning_rate * self.Wcx_gradself.bc -= self.learning_rate * self.bc_graddef calc_delta(self, delta_h, activator):# 初始化各个时刻的误差项self.delta_h_list = self.init_delta()  # 输出误差项self.delta_o_list = self.init_delta()  # 输出门误差项self.delta_i_list = self.init_delta()  # 输入门误差项self.delta_f_list = self.init_delta()  # 遗忘门误差项self.delta_ct_list = self.init_delta() # 即时输出误差项# 保存从上一层传递下来的当前时刻的误差项self.delta_h_list[-1] = delta_h# 迭代计算每个时刻的误差项for k in range(self.times, 0, -1):self.calc_delta_k(k)def init_delta(self):'''初始化误差项'''delta_list = []for i in range(self.times + 1):delta_list.append(np.zeros((self.state_width, 1)))return delta_listdef calc_delta_k(self, k):'''根据k时刻的delta_h,计算k时刻的delta_f、delta_i、delta_o、delta_ct,以及k-1时刻的delta_h'''# 获得k时刻前向计算的值ig = self.i_list[k]og = self.o_list[k]fg = self.f_list[k]ct = self.ct_list[k]c = self.c_list[k]c_prev = self.c_list[k-1]tanh_c = self.output_activator.forward(c)delta_k = self.delta_h_list[k]# 根据式9计算delta_odelta_o = (delta_k * tanh_c * self.gate_activator.backward(og))delta_f = (delta_k * og * (1 - tanh_c * tanh_c) * c_prev *self.gate_activator.backward(fg))delta_i = (delta_k * og * (1 - tanh_c * tanh_c) * ct *self.gate_activator.backward(ig))delta_ct = (delta_k * og * (1 - tanh_c * tanh_c) * ig *self.output_activator.backward(ct))delta_h_prev = (np.dot(delta_o.transpose(), self.Woh) +np.dot(delta_i.transpose(), self.Wih) +np.dot(delta_f.transpose(), self.Wfh) +np.dot(delta_ct.transpose(), self.Wch)).transpose()# 保存全部delta值self.delta_h_list[k-1] = delta_h_prevself.delta_f_list[k] = delta_fself.delta_i_list[k] = delta_iself.delta_o_list[k] = delta_oself.delta_ct_list[k] = delta_ctdef calc_gradient(self, x):# 初始化遗忘门权重梯度矩阵和偏置项self.Wfh_grad, self.Wfx_grad, self.bf_grad = (self.init_weight_gradient_mat())# 初始化输入门权重梯度矩阵和偏置项self.Wih_grad, self.Wix_grad, self.bi_grad = (self.init_weight_gradient_mat())# 初始化输出门权重梯度矩阵和偏置项self.Woh_grad, self.Wox_grad, self.bo_grad = (self.init_weight_gradient_mat())# 初始化单元状态权重梯度矩阵和偏置项self.Wch_grad, self.Wcx_grad, self.bc_grad = (self.init_weight_gradient_mat())# 计算对上一次输出h的权重梯度for t in range(self.times, 0, -1):# 计算各个时刻的梯度(Wfh_grad, bf_grad,Wih_grad, bi_grad,Woh_grad, bo_grad,Wch_grad, bc_grad) = (self.calc_gradient_t(t))# 实际梯度是各时刻梯度之和self.Wfh_grad += Wfh_gradself.bf_grad += bf_gradself.Wih_grad += Wih_gradself.bi_grad += bi_gradself.Woh_grad += Woh_gradself.bo_grad += bo_gradself.Wch_grad += Wch_gradself.bc_grad += bc_grad# 计算对本次输入x的权重梯度xt = x.transpose()self.Wfx_grad = np.dot(self.delta_f_list[-1], xt)self.Wix_grad = np.dot(self.delta_i_list[-1], xt)self.Wox_grad = np.dot(self.delta_o_list[-1], xt)self.Wcx_grad = np.dot(self.delta_ct_list[-1], xt)def init_weight_gradient_mat(self):'''初始化权重矩阵'''Wh_grad = np.zeros((self.state_width,self.state_width))Wx_grad = np.zeros((self.state_width,self.input_width))b_grad = np.zeros((self.state_width, 1))return Wh_grad, Wx_grad, b_graddef calc_gradient_t(self, t):'''计算每个时刻t权重的梯度'''h_prev = self.h_list[t-1].transpose()Wfh_grad = np.dot(self.delta_f_list[t], h_prev)bf_grad = self.delta_f_list[t]Wih_grad = np.dot(self.delta_i_list[t], h_prev)bi_grad = self.delta_f_list[t]Woh_grad = np.dot(self.delta_o_list[t], h_prev)bo_grad = self.delta_f_list[t]Wch_grad = np.dot(self.delta_ct_list[t], h_prev)bc_grad = self.delta_ct_list[t]return Wfh_grad, bf_grad, Wih_grad, bi_grad, \Woh_grad, bo_grad, Wch_grad, bc_graddef reset_state(self):# 当前时刻初始化为t0self.times = 0       # 各个时刻的单元状态向量cself.c_list = self.init_state_vec()# 各个时刻的输出向量hself.h_list = self.init_state_vec()# 各个时刻的遗忘门fself.f_list = self.init_state_vec()# 各个时刻的输入门iself.i_list = self.init_state_vec()# 各个时刻的输出门oself.o_list = self.init_state_vec()# 各个时刻的即时状态c~self.ct_list = self.init_state_vec()def data_set():x = [np.array([[1], [2], [3]]),np.array([[2], [3], [4]])]d = np.array([[1], [2]])return x, ddef gradient_check():'''梯度检查'''# 设计一个误差函数,取所有节点输出项之和error_function = lambda o: o.sum()lstm = LstmLayer(3, 2, 1e-3)# 计算forward值x, d = data_set()lstm.forward(x[0])lstm.forward(x[1])# 求取sensitivity mapsensitivity_array = np.ones(lstm.h_list[-1].shape,dtype=np.float64)# 计算梯度lstm.backward(x[1], sensitivity_array, IdentityActivator())# 检查梯度epsilon = 10e-4for i in range(lstm.Wfh.shape[0]):for j in range(lstm.Wfh.shape[1]):lstm.Wfh[i,j] += epsilonlstm.reset_state()lstm.forward(x[0])lstm.forward(x[1])err1 = error_function(lstm.h_list[-1])lstm.Wfh[i,j] -= 2*epsilonlstm.reset_state()lstm.forward(x[0])lstm.forward(x[1])err2 = error_function(lstm.h_list[-1])expect_grad = (err1 - err2) / (2 * epsilon)lstm.Wfh[i,j] += epsilonprint 'weights(%d,%d): expected - actural %.4e - %.4e' % (i, j, expect_grad, lstm.Wfh_grad[i,j])return lstmdef test():l = LstmLayer(3, 2, 1e-3)x, d = data_set()l.forward(x[0])l.forward(x[1])l.backward(x[1], d, IdentityActivator())return l

LSTM模型的推导与实现相关推荐

  1. LSTM模型与前向反向传播算法

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 前  言 在循环神经网络(RNN)模型与前向反向传播算法中,我们总 ...

  2. 【直播】陈安东,但扬:CNN模型搭建、训练以及LSTM模型思路详解

    CNN模型搭建.训练以及LSTM模型思路详解 目前 Datawhale第24期组队学习 正在如火如荼的进行中.为了大家更好的学习"零基础入门语音识别(食物声音识别)"的课程设计者 ...

  3. Tree-Structured LSTM模型

    Tree-Structured LSTM模型 论文概要 由于能够保持按照时序的序列信息,LSTM(Long Short-Term Memory)网络在序列模型任务上能够有非常好的表现.但是该模型只能输 ...

  4. 漂亮,LSTM模型结构的可视化

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 最近在学习LSTM应用在时间序列的预测上,但是遇到一个很大的问题就 ...

  5. R使用LSTM模型构建深度学习文本分类模型(Quora Insincere Questions Classification)

    R使用LSTM模型构建深度学习文本分类模型(Quora Insincere Questions Classification) Long Short Term 网络-- 一般就叫做 LSTM --是一 ...

  6. LSTM模型(基于Keras框架)预测特定城市或者区域的太阳光照量实战

    LSTM模型(基于Keras框架)预测特定城市或者区域的太阳光照量实战 LSTM在解决序列预测的问题时非常强大,因为它们能够存储之前的信息. LSTM是一种时间递归神经网络,它出现的原因是为了解决RN ...

  7. 文本分类实战(七)—— Adversarial LSTM模型

    1 大纲概述 文本分类这个系列将会有十篇左右,包括基于word2vec预训练的文本分类,与及基于最新的预训练模型(ELMo,BERT等)的文本分类.总共有以下系列: word2vec预训练词向量 te ...

  8. CNN 与 LSTM 模型复杂度分析

    文章目录 0.关于Neural Network 的复杂度 1.CNN 模型复杂度 2.LSTM 模型复杂度 3.References Author: Cao Shengming Email: caos ...

  9. 时序数据-LSTM模型-实现用电量预测

    作者: 明天依旧可好 QQ交流群: 807041986 原文链接: https://mtyjkh.blog.csdn.net/article/details/115612319 深度学习系列:深度学习 ...

最新文章

  1. java下列语句正确的是_下列Java语句中,不正确的一项是( )。
  2. 不合法的偏移量 钉钉接口_钉钉服务端api接口使用
  3. 真香!你的 2019 年终总结已经出 - 请查收
  4. spring 事务 配置 多个
  5. canvas中文显示乱码 html5_浅析HTML5 Canvas的几种中文字体缩小方案
  6. 5分钟带你理解一致性Hash算法
  7. 大数据-----软件开发模型(详细讲解)
  8. (软件工程复习核心重点)第四章总体设计-第一节:总体设计基本概念和设计过程
  9. linux下时区的一些认识
  10. 解决 html5 input type='number' 类型可以输入e
  11. 内容分发网络CDN(互联网技术)
  12. Python模块下载常用地址
  13. Excel数据分析案例二——预测销售额
  14. cad有没有网页版_电脑中好用的免费CAD查看软件 满满的干货
  15. 国内外优秀的计算机视觉团队汇总|最新版
  16. 无线桥接 路由AP模式 后怎么进副路由器设置界面?
  17. IDEA社区版配置Spring Boot开发
  18. 台式机计算机不能睡眠,台式电脑为什么不能睡眠了?
  19. Object Detection Made Simpler by Eliminating Heuristic NMS
  20. 基于TCP的网络对战象棋--python

热门文章

  1. 有人爬了一万个购物网站,发现了1818个「年底大促」的商家小伎俩
  2. DJ logo图片 DJ logo设计
  3. gdb函数相关7——选择函数堆栈帧
  4. 罚函数 c语言,神题求解............
  5. java se安装_安装Java SE平台
  6. 北京信息科技大学计算机专业学科评估,北京信息科技大学怎么样好不好(全国排名-学科评估-一流专业-网友评价)...
  7. 前端----HTML 制作QQ空间练习
  8. 代码是如何编译成程序的?
  9. java如何绑核_pod绑核规则
  10. 惠普电脑如何重装Linux系统,如何把惠普下的Linux操作系统换为windows 7