Tensorflow 卷积的梯度反向传播过程


Posted in Python onFebruary 10, 2020

一. valid卷积的梯度

我们分两种不同的情况讨论valid卷积的梯度:第一种情况,在已知卷积核的情况下,对未知张量求导(即对张量中每一个变量求导);第二种情况,在已知张量的情况下,对未知卷积核求导(即对卷积核中每一个变量求导)

1.已知卷积核,对未知张量求导

我们用一个简单的例子理解valid卷积的梯度反向传播。假设有一个3x3的未知张量x,以及已知的2x2的卷积核K

Tensorflow提供函数tf.nn.conv2d_backprop_input实现了valid卷积中对未知变量的求导,以上示例对应的代码如下:

import tensorflow as tf

# 卷积核
kernel=tf.constant(
  [
    [[[3]],[[4]]],
    [[[5]],[[6]]]
  ]
  ,tf.float32
)

# 某一函数针对sigma的导数
out=tf.constant(
  [
    [
      [[-1],[1]],
      [[2],[-2]]
    ]
  ]
  ,tf.float32
)


# 针对未知变量的导数的方向计算
inputValue=tf.nn.conv2d_backprop_input((1,3,3,1),kernel,out,[1,1,1,1],'VALID')

session=tf.Session()

print(session.run(inputValue))
[[[[ -3.]
  [ -1.]
  [ 4.]]

 [[ 1.]
  [ 1.]
  [ -2.]]

 [[ 10.]
  [ 2.]
  [-12.]]]]

2.已知输入张量,对未知卷积核求导

假设已知3行3列的张量x和未知的2行2列的卷积核K

Tensorflow提供函数tf.nn.conv2d_backprop_filter实现valid卷积对未知卷积核的求导,以上示例的代码如下:

import tensorflow as tf

# 输入张量
x=tf.constant(
  [
    [
      [[1],[2],[3]],
      [[4],[5],[6]],
      [[7],[8],[9]]
    ]
  ]
  ,tf.float32
)

# 某一个函数F对sigma的导数
partial_sigma=tf.constant(
  [
    [
      [[-1],[-2]],
      [[-3],[-4]]
    ]
  ]
  ,tf.float32
)

# 某一个函数F对卷积核k的导数
partial_sigma_k=tf.nn.conv2d_backprop_filter(x,(2,2,1,1),partial_sigma,[1,1,1,1],'VALID')

session=tf.Session()

print(session.run(partial_sigma_k))
[[[[-37.]]

 [[-47.]]]


 [[[-67.]]

 [[-77.]]]]

二. same卷积的梯度

1.已知卷积核,对输入张量求导

假设有3行3列的已知张量x,2行2列的未知卷积核K

import tensorflow as tf

# 卷积核
kernel=tf.constant(
  [
    [[[3]],[[4]]],
    [[[5]],[[6]]]
  ]
  ,tf.float32
)

# 某一函数针对sigma的导数
partial_sigma=tf.constant(
  [
    [
      [[-1],[1],[3]],
      [[2],[-2],[-4]],
      [[-3],[4],[1]]
    ]
  ]
  ,tf.float32
)


# 针对未知变量的导数的方向计算
partial_x=tf.nn.conv2d_backprop_input((1,3,3,1),kernel,partial_sigma,[1,1,1,1],'SAME')

session=tf.Session()

print(session.run(inputValue))
[[[[ -3.]
  [ -1.]
  [ 4.]]

 [[ 1.]
  [ 1.]
  [ -2.]]

 [[ 10.]
  [ 2.]
  [-12.]]]]

2.已知输入张量,对未知卷积核求导

假设已知3行3列的张量x和未知的2行2列的卷积核K

import tensorflow as tf

# 卷积核
x=tf.constant(
  [
    [
      [[1],[2],[3]],
      [[4],[5],[6]],
      [[7],[8],[9]]
    ]
  ]
  ,tf.float32
)

# 某一函数针对sigma的导数
partial_sigma=tf.constant(
  [
    [
      [[-1],[-2],[1]],
      [[-3],[-4],[2]],
      [[-2],[1],[3]]
    ]
  ]
  ,tf.float32
)


# 针对未知变量的导数的方向计算
partial_sigma_k=tf.nn.conv2d_backprop_filter(x,(2,2,1,1),partial_sigma,[1,1,1,1],'SAME')

session=tf.Session()

print(session.run(partial_sigma_k))
[[[[ -1.]]

 [[-54.]]]


 [[[-43.]]

 [[-77.]]]]

以上这篇Tensorflow 卷积的梯度反向传播过程就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中将字典转换为XML以及相关的命名空间解析
Oct 15 Python
Python爬虫代理IP池实现方法
Jan 05 Python
Python解惑之整数比较详解
Apr 24 Python
python如何实现异步调用函数执行
Jul 08 Python
Python列表的切片实例讲解
Aug 20 Python
PageFactory设计模式基于python实现
Apr 14 Python
使用Python-OpenCV消除图像中孤立的小区域操作
Jul 05 Python
python实现将中文日期转换为数字日期
Jul 14 Python
python设置中文界面实例方法
Oct 27 Python
如何用python清洗文件中的数据
Jun 18 Python
Python面向对象编程之类的概念
Nov 01 Python
Anaconda安装pytorch和paddle的方法步骤
Apr 03 Python
tensorflow 实现自定义梯度反向传播代码
Feb 10 #Python
用Python做一个久坐提醒小助手的示例代码
Feb 10 #Python
Python3 元组tuple入门基础
Feb 09 #Python
Python3列表List入门知识附实例
Feb 09 #Python
Python 动态变量名定义与调用方法
Feb 09 #Python
python函数定义和调用过程详解
Feb 09 #Python
详解python 破解网站反爬虫的两种简单方法
Feb 09 #Python
You might like
PHP echo,print,printf,sprintf函数之间的区别与用法详解
2013/11/27 PHP
thinkphp文件处理类Dir.class.php的用法分析
2014/12/08 PHP
PHP封装的数据库保存session功能类
2016/07/11 PHP
PHP仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(上)
2017/05/26 PHP
Discuz! 6.1_jQuery兼容问题
2008/09/23 Javascript
JS 创建对象(常见的几种方法)
2008/11/03 Javascript
javascript操作cookie的文章(设置,删除cookies)
2010/04/01 Javascript
js判断手机号运营商的方法
2015/10/23 Javascript
移动手机APP手指滑动切换图片特效附源码下载
2015/11/30 Javascript
理解javascript封装
2016/02/23 Javascript
JavaScript鼠标事件,点击鼠标右键,弹出div的简单实例
2016/08/03 Javascript
JS碰撞运动实现方法详解
2016/12/15 Javascript
微信小程序 Tab页切换更新数据
2017/01/05 Javascript
解析Angular 2+ 样式绑定方式
2018/01/15 Javascript
AngularJS 前台分页实现的示例代码
2018/06/07 Javascript
JavaScript原型对象、构造函数和实例对象功能与用法详解
2018/08/04 Javascript
node中的session的具体使用
2018/09/14 Javascript
Vue数据驱动表单渲染,轻松搞定form表单
2019/07/19 Javascript
vue 实现v-for循环回来的数据动态绑定id
2019/11/07 Javascript
JavaScript Event Loop相关原理解析
2020/06/10 Javascript
[01:18]PWL开团时刻DAY10——一拳超人
2020/11/11 DOTA
Python解析树及树的遍历
2016/02/03 Python
Python编程之变量赋值操作实例分析
2017/07/24 Python
Python使用flask框架操作sqlite3的两种方式
2018/01/31 Python
Python入门必须知道的11个知识点
2018/03/21 Python
浅谈python requests 的put, post 请求参数的问题
2019/01/02 Python
python ChainMap的使用和说明详解
2019/06/11 Python
Python中断多重循环的思路总结
2019/10/04 Python
Jupyter notebook运行Spark+Scala教程
2020/04/10 Python
Python3将ipa包中的文件按大小排序
2020/04/17 Python
python中time包实例详解
2021/02/02 Python
金山毒霸系列的笔试题
2013/04/13 面试题
音乐教育专业自荐信
2014/09/18 职场文书
干货:如何写好观后感 !
2019/05/21 职场文书
浅谈JS的二进制家族
2021/05/09 Javascript
python区块链持久化和命令行接口实现简版
2022/05/25 Python