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刷投票的脚本实现代码
Nov 08 Python
Python使用正则表达式抓取网页图片的方法示例
Apr 21 Python
解决Django数据库makemigrations有变化但是migrate时未变动问题
May 30 Python
对Python subprocess.Popen子进程管道阻塞详解
Oct 29 Python
pandas dataframe添加表格框线输出的方法
Feb 08 Python
Python迭代器模块itertools使用原理解析
Dec 11 Python
python 求10个数的平均数实例
Dec 16 Python
pycharm中导入模块错误时提示Try to run this command from the system terminal
Mar 26 Python
Python如何解除一个装饰器
Aug 07 Python
python批量修改文件名的示例
Sep 27 Python
详解numpy.ndarray.reshape()函数的参数问题
Oct 13 Python
python多次执行绘制条形图
Apr 20 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 $_FILES函数详解
2011/03/09 PHP
PHP中如何调用webservice的实例参考
2013/04/25 PHP
PHP登陆后跳转到登陆前页面实现思路及代码
2014/01/17 PHP
php操作XML、读取数据和写入数据的实现代码
2014/08/15 PHP
浅谈php函数serialize()与unserialize()的使用方法
2014/08/19 PHP
thinkphp微信开之安全模式消息加密解密不成功的解决办法
2015/12/02 PHP
PHP实现linux命令tail -f
2016/02/22 PHP
可以把编码转换成 gb2312编码lib.UTF8toGB2312.js
2007/08/21 Javascript
IE6/7/8/9不支持exec的简写方式
2011/05/25 Javascript
Javascript异步编程模型Promise模式详细介绍
2014/05/08 Javascript
jquery加载图片时以淡入方式显示的方法
2015/01/14 Javascript
jQuery的animate函数实现图文切换动画效果
2015/05/03 Javascript
基于jquery实现放大镜效果
2015/08/17 Javascript
基于jQuery实现网页打印功能
2015/12/01 Javascript
JavaScript中通过提示框跳转页面的方法
2016/02/14 Javascript
Bootstrap CSS布局之列表
2016/12/15 Javascript
Node 升级到最新稳定版的方法分享
2018/05/17 Javascript
Vue源码分析之Vue实例初始化详解
2019/08/25 Javascript
利用打码兔和超人打码自封装的打码类分享
2014/03/16 Python
Python字符和字符值(ASCII或Unicode码值)转换方法
2015/05/21 Python
举例讲解Django中数据模型访问外键值的方法
2015/07/21 Python
Python脚本实现虾米网签到功能
2016/04/12 Python
python入门教程之识别验证码
2017/03/04 Python
Python代码使用 Pyftpdlib实现FTP服务器功能
2019/07/22 Python
对Django的restful用法详解(自带的增删改查)
2019/08/28 Python
pytorch使用 to 进行类型转换方式
2020/01/08 Python
python pandas.DataFrame.loc函数使用详解
2020/03/26 Python
Python日志打印里logging.getLogger源码分析详解
2021/01/17 Python
Java面向对象面试题
2016/12/26 面试题
市场专员岗位职责
2014/02/14 职场文书
名企HR怎样看待求职信
2014/02/23 职场文书
房地产公司见习自我鉴定
2014/04/28 职场文书
根叔历年演讲稿
2014/05/20 职场文书
2016小学教师读书心得体会
2016/01/13 职场文书
如何用JavaScript实现一个数组惰性求值库
2021/05/05 Javascript
美国运营商 T-Mobile 以 117.83Mb/s 的速度排第一位
2022/04/21 数码科技