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 k-近邻算法实例分享
Jun 11 Python
python开发之IDEL(Python GUI)的使用方法图文详解
Nov 12 Python
Python常见加密模块用法分析【MD5,sha,crypt模块】
May 24 Python
python实现守护进程、守护线程、守护非守护并行
May 05 Python
django的聚合函数和aggregate、annotate方法使用详解
Jul 23 Python
pyenv与virtualenv安装实现python多版本多项目管理
Aug 17 Python
Python列表原理与用法详解【创建、元素增加、删除、访问、计数、切片、遍历等】
Oct 30 Python
使用Rasterio读取栅格数据的实例讲解
Nov 26 Python
Pyecharts地图显示不完成问题解决方案
May 11 Python
python新手学习使用库
Jun 11 Python
Python模块常用四种安装方式
Oct 20 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
收音机另类DIY - 纸巾盒做外壳
2021/03/02 无线电
单点登录 Ucenter示例分析
2013/10/29 PHP
php中session过期时间设置及session回收机制介绍
2014/05/05 PHP
用roll.js实现的图片自动滚动+鼠标触动的特效
2007/03/18 Javascript
一个判断email合法性的函数[非正则]
2008/12/09 Javascript
javascript showModalDialog 内跳转页面的问题
2010/11/25 Javascript
基于jquery的无刷新分页技术
2011/06/11 Javascript
javascript常用代码段搜集
2014/12/04 Javascript
JQuery动画与特效实例分析
2015/02/02 Javascript
jQuery添加和删除指定标签的方法
2015/12/16 Javascript
jQuery Mobile 触摸事件实例
2016/06/04 Javascript
Node.js的文件权限及读写flag详解
2016/10/11 Javascript
js实现适合新闻类图片的轮播效果
2017/02/05 Javascript
nodejs入门教程五:连接数据库的方法分析
2017/04/24 NodeJs
Bootstrap Table 删除和批量删除
2017/09/22 Javascript
Javascript网页抢红包外挂实现分享
2018/01/11 Javascript
element-ui中Table表格省市区合并单元格的方法实现
2019/08/07 Javascript
python读取浮点数和读取文本文件示例
2014/05/06 Python
Python操作列表之List.insert()方法的使用
2015/05/20 Python
django开发教程之利用缓存文件进行页面缓存的方法
2017/11/10 Python
Python之Scrapy爬虫框架安装及使用详解
2017/11/16 Python
pycharm远程调试openstack代码
2017/11/21 Python
Python常用模块之requests模块用法分析
2019/05/15 Python
python实现文件的备份流程详解
2019/06/18 Python
Python使用pyserial进行串口通信的实例
2019/07/02 Python
python deque模块简单使用代码实例
2020/03/12 Python
pandas使用之宽表变窄表的实现
2020/04/12 Python
编写一子程序,将一链表倒序,即使链表表尾变表头,表头变表尾
2016/02/10 面试题
应届生法律求职信
2013/10/22 职场文书
员工保密承诺书
2014/05/28 职场文书
酒店管理求职信
2014/06/09 职场文书
安全生产一岗双责责任书
2014/07/28 职场文书
党员演讲稿
2014/09/04 职场文书
MySQL EXPLAIN输出列的详细解释
2021/05/12 MySQL
python基础之类方法和静态方法
2021/10/24 Python
Redis特殊数据类型HyperLogLog基数统计算法讲解
2022/06/01 Redis