• Tensorflow--卷积的梯度反向传播


    Tensorflow–卷积的梯度反向传播

    一.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.]]]]
    
  • 相关阅读:
    Mac实用快捷键大全
    Java 12 新特性概述
    java sdk官网直接下载地址
    使用SqlBulkCopy类实现导入excel表格
    框架页面高度自动刷新Javascript脚本
    从MyEclipse到IntelliJ IDEA ——让你脱键盘,全键盘操作
    带你走进EJB--将EJB发布为Webservice(1)
    带你走进EJB--将EJB发布为Webservice(2)
    poj 3042 Grazing on the Run
    算法导论:比较排序算法笔记
  • 原文地址:https://www.cnblogs.com/LQ6H/p/10343262.html
Copyright © 2020-2023  润新知