tensorflow反卷积:使用双线性插值获取初始化权重

tensorflow反卷积:使用双线性插值获取初始化权重

双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值,常用于初始化卷积核的权重,是FCN语义分割必须进行的一步(如果选取高斯初始化或其他初始化方式,可能导致最后无法收敛)

tensorflow并没有直接给出双线性插值的初始化方式,需要我们自己动手写一下:

代码

from math import ceil
import tensorflow as tf
import numpy as np


def get_deconv_filter(f_shape):
    # 双线性插值
    width = f_shape[0]
    height = f_shape[1]
    f = ceil(width/2.0)
    c = (2 * f - 1 - f % 2) / (2.0 * f)

    bilinear = np.zeros([f_shape[0], f_shape[1]])

    for x in range(width):
        for y in range(height):
            value = (1 - abs(x / f - c)) * (1 - abs(y / f - c))
            bilinear[x, y] = value

    weights = np.zeros(f_shape)

    for i in range(f_shape[2]):
        weights[:, :, i, i] = bilinear

    init = tf.constant_initializer(value=weights,
                                   dtype=tf.float32)

    return tf.get_variable(name="up_filter", initializer=init,
                           shape=weights.shape)

这样就获得了一个双线性插值初始化的(反)卷积核;

weights = get_deconv_filter(f_shape)
            
deconv = tf.nn.conv2d_transpose(bottom, weights, output_shape,strides=strides, padding='SAME')                                       

再通过tf.nn.conv2d_transpose函数就生成了一个反卷积层。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BIT可达鸭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值