TensorFlow实现条件批归一化(Conditional Batch Normalization)

class ConditionBatchNorm(Layer):

def build(self, input_shape):

self.input_size = input_shape

n, h, w, c = input_shape

self.gamma = self.add_weight(shape=[self.n_class, c],

initializer=‘zeros’, trainable=True, name=‘gamma’)

self.moving_mean = self.add_weight(shape=[1, 1, 1, c],

initializer=‘zeros’, trainable=False, name=‘moving_mean’)

self.moving_var = self.add_weight(shape=[1, 1, 1, c],

initializer=‘zeros’, trainable=False, name=‘moving_var’)

当运行条件批归一化时,为标签检索正确的 β \beta β 和 γ \gamma γ。这是使用 tf.gather(self.beta, labels) 完成的,它在概念上等效于 beta = self.beta[labels],如下所示:

def call(self, x, labels, trainable=False):

beta = tf.gather(self.beta, labels)

beta = tf.expand_dims(beta, 1)

gamma = tf.gather(self.gamma, labels)

gamma = tf.expand_dims(gamma, 1)

if training:

mean, var = tf.nn.moments(x, axes=(0,1,2), keepdims=True)

self.moving_mean.assign(self.decay * self.moving_mean + (1-self.decay)*mean)

self.moving_var.assign(self.decay * self.moving_var + (1-self.decay)*var)

output = tf.nn.batch_normalization(x, mean, var, beta, gamma, self.eps)

else:

output = tf.nn.batch_normalization(x, self.moving_mean, self.moving_var, beta, gamma, self.eps)

return output

在残差块中应用条件批归一化


条件批归一化的使用方式与批归一化相同,作为示例,现在我们将条件批归一化添加到残差块中:

class ResBlock(Layer):

def build(self, input_shape):

input_filter = input_shape[-1]

self.conv_1 = Conv2D(self.filters, 3, padding=‘same’, name=‘conv2d_1’)

self.conv_2 = Conv2D(self.filters, 3, padding=‘same’, name=‘conv2d_2’)

self.cbn_1 = ConditionBatchNorm(self.n_class)

self.cbn_2 = ConditionBatchNorm(self.n_class)

self.learned_skip = False

if self.filters != input_filter:

self.learned_skip = True

self.conv_3 = Conv2D(self.filters, 1, padding=‘same’, name=‘conv2d_3’)

self.cbn_3 = ConditionBatchNorm(self.n_class)

以下是使用条件批归一化残差块的前向计算代码:

def call(self, input_tensor, labels):

x = self.conv_1(input_tensor)

x = self.cbn_1(x, labels)

x = tf.nn.leaky_relu(x, 0.2)

x = self.conv_2(x)

x = tf.cbn_2(x, labels)

x = tf.nn.leaky_relu(x, 0.2)

if self.learned_skip:

skip = self.conv_3(input_tensor)

skip = self.cbn_3(skip, labels)

最后

Python崛起并且风靡,因为优点多、应用领域广、被大牛们认可。学习 Python 门槛很低,但它的晋级路线很多,通过它你能进入机器学习、数据挖掘、大数据,CS等更加高级的领域。Python可以做网络应用,可以做科学计算,数据分析,可以做网络爬虫,可以做机器学习、自然语言处理、可以写游戏、可以做桌面应用…Python可以做的很多,你需要学好基础,再选择明确的方向。这里给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

👉Python所有方向的学习路线👈

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

👉Python必备开发工具👈

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

👉Python全套学习视频👈

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

👉实战案例👈

学python就与学数学一样,是不能只看书不做题的,直接看步骤和答案会让人误以为自己全都掌握了,但是碰到生题的时候还是会一筹莫展。

因此在学习python的过程中一定要记得多动手写代码,教程只需要看一两遍即可。

👉大厂面试真题👈

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值