【发布时间】:2018-07-23 12:17:04
【问题描述】:
我是 Keras 的新手,我正在尝试在 Keras 中实现去相关的批处理 Norm 论文 (https://arxiv.org/abs/1804.08450) 作为学习体验。该层与标准批处理规范非常相似,但有一些额外的组件。
我们现在不是将输入数据居中到每一层并通过方差进行归一化,而是将数据居中并应用白化变换,该变换是通过对协方差矩阵进行特征值分解来计算的。
整个过程在论文中清楚地列出(算法 1,第 5 页)并且仅由大约 5 个方程组成,我在下面的代码中标记了它们的实现。我成功地重新实现了标准批处理规范层,但是当我合并白化程序时,我得到了 NaN 损失和低准确度。
我想知道是否应该遵循任何建议来调试此代码。我不确定我是否犯了维度错误或错误地实现了方程式,但我们将不胜感激。
如果您有兴趣,这里是代码(已编辑以包括 Daniel Möller 的更正)。该层的输入是一个维度张量(batch_size 高度宽度通道)。
input_shape = K.int_shape(inputs) # (batch_size height width channels)
# unroll all dimensions except feature maps dim (c X hwb)
pool_shape = (-1, input_shape[-1])
x = K.reshape(x,pool_shape)
x = K.permute_dimensions(x, (1,0)) #if you do want to invert the dimensions
mean = K.mean(x,1,keepdims=True)
# standard batch norm
#stddev = K.std(x,1,keepdims=True) + self.epsilon
#normed = (x - mean) / stddev
#normed = K.reshape(normed,((-1,)+ input_shape[1:]))
# center inputs
centered_inputs = x - mean
#vvvvvERROR SOMEWHERE IN HEREvvvvv#
# compute covariance matrix for reshaped inputs xxt
covar = K.batch_dot(K.expand_dims(x, axis=-1), K.expand_dims(x, axis=-1),axes=(2,2))
# fuzz covariance matrix to prevent singularity
covar = covar + self.epsilon
# execute eigenvalue decomposition
#Lambda, D,_ = tf.svd(covar,compute_uv=True)
Lambda, D = tf.self_adjoint_eig(covar)
Lambda = tf.linalg.diag(Lambda)
# calculate PCA-whitening matrix 1/sqrt(L) * D^T
U = K.batch_dot(1. / K.sqrt(Lambda), D, axes=(2,2))
# calculate PCA-whitened activation x_a = U(x - \mu)
x_a = K.batch_dot(U, centered_inputs,axes=(2,1))
# calculate ZCA-whitened output Dx_a
x_whitened = K.batch_dot(D, x_a)
#^^^^^ERROR SOMEWHERE IN HERE^^^^^#
# reshape whitened activations back to input dimension
x_normed = K.permute_dimensions(x_whitened,(1,0)) # permute back to (bhw X c)
x_normed = K.reshape(x_normed,((-1,), input_shape[1:])) # reroll dimensions
【问题讨论】:
标签: python keras keras-layer batch-normalization