当前位置: 首页 > 知识库问答 >
问题:

我可以用什么方法调试这个keras层?

拓拔泓
2023-03-14

我是Keras的新手,正在尝试实施解相关批次规范文件(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

共有1个答案

施翰学
2023-03-14

假设您的代码由Keras层执行,无论是自定义层还是Lambda层。

我发现调试事物的最佳方法是创建一个只有该层的非常小的模型来查看它输出的内容。

如果问题出在代码中,那么我逐渐将返回语句移动到我认为错误的位置。

debugModel = Sequential()
debugModel.add(MyCustomLayer(...., input_shape=some_shape))

创建虚拟或有用数据:

data = loadOrCreateSomeData()

或者使用子模型从上一层获取数据:

subModel = Model(oldModel.inputs, oldModel.get_layer(nameOfATargetLayer).outputs)
data = subModel.predict(inputData)

在获得适合测试的数据后:

result = debugModel.predict(data)

未分组的标注

在以下几行中,您将在“重塑”中反转维度,这通常会将数据完全弄乱,因为维度失去了意义。(您没有进行正确的转置,只是以不同的方式重新组合了数字)

pool_shape = (input_shape[-1], np.prod(input_shape[1:-1])*self.batch_size) 
x = K.reshape(x,pool_shape) 

我想你应该试试这个:

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    
 类似资料:
  • 问题内容: 我不应该能够调用实例化对象的私有方法。我想知道为什么下面的代码有效。 我知道可以从类中访问私有方法。但是,如果类中的方法实例化了同一类的对象,则作用域规则是否不适用于该实例化的对象? 如本例所示,像main这样的静态方法可以访问类的非静态成员吗​​? 问题答案: 您的方法是的方法,因此可以调用的私有方法。 只是因为它是一个方法并不妨碍它表现得像为目的的方法,等等。 只是阻止的方法 等

  • 我必须在此处显示tableView中的所有数据,但其他细节不适合设备的大小。 正如您所看到的,除了“项目详细信息”之外,这些信息是可读的。但是客户给我说,“项目细节”可能比设备屏幕(iPhone o iPad||横向或纵向)更长。 如果项目详细信息的字符串比设备屏幕长,那么显示这些信息的最佳方法是什么?

  • 在传递给的方法的lambda中,我验证是否使用预期值调用了方法: 由于方法抛出一个,我被迫在lambda内部的调用周围添加一个无用的try/catch块。这是不必要的冗长。 我怎么能避免呢?

  • 问题内容: 我有一个使用XML和反射将 s 返回到另一个类的类。 通常,这些对象是外部对象的子字段,但有时我想即时生成它。我已经尝试过类似的方法,但无济于事。我相信这是因为Java不允许你访问进行反射的方法。 如果提供的方法失败,则失败。我可以通过制作方法来解决它,或者制作另一个类来派生它。 长话短说,我只是想知道是否存在一种通过反射访问方法的方法。 问题答案: 你可以使用反射调用私有方法。修改已

  • 我被困在第2天:hackerrank上的操作员问题。任务如下:给定一顿饭的餐费(一顿饭的基本成本)、小费百分比(餐费的百分比作为小费添加)和税收百分比(餐费的百分比作为税收添加),查找并打印餐费的总成本。将结果四舍五入到最接近的整数。 这是我的代码: 截图

  • 在Hugo模板中,我知道您可以使用< code>function param调用函数: 但在文档中,我还看到您还可以: 我从未遇到过这种调用函数的方式(在Ruby/Python等语言中)。这是围棋特有的,还是雨果特有的?这种调用函数的方式是如何调用的?另外,如果你有不止一种类型的论点,你能做到吗?