【发布时间】:2022-08-19 01:53:56
【问题描述】:
尝试为 GLCM 构建一个自定义 keras 层,这需要在进行进一步计算之前计算像素对,这让我得到了下面的错误。该算法在 keras 上下文之外运行良好。
错误 1
Only integers, slices (`:`), ellipsis (`...`), tf.newaxis (`None`) and scalar tf.int32/tf.int64 tensors are valid indices, got <tf.Tensor \'glcm_layer_impl/strided_slice:0\' shape=(150, 1) dtype=float32>
我知道,循环末尾的i,j 不是图形模式下具有像素值的整数,而是 SliceTensors。所以我尝试将其转换为int(),但只是为了意识到我得到了一个 CastTensor 对象。
层定义:
class GLCMLayer(keras.layers.Layer):
def __init__(self, greylevels=32, angle=0, name=None, **kwargs):
self.greylevels = greylevels
self.angle = angle
super(GLCMLayer, self).__init__(name=name, **kwargs)
def _glcm_loop(self, image, angle, levels, out):
rows = image.shape[1] # batch dimension is first entry
cols = image.shape[2]
offset_row = round(sin(angle))
offset_col = round(cos(angle))
start_row = max(0, -offset_row)
end_row = min(rows, rows - offset_row)
start_col = max(0, -offset_col)
end_col = min(cols, cols - offset_col)
for r in range(start_row, end_row):
for c in range(start_col, end_col):
i = image[r, c]
row = r + offset_row
col = c + offset_col
j = image[row, col]
out[i, j, 0] += 1 # here the errors occur
def call(self, inputs):
P = tf.experimental.numpy.zeros((self.greylevels, self.greylevels, 1), dtype=np.uint32) # using np.zeros() will yield a different error
self._glcm_loop(inputs, self.angle, self.greylevels, P)
return P
尝试不同的方式喜欢eval() 和this,也没有帮助我。
然后我尝试out[0,0,0]+=1 只是想看看它是否有效,但没有:
错误 2
\'Tensor\' object does not support item assignment
现在我了解到张量是不可变的。我尝试了其他方法来解决它:使用 tf.Variables 或使用纯 python 对象like this。然而,我想不出一种方法来创建一个列表并为每对找到的像素增加一个计数器,因为或错误 1。
无论哪种方式,它总是以第一个或第二个错误结束。 This 似乎是最好的主意,绕过它。主要来自 OOP 编程,我想不出我需要的所有 tf 函数。我会尝试去了解这些函数,但也许有人已经有了在没有 tf 函数的情况下相处的想法。
非常感谢有关如何解决上述错误的任何帮助。 让我知道是否有超出我可以添加到这个问题的内容。
输入图像是灰度的,有 32 个值,并且是批处理的。
型号定义:
inputs = keras.Input(shape=input_shape)
model = GLCMLayerImpl()(inputs)
model = layers.Flatten()(model)
model = layers.Dense(64, activation=\"relu\")(model)
outputs = layers.Dense(num_classes, activation=\"softmax\")(model)
标签: python tensorflow keras deep-learning glcm