【问题标题】:Errors: Only integers, slices [...] and scalar tf.int32/tf.int64 tensors are valid indices // Tensor object does not support item assignment错误:只有整数、切片 [...] 和标量 tf.int32/tf.int64 张量是有效的索引 // 张量对象不支持项分配
【发布时间】: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


    【解决方案1】:

    我也有同样的问题。你找到解决办法了吗?我想构建一个自定义池化层,它接受大小为 [None,28,10] 的输入并返回与输入相同维度的输出,不同之处在于输出的第二维中的第 i 个元素是输入的第二维中特定元素的最大值。

    假设输入是 inp=[None,28,10] 和 indexlist=[[1,2,3],[1,1,2,3,7],[10,5,5],... ],我希望输出为 output=[None,a_i,10] 其中 a_i=max(inp[:,indexlist_i,:] for i =1,...,28)

    【讨论】:

      猜你喜欢
      • 2022-01-09
      • 1970-01-01
      • 2021-12-05
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-20
      • 2016-10-08
      相关资源
      最近更新 更多