InvalidArgumentError:转置需要大小为0的向量

2024-04-29 12:49:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用以下代码在keras中创建了一个自定义层:

class drawLines(Layer):
    def __init__(self, output_dim, **kwargs):
        self.output_dim = output_dim
        super(drawLines, self, ).__init__(**kwargs)

    def build(self, input_shape):
        super(drawLines, self).build(input_shape)

    def call(self, input):
        xout = tf.py_function(image_tensor_func, [input], 'float32')
        xout.set_shape([input.shape[0], input.shape[1], input.shape[2], 1]) 
        return xout

    def compute_output_shape(self, input_shape):
        output_shape = list(input_shape)
        c_axis, h_axis, w_axis = 3, 1, 2
        output_shape[c_axis] = 1
        output_shape[h_axis] = input_shape[h_axis]
        output_shape[w_axis] = input_shape[w_axis]
        return tuple(output_shape)

def get_keypointCoordinates(hm):
    kp_coor = []
    value = np.amax(hm)
    coord = []
    for width in range(hm.shape[0]):
        for height in range(hm.shape[1]):
            if tf.keras.backend.get_value(hm[width][height]) == value:
                coord = [height, width]
                break
    kp_coor.append([coord, value])
    return kp_coor

kps_lines = [(0, 1), (1, 2), (2, 6), (7, 12), (12, 11), (11, 10), (5, 4), (4, 3), (3, 6), (7, 13), (13, 14), (14, 15), (6, 7), (7, 8), (8, 9)]
def create_skelton(hms):
    kps = []
    width, height = hms.shape[0], hms.shape[1]
    for hm in range(hms.shape[2]):
        kps.append(get_keypointCoordinates(hms[:, :, hm]))
    kp_mask = np.zeros([width, height], dtype=np.uint8)
    kp_mask.fill(255)  # or img[:] = 255
    for l in range(len(kps_lines)):
        i1 = kps_lines[l][0]
        i2 = kps_lines[l][1]
        p1 = int(kps[i1][0][0][0]), int(kps[i1][0][0][1])
        p2 = int(kps[i2][0][0][0]), int(kps[i2][0][0][1])
        cv2.line(
            kp_mask, p1, p2, color=(0, 0, 0), thickness=8, lineType=cv2.LINE_AA)
        cv2.circle(
            kp_mask, p1, radius=3, color=(0, 0, 0), thickness=8, lineType=cv2.LINE_AA)
        cv2.circle(
            kp_mask, p2, radius=3, color=(0, 0, 0), thickness=8, lineType=cv2.LINE_AA)
    return kp_mask 


def image_tensor_func(img4d):
    results = []
    for img3d in img4d:
        rimg3d = create_skelton(img3d)
        results.append(rimg3d[:, :, np.newaxis])
    return results

我创建了一个模型,如下所示:

input_img = Input(shape=(64, 64, 3))
mod = Conv2D(16, kernel_size=1, activation='relu')(input_img)
mod = drawLines(output_dim=(64, 64, 1))(mod)
model = Model(input_img, mod)
model.compile('adadelta', loss='mse', metrics=['accuracy'])
model.summary()

在我得到模型摘要之前,一切正常: enter image description here

但当我跑步时:

model.fit(model_inp, model_out, batch_size=3,  epochs=1, validation_data=(val_inp, val_out))

模型_inp和val_inp的形状是:(7,64,64,3)

模型输出和值输出的形状是:(7,64,64,1)

我在运行时遇到以下错误: enter image description here

tensorflow.python.framework.errors\u impl.InvalidArgumentError:转置需要大小为0的向量。但输入(1)是一个大小为4的向量

[{{node training/Adadelta/gradients/conv2d_1/Relu_grad/ReluGrad-0-TransposeNHWCToNCHW-layoutuoptimizer}]


Tags: selfforinputoutputmodelreturndefmask