首页 > 解决方案 > 如何更改切片张量流对象的值

问题描述

我想为我的 tensorflow keras 模型编写一个自定义损失函数来执行 YOLO 算法,问题是当特定网格中没有对象时,对象位置的导数应该为 0,因为它不应该不在乎。因此,我尝试将每个 bbox 的 y_true 乘以它,但我无法对 Tensor 对象进行切片并更改其值。

def YOLO_loss_function_shell(classes_path, output_shape): with open(classes_path, "r") as f_arch: classes = list(map(lambda row: row.strip("\n").strip("\r"), f_arch.readlines ())) classes = list(filter(lambda row: row != "" 而不是 row.startswith("#"), classes)) num_classes = len(classes) bbox_size = (5 + num_classes) num_bboxes = int(output_shape [2] / bbox_size)

def YOLO_loss_function(y_true, y_pred):
    cost = np.subtract(np.multiply(-y_true, 
                                  (K.log(y_pred + tf.keras.backend.epsilon()))),
                np.multiply((1 - y_true),
                            (K.log(1 - y_pred + tf.keras.backend.epsilon()))))
    for b in range(num_bboxes):
        cost[:, :, bbox_size*b:bbox_size*(b + 1)] *= y_true[:, :, bbox_size*b:(bbox_size*b + 1)]

    return K.sum(cost, axis=-1)

return YOLO_loss_function

它一直告诉我 TypeError: 'Tensor' object does not support item assignment

标签: pythonnumpytensorflowyolo

解决方案


推荐阅读