【发布时间】:2020-09-05 06:34:09
【问题描述】:
我正在尝试在 Keras 中为我正在研究的 CNN 编写自定义损失函数。 Y_true 和 Y_pred 都将是灰度图像的张量,所以我希望形状为 [a, x, y, 1],其中 x 和 y 是我的图像的尺寸,a 是批量大小。
计划是:
- 通过平均像素强度对 Y_true 的每个图像进行阈值化
- 使用此掩码的非零元素从 Y_true 和 Y_pred 获取像素值数组
- 测量这些数组的余弦相似度(使用内置的 Keras 损失函数),并将批次的平均结果作为损失返回
我的主要问题是如何有效地实施这个过程?
cosine_similarity 函数是否适用于一维数组?
我知道我应该避免 for 循环以保持效率,但这是我能想到的实现此功能的唯一方法。有没有更有效的方法来使用 Keras 后端或 numpy 来实现这个功能?
编辑
使用此函数编译模型时的基本实现和意外错误:
def masked_cosine_similarity(y_true, y_pred):
loss = 0
for i in range(y_true.shape[0]):
true_y = y_true[i,:,:,0]
pred_y = y_pred[i,:,:,0]
mask = true_y > np.mean(true_y)
elements = np.nonzero(mask)
true_vals = np.array([true_y[x,y] for x, y in zip(elements[0], elements[1])])
pred_vals = np.array([pred_y[x,y] for x, y in zip(elements[0], elements[1])])
loss += cosine_similarity(true_vals, pred_vals)
return loss / y_true.shape[0]
错误信息:
64 loss = 0
---> 65 for i in range(y_true.shape[0]):
66 true_y = y_true[i,:,:,0]
67 pred_y = y_pred[i,:,:,0]
TypeError: 'NoneType' object cannot be interpreted as an integer
【问题讨论】:
标签: numpy keras conv-neural-network tensor loss-function