作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 Keras 中构建一个损失函数,其中我对预测与一组给定值之间的最小距离进行惩罚。问题是我需要计算预测值和给定值之间的距离。
示例代码
def custom_loss(y_pred,y_test):
#Given values
centers=K.constant([[-2.5,-1],[-1.25,-2],[.5,-1],[1.5,.25]])
num_centers=K.int_shape(centers)[0]
#Begin constructing distance matrix
height=K.int_shape(y_pred)[0]
i=0
current_center=K.reshape(K.repeat(K.reshape(centers[i,:],[1,-1]),height),[height,2])
current_dist=K.sqrt(K.sum(K.square(y_pred-current_center),axis=1))
#Values of distance matrix for first center
Distance=K.reshape(current_dist,[height,1])
for i in range(1,num_centers):
current_center=K.reshape(K.repeat(K.reshape(centers[i,:],[1,-1]),height),[height,2])
current_dist=K.sqrt(K.sum(K.square(y_pred-current_center),axis=-1))
current_dist=K.reshape(current_dist,[height,1])
#Iteratively concatenate distances of y_pred from remaining centers
Distance=K.concatenate([Distance,current_dist],axis=-1)
#Determine minimum distance from each predicted value to nearest center
A=K.min(A,axis=1)
#Return average minimum distance as loss
return K.sum(A)/float(height)
但是,我无法消除函数对 y_pred 第一个维度的依赖,该维度是可变的。我使用数组广播来计算 y_pred 和每个给定值之间的差异,但我显式使用批量大小进行广播,因为我不知道如何在不使用 Keras 中的批量大小的情况下执行此操作。然而,这会产生错误,因为在构建计算图时并未明确知道批量大小。
如何避免显式广播?目前的方法非常笨拙,是否有更有效的计算距离矩阵的方法?
最佳答案
您的损失函数可以使用隐式广播来实现,如下所示:
import keras.backend as K
def custom_loss(y_true, y_pred):
centers = K.constant([[-2.5, -1], [-1.25, -2], [.5, -1], [1.5, .25]])
# Expand dimensions to enable implicit broadcasting
y_pred_r = y_pred[:, None, :] # Shape: (batch_size, 1, 2)
centers_r = centers[None, :, :] # Shape: (1, nb_centers, 2)
# Compute minimum distance to centers for each element
distances = K.sqrt(K.sum(K.square(y_pred_r - centers_r), axis=-1)) # Shape=(batch_size, nb_centers)
min_distances = K.min(distances, axis=-1) # Shape=(batch_size,)
# Output average of minimum distances
return K.mean(min_distances)
注意:未经测试。
关于python - Keras 损失函数取决于批量大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54454193/
我是一名优秀的程序员,十分优秀!