【发布时间】:2020-04-11 15:23:47
【问题描述】:
我正在制作一种模式,即预测是来自 conv 层的矩阵。 我的损失函数是
def custom_loss(y_true, y_pred):
print("in loss...")
final_loss = float(0)
print(y_pred.shape)
print(y_true.shape)
for i in range(7):
for j in range(14):
tl = float(0)
gt = y_true[i,j]
gp = y_pred[i,j]
if gt[0] == 0:
tl = K.square(gp[0] - gt[0])
else:
for l in range(5):
tl = tl + K.square(gp[l] - gt[l])/5
final_loss = final_loss + tl/98
return final_loss
从参数打印出来的形状是
(?, 7, 14, 5)
(?, ?, ?, ?)
标签的形状为 7x14x5。
似乎损失函数被调用为一个预测列表,而不是一次一个预测。我对 Keras 比较陌生,并不真正了解这些东西是如何工作的。
这是我的模特
model = Sequential()
input_shape=(360, 640, 1)
model.add(Conv2D(24, (5, 5), strides=(1, 1), input_shape=input_shape))
model.add(MaxPooling2D((2,4), strides=(2, 2)))
model.add(Conv2D(48, (5, 5), padding="valid"))
model.add(MaxPooling2D((2,4), strides=(2, 2)))
model.add(Conv2D(48, (5, 5), padding="valid"))
model.add(MaxPooling2D((2,4), strides=(2, 2)))
model.add(Conv2D(24, (5, 5), padding="valid"))
model.add(MaxPooling2D((2,4), strides=(2, 2)))
model.add(Conv2D(5, (5, 5), padding="valid"))
model.add(MaxPooling2D((2,4), strides=(2, 2)))
model.compile(
optimizer="Adam",
loss=custom_loss,
metrics=['accuracy'])
print(model.summary())
我收到类似
的错误ValueError:维度 1 的切片索引 7 超出范围。对于 'loss/max_pooling2d_5_loss/custom_loss/strided_slice_92' (op: 'StridedSlice'),输入形状:[?,7,14,5], [2], [2], [2] 和计算输入张量:input[ 1] = ,输入[2] = ,输入[3] = 。
我想我知道这是因为损失函数的参数是在 4D 的许多预测中同时给出的。
我该如何解决?是我分配损失函数的方式或损失函数中的问题。 目前,损失函数的输出是浮点数。但它应该是什么。
【问题讨论】:
-
我参考了这个来得到这个想法,stackoverflow.com/questions/41707621/…
-
另一件事是我没有看到有人在损失函数中使用循环,为什么会这样,它与速度有关吗?如何在不使用循环的情况下以有效的方式实现此功能
-
你能口头解释一下你需要在损失函数中做什么吗?不是很清楚
标签: python tensorflow keras conv-neural-network loss-function