作者:夫功的美丽家园 | 来源:互联网 | 2022-12-10 12:16
我正在使用带有tensorflow后端的keras。我的目标是batchsize
在自定义损失函数中查询当前批次的。这是计算定制损失函数的值所必需的,该值取决于特定观测值的索引。鉴于以下最少的可重现示例,我想更清楚地说明这一点。
(顺便说一句:当然,我可以使用为培训过程定义的批量大小,并在定义自定义损失函数时使用它的值,但是有一些原因可以使之变化,特别是如果epochsize % batchsize
(epochsize modulo batchsize)不等于零,那么最后一个时期的大小是不同的,我没有在stackoverflow中找到合适的方法,特别是例如
自定义损失函数中的Tensor索引和 Keras中的Tensorflow自定义损失函数-在张量上循环和在张量上循环因为显然在建立图时无法推断任何张量的形状(损失函数就是这种情况)-形状推断仅在评估给定数据时才可能进行,而这仅在给定图时才可能进行。因此,我需要告诉自定义损失函数对沿某个维度的特定元素执行某些操作,而无需知道维度的长度。
(所有示例都一样)
from keras.models import Sequential
from keras.layers import Dense, Activation
# Generate dummy data
import numpy as np
data = np.random.random((1000, 100))
labels = np.random.randint(2, size=(1000, 1))
model = Sequential()
model.add(Dense(32, activation='relu', input_dim=100))
model.add(Dense(1, activation='sigmoid'))
示例1:没有问题的没有特别之处,没有自定义损失
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy'])
# Train the model, iterating on the data in batches of 32 samples
model.fit(data, labels, epochs=10, batch_size=32)
(输出省略,这完全可以正常运行)
示例2:没有什么特别的,具有相当简单的自定义损失
def custom_loss(yTrue, yPred):
loss = np.abs(yTrue-yPred)
return loss
model.compile(optimizer='rmsprop',
loss=custom_loss,
metrics=['accuracy'])
# Train the model, iterating on the data in batches of 32 samples
model.fit(data, labels, epochs=10, batch_size=32)
(输出省略,这完全可以正常运行)
示例3:问题
def custom_loss(yTrue, yPred):
print(yPred) # Output: Tensor("dense_2/Sigmoid:0", shape=(?, 1), dtype=float32)
n = yPred.shape[0]
for i in range(n): # TypeError: __index__ returned non-int (type NoneType)
loss = np.abs(yTrue[i]-yPred[int(i/2)])
return loss
model.compile(optimizer='rmsprop',
loss=custom_loss,
metrics=['accuracy'])
# Train the model, iterating on the data in batches of 32 samples
model.fit(data, labels, epochs=10, batch_size=32)
当然,张量还没有形状信息,只有在训练时才能建立图形时无法推断出该信息。因此for i in range(n)
产生一个错误。有什么方法可以执行此操作吗?
输出的回溯:
-------
顺便说一句,这是我真正的自定义损失函数,如有任何疑问。为了清楚和简单起见,我在上面跳过了它。
def neg_log_likelihood(yTrue,yPred):
yStatus = yTrue[:,0]
yTime = yTrue[:,1]
n = yTrue.shape[0]
for i in range(n):
s1 = K.greater_equal(yTime, yTime[i])
s2 = K.exp(yPred[s1])
s3 = K.sum(s2)
logsum = K.log(y3)
loss = K.sum(yStatus[i] * yPred[i] - logsum)
return loss
这是考克斯比例harzards模型的部分负对数似然可能性的图像。
这是为了澄清注释中的一个问题,以避免混淆。我认为没有必要详细了解这一问题来回答这个问题。