我的模型只有一个输出,但我想结合两个不同的损失函数:
def get_model():
# create the model here
model = Model(inputs=image, outputs=output)
alpha = 0.2
model.compile(loss=[mse, gse],
loss_weights=[1-alpha, alpha]
, ...)
Run Code Online (Sandbox Code Playgroud)
但它抱怨我需要有两个输出,因为我定义了两个损失:
ValueError: When passing a list as loss, it should have one entry per model outputs.
The model has 1 outputs, but you passed loss=[<function mse at 0x0000024D7E1FB378>, <function gse at 0x0000024D7E1FB510>]
Run Code Online (Sandbox Code Playgroud)
我是否可以编写我的最终损失函数而不必创建另一个损失函数(因为这会限制我更改损失函数之外的 alpha)?
我该怎么做(1-alpha)*mse + alpha*gse?
更新:
我的两个损失函数都相当于任何内置 keras 损失函数的函数签名,接受y_true并y_pred返回损失的张量(可以使用 将其减少为标量K.mean()),但我相信,这些损失函数是如何定义的?只要它们返回有效的损失,就不会影响答案。
def gse(y_true, y_pred):
# some tensor operation on y_pred …Run Code Online (Sandbox Code Playgroud) 在我使用 TensorFlow 进行 CNN 训练时,我将其用作Keras.losses.poisson损失函数。现在,我喜欢与损失函数一起计算许多指标,并且我观察到这Keras.metrics.poisson给出了不同的结果 - 尽管两者是相同的函数。
请参阅此处的一些示例输出:loss输出poisson具有不同的范围,0.5 与 0.12:
Epoch 1/20
Epoch 00001: val_loss improved from inf to 0.53228, saving model to P:\Data\xyz.h5
- 8174s - loss: 0.5085 - binary_crossentropy: 0.1252 - poisson: 0.1271 - mean_squared_error: 1.2530e-04 - mean_absolute_error: 0.0035 - mean_absolute_percentage_error: 38671.1055 - val_loss: 0.5323 - val_binary_crossentropy: 0.1305 - val_poisson: 0.1331 - val_mean_squared_error: 5.8477e-05 - val_mean_absolute_error: 0.0035 - val_mean_absolute_percentage_error: 1617.8346
Epoch 2/20
Epoch 00002: val_loss improved from 0.53228 to 0.53218, …Run Code Online (Sandbox Code Playgroud) 我是神经网络新手。我想在 TensorFlow 中制作一个自定义损失函数,但我需要获取权重向量,所以我这样做了:
def my_loss(weights):
def custom_loss(y, y_pred):
return weights*(y - y_pred)
return custom_loss
model.compile(optimizer='adam', loss=my_loss(weights), metrics=['accuracy'])
model.fit(x_train, y_train, batch_size=None, validation_data=(x_test, y_test), epochs=100)
Run Code Online (Sandbox Code Playgroud)
当我启动它时,我收到此错误:
InvalidArgumentError: Incompatible shapes: [50000,10] vs. [32,10]
Run Code Online (Sandbox Code Playgroud)
形状是:
print(weights.shape)
print(y_train.shape)
Run Code Online (Sandbox Code Playgroud)
(50000, 10)
(50000, 10)
Run Code Online (Sandbox Code Playgroud)
所以我认为这是批次的问题,我没有很强的TensorFlow背景,所以我尝试使用全局变量以简单的方式解决
batch_index = 0
Run Code Online (Sandbox Code Playgroud)
然后在自定义回调中将其更新到“on_batch_begin”挂钩中。但这没有用,而且是一个糟糕的解决方案。那么,如何才能得到对应y的权重的精确部分呢?我有办法获取自定义损失中的当前批次索引吗?预先感谢您的帮助
Tensorflow 中给出的焦点损失用于类别不平衡。对于二元类分类,有很多可用的代码,但对于多类分类,帮助很少。我运行了包含 250 个类的目标变量的代码One Hot Encoded,它给出的结果没有任何错误。
y = pd.get_dummies(df['target']) # One hot encoded target classes
model.compile(
optimizer="adam", loss=tfa.losses.SigmoidFocalCrossEntropy(), metrics= metric
)
Run Code Online (Sandbox Code Playgroud)
我只是想知道谁编写了这段代码,或者对这段代码有足够了解的人,它可以用于多类分类吗?如果没有,那为什么它没有给我错误,反而比CrossEntropy. 此外,在像这样的其他实现中alpha,必须为每个类给出 的值,但在 Tensorflow 的实现中只给出一个值。
使用这个的正确方法是什么?
我试图基于 lightGBM 中的这篇论文来实现这个零膨胀对数正态损失函数(https://arxiv.org/pdf/1912.07753.pdf)(第 5 页)。但是,不可否认,我只是不知道怎么做。我不明白如何获取这个函数的梯度和粗麻布,以便在 LGBM 中实现它,而且我过去从来不需要实现自定义损失函数。
\n本文作者开源了他们的代码,该函数在tensorflow中可用(https://github.com/google/lifetime_value/blob/master/lifetime_value/zero_inflated_lognormal.py),但是我\xe2\x80\x99m无法将其转换为适合 LightGBM 中自定义损失函数所需的参数。LGBM 如何接受自定义损失函数\xe2\x80\x94 对数似然损失的示例将写为:
\ndef loglikelihood(preds, train_data):\n labels = train_data.get_label()\n preds = 1. / (1. + np.exp(-preds))\n grad = preds - labels\n hess = preds * (1. - preds)\n return grad, hess\nRun Code Online (Sandbox Code Playgroud)\n同样,我需要定义一个自定义评估指标来配合它,例如:
\ndef binary_error(preds, train_data):\n labels = train_data.get_label()\n preds = 1. / (1. + np.exp(-preds))\n return \'error\', np.mean(labels != (preds > 0.5)), False\nRun Code Online (Sandbox Code Playgroud)\n上面两个例子都取自以下存储库:
\n\n我将不胜感激对此的任何帮助,特别是详细的指导,以帮助我学习如何自己做到这一点。
\n根据自定义损失函数的 LGBM 文档: …
这可能是一个非常基本的问题,但是我无法找到答案:当我使用 Keras 使用批处理训练网络时,控制台输出显示并不断更新训练集的当前损失值的显示每个训练时期。据我了解,该损失值是在当前批次上计算的(作为总体损失的代理),并且可能与为先前批次计算的损失值进行平均。但获取当前批次的损失值有两种可能:更新参数之前或之后。有人能告诉我这两个哪个是正确的吗?根据我的观察,我宁愿猜测它是在优化步骤之后。
我问这个问题的原因是:我正在训练一个网络,发现训练损失(两个嵌入的 MSE)会按预期减少(几个数量级),但验证损失保持不变。首先我认为这可能是由于过度拟合。因此,由于训练数据集相当大(200k 图像),我决定减小 epoch 大小,以便能够更频繁地看到验证集的评估,从而导致 epoch 小于trainingSetSize/batchSize。即使这样,我也看到训练损失从一个纪元到另一个纪元不断减少(验证损失仍然保持不变),我发现这非常有趣,因为网络仍然处于第一次看到训练数据的阶段。根据我的理解,这意味着我的设置中存在一些令人讨厌的错误,或者在采取优化步骤后显示了显示的训练损失。否则,新的、从未见过的批次和验证集的损失应该至少表现相似。
即使我假设损失是在每个优化步骤之后计算的:假设我的网络没有按照验证集评估的建议取得有用的进展,那么当看到新的、从未见过的批次时,它也应该表现得任意。然后,训练损失的整体减少将仅归因于优化步骤(这对于手头的批次非常有好处,但对于其他数据则不然,显然,这也是一种过度拟合)。这意味着,如果训练损失不断减少,每批的优化步骤就会变得更加有效。我正在使用 Adam 优化器,我知道它是自适应的,但是是否真的有可能看到训练损失持续大幅减少,而实际上网络没有学习任何有用的泛化?
实现损失函数以最小化Tensorflow中两批张量之间的成对Hausdorff距离的最有效方法是什么?
我正在使用 PyTorch 训练 CNN 架构来解决回归问题,其中我的输出是 20 个值的张量。我计划使用 RMSE 作为模型的损失函数,并尝试使用 PyTorchnn.MSELoss()并对其进行平方根,torch.sqrt()但在获得结果后感到困惑。我会尽力解释原因。很明显,对于批量大小,bs我的输出张量的尺寸将为[bs , 20]。我尝试实现我自己的 RMSE 函数:
def loss_function (predicted_x , target ):
loss = torch.sum(torch.square(predicted_x - target) , axis= 1)/(predicted_x.size()[1]) #Taking the mean of all the squares by dividing it with the number of outputs i.e 20 in my case
loss = torch.sqrt(loss)
loss = torch.sum(loss)/predicted_x.size()[0] #averaging out by batch-size
return loss
Run Code Online (Sandbox Code Playgroud)
但是我的输出loss_function()和 PyTorch 如何实现它是nn.MSELoss()不同的。我不确定我的实现是否错误或者我是否nn.MSELoss()以错误的方式使用。
python artificial-intelligence deep-learning pytorch loss-function
我看到一个数独求解器 CNN 使用稀疏分类交叉熵作为使用 TensorFlow 框架的损失函数,我想知道 Pytorch 是否有类似的函数?如果不是,我如何可能使用 Pytorch 计算 2d 数组的损失?
我有属于不同类别的个体,他们位于不同的区域,这些人口预计会从population低于该demand值的值增长到该值。
population_and_demand_by_category_and_zone <- tibble::tribble(
~category, ~zone, ~population, ~demand,
"A", 1, 115, 138,
"A", 2, 121, 145,
"A", 3, 112, 134,
"A", 4, 76, 91,
"B", 1, 70, 99,
"B", 2, 59, 83,
"B", 3, 86, 121,
"B", 4, 139, 196,
"C", 1, 142, 160,
"C", 2, 72, 81,
"C", 3, 29, 33,
"C", 4, 58, 66,
"D", 1, 22, 47,
"D", 2, 23, 49,
"D", 3, 16, 34,
"D", 4, 45, 96
)
Run Code Online (Sandbox Code Playgroud)
区域具有给定的容量,当前人口低于此阈值,但某些区域的需求将超过容量。
demand_and_capacity_by_zone <- …Run Code Online (Sandbox Code Playgroud) loss-function ×10
keras ×5
python ×5
tensorflow ×5
pytorch ×2
boosting ×1
lightgbm ×1
optimization ×1
r ×1
tf.keras ×1