标签: loss-function

我们可以在同一层使用多个损失函数吗?

我们可以在这个架构中使用多个损失函数吗:我有两种不同类型的损失函数,并且想在最后一层[输出]损失函数上使用它:

  • 二元交叉熵
  • 自定义损失函数

我们可以这样做吗? 在此输入图像描述

machine-learning deep-learning keras tensorflow loss-function

5
推荐指数
1
解决办法
1235
查看次数

在 Tensorflow 中创建加权 MSE 损失函数

我想使用 训练循环神经网络Tensorflow。我的模型为每个训练样本输出一个 1 x 100 向量。假设这y = [y_1, y_2, ..., y_100]是我的训练样本输出x,预期输出为y'= [y'_1, y'_2, ..., y'_100]

我希望编写一个自定义损失函数来计算该特定样本的损失,如下所示:

Loss =  1/sum(weights) * sqrt(w_1*(y_1-y'_1)^2 + ... + w_100*(y_100-y'_100)^2)
Run Code Online (Sandbox Code Playgroud)

weights = [w_1,...,w_100]是给定的权重数组。

有人可以帮助我实现这样的自定义损失函数吗?(我在训练时也使用小批量)

keras tensorflow loss-function

5
推荐指数
1
解决办法
3236
查看次数

torch.nn.CrossEntropyLoss 多个批次

我目前正在与torch.nn.CrossEntropyLoss. 据我所知,批量计算损失是很常见的。但是,是否有可能计算多个批次的损失?

更具体地说,假设我们给出了数据

import torch

features = torch.randn(no_of_batches, batch_size, feature_dim)
targets = torch.randint(low=0, high=10, size=(no_of_batches, batch_size))

loss_function = torch.nn.CrossEntropyLoss()
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以一行计算

loss = loss_function(features, targets) # raises RuntimeError: Expected target size [no_of_batches, feature_dim], got [no_of_batches, batch_size]
Run Code Online (Sandbox Code Playgroud)

先感谢您!

cross-entropy pytorch loss-function pytorch-dataloader

5
推荐指数
1
解决办法
4300
查看次数

keras:平滑 L1 损失

尝试在 keras 中自定义损失函数(平滑 L1 损失),如下所示

ValueError: Shape must be rank 0 but is rank 5 for 'cond/Switch' (op: 'Switch') with input shape: [?,24,24,24,?], [?,24,24,24,? ]。

from keras import backend as K
import numpy as np


def smooth_L1_loss(y_true, y_pred):
    THRESHOLD = K.variable(1.0)
    mae = K.abs(y_true-y_pred)
    flag = K.greater(mae, THRESHOLD)
    loss = K.mean(K.switch(flag, (mae - 0.5), K.pow(mae, 2)), axis=-1)
    return loss
Run Code Online (Sandbox Code Playgroud)

deep-learning keras loss-function

4
推荐指数
2
解决办法
1万
查看次数

Keras 自定义二元交叉熵损失函数。获取 NaN 作为损失的输出

我尝试编写一个自定义的二元交叉熵损失函数。这是我的脚本:

def my_custom_loss(y_true,y_pred):
    t_loss = (-1)*(y_true * K.log(y_pred) + (1 - y_true) * K.log(1 - y_pred))
    return K.mean(t_loss)
Run Code Online (Sandbox Code Playgroud)

当我使用这个损失函数运行我的脚本时,经过几次迭代,我得到 NaN 作为损失函数的输出。

然后我查看了 TensorFlow 文档,我将损失函数修改为以下内容:

 t_loss = K.max(y_pred,0)-y_pred * y_true + K.log(1+K.exp((-1)*K.abs(y_pred)))
Run Code Online (Sandbox Code Playgroud)

代码运行没有任何问题。我想知道是否有人可以解释为什么我的第一个损失函数给出 NaN 输出。

二元交叉熵:y * log(p) + (1-y) * log(1-p)

我有 sigmoid 函数作为我最后一层的激活。所以'p'的值应该在0到1之间。这个范围应该存在日志。

谢谢你。

python keras loss-function

4
推荐指数
1
解决办法
5442
查看次数

使用 KL 散度时,变分自动编码器为每个输入 mnist 图像提供相同的输出图像

当不使用 KL 散度项时,VAE 几乎完美地重建了 mnist 图像,但在提供随机噪声时无法正确生成新图像。

当使用 KL 散度项时,VAE 在重建和生成图像时给出相同的奇怪输出。

在此处输入图片说明

这是损失函数的pytorch代码:

def loss_function(recon_x, x, mu, logvar):
    BCE = F.binary_cross_entropy(recon_x, x.view(-1, 784), size_average=True)
    KLD = -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp())    
    return (BCE+KLD)
Run Code Online (Sandbox Code Playgroud)

recon_x 是重建图像,x 是 original_image,mu 是均值向量,而 logvar 是包含方差对数的向量。

这里出了什么问题?提前致谢 :)

bayesian-networks autoencoder deep-learning pytorch loss-function

4
推荐指数
1
解决办法
2578
查看次数

用于pytorch中图像分割的通道明智的CrossEntropyLoss

我正在做一个图像分割任务。总共有 7 个类,所以最终输出是一个像 [batch, 7, height, width] 这样的张量,它是一个 softmax 输出。现在直觉上我想使用 CrossEntropy 损失,但 pytorch 实现不适用于通道明智的单热编码向量

所以我打算自己做一个功能。在一些 stackoverflow 的帮助下,我的代码到目前为止看起来像这样

from torch.autograd import Variable
import torch
import torch.nn.functional as F


def cross_entropy2d(input, target, weight=None, size_average=True):
    # input: (n, c, w, z), target: (n, w, z)
    n, c, w, z = input.size()
    # log_p: (n, c, w, z)
    log_p = F.log_softmax(input, dim=1)
    # log_p: (n*w*z, c)
    log_p = log_p.permute(0, 3, 2, 1).contiguous().view(-1, c)  # make class dimension last dimension
    log_p = log_p[
       target.view(n, w, …
Run Code Online (Sandbox Code Playgroud)

image-segmentation cross-entropy pytorch loss-function semantic-segmentation

4
推荐指数
1
解决办法
8450
查看次数

在 Tensorflow 2.0 中实现自定义损失函数

我正在构建时间序列分类模型。数据非常不平衡,所以我决定使用加权交叉熵函数作为我的损失。

Tensorflow 提供了tf.nn.weighted_cross_entropy_with_logits,但我不确定如何在 TF 2.0 中使用它。因为我的模型是使用 tf.keras API 构建的,所以我正在考虑像这样创建我的自定义损失函数:

pos_weight=10
def weighted_cross_entropy_with_logits(y_true,y_pred):
  return tf.nn.weighted_cross_entropy_with_logits(y_true,y_pred,pos_weight)

# .....
model.compile(loss=weighted_cross_entropy_with_logits,optimizer="adam",metrics=["acc"])
Run Code Online (Sandbox Code Playgroud)

我的问题是:有没有办法直接将 tf.nn.weighted_cross_entropy_with_logits 与 tf.keras API 一起使用?

keras tensorflow loss-function tensorflow2.0

4
推荐指数
1
解决办法
1924
查看次数

TensorFlow/Keras 的 fit() 函数的 class_weight 参数如何工作?

我使用 TensorFlow 1.12 和 Keras 进行语义分割。我提供了一个权重向量(大小等于类的数量)来tf.keras.Model.fit()使用它的class_weight参数。我想知道这在内部是如何工作的。我使用自定义损失函数(骰子损失和焦点损失等),并且权重在输入损失函数之前不能与预测或单一热的基本事实相乘,因为这不会产生任何感觉。我的损失函数输出一个标量值,所以它也不能与函数输出相乘。那么在何处以及如何准确地考虑类权重?

我的自定义损失函数是:

def cross_entropy_loss(onehots_true, logits): # Inputs are [BATCH_SIZE, height, width, num_classes]
    logits, onehots_true = mask_pixels(onehots_true, logits) # Removes pixels for which no ground truth exists, and returns shape [num_gt_pixels, num_classes]
    return tf.losses.softmax_cross_entropy(onehots_true, logits)
Run Code Online (Sandbox Code Playgroud)

keras tensorflow loss-function

4
推荐指数
2
解决办法
5640
查看次数

如何在训练期间替换损失函数 tensorflow.keras

我想在训练期间替换与我的神经网络相关的损失函数,这是网络:

model = tensorflow.keras.models.Sequential()
        model.add(tensorflow.keras.layers.Conv2D(32, kernel_size=(3, 3), activation="relu", input_shape=input_shape))
        model.add(tensorflow.keras.layers.Conv2D(64, (3, 3), activation="relu"))
        model.add(tensorflow.keras.layers.MaxPooling2D(pool_size=(2, 2)))
        model.add(tensorflow.keras.layers.Dropout(0.25))
        model.add(tensorflow.keras.layers.Flatten())
        model.add(tensorflow.keras.layers.Dense(128, activation="relu"))
        model.add(tensorflow.keras.layers.Dropout(0.5))
        model.add(tensorflow.keras.layers.Dense(output_classes, activation="softmax"))
        model.compile(loss=tensorflow.keras.losses.categorical_crossentropy, optimizer=tensorflow.keras.optimizers.Adam(0.001), metrics=['accuracy'])
        history = model.fit(x_train, y_train, batch_size=128, epochs=5, validation_data=(x_test, y_test))
Run Code Online (Sandbox Code Playgroud)

所以现在我想换tensorflow.keras.losses.categorical_crossentropy一个,所以我做了这个:

model.compile(loss=tensorflow.keras.losses.mse, optimizer=tensorflow.keras.optimizers.Adam(0.001), metrics=['accuracy'])
    history = model.fit(x_improve, y_improve, epochs=1, validation_data=(x_test, y_test)) #FIXME bug during training
Run Code Online (Sandbox Code Playgroud)

但我有这个错误:

ValueError: No gradients provided for any variable: ['conv2d/kernel:0', 'conv2d/bias:0', 'conv2d_1/kernel:0', 'conv2d_1/bias:0', 'dense/kernel:0', 'dense/bias:0', 'dense_1/kernel:0', 'dense_1/bias:0'].
Run Code Online (Sandbox Code Playgroud)

为什么?我该如何解决?还有另一种改变损失函数的方法吗?

谢谢

python keras tensorflow loss-function

4
推荐指数
2
解决办法
2506
查看次数