标签: loss-function

在 Keras/Tensorflow 自定义损失函数中使用额外的“可训练”变量

我知道如何在 Keras 中使用附加输入(而不是标准y_true,y_pred对)编写自定义损失函数,请参见下文。我的问题是使用可训练变量(其中一些)输入损失函数,该变量是损失梯度的一部分,因此应该更新。

我的解决方法是:

  • 在网络中输入NXV大小的虚拟输入,其中N是观测值的数量和V附加变量的数量
  • 添加一个Dense()dummy_output,以便 Keras 跟踪我的V“体重”
  • V在我的自定义损失函数中使用该层的权重作为我的真实输出层
  • dummy_output对于该层使用虚拟损失函数(仅返回 0.0 和/或权重 0.0),因此我的V“权重”仅通过我的自定义损失函数进行更新

我的问题是:是否有更自然的类似 Keras/TF 的方法来做到这一点?因为它感觉很做作,更不用说容易出现错误了。

我的解决方法的示例:

(是的,我知道这是一个非常愚蠢的自定义损失函数,实际上事情要复杂得多)

import numpy as np
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
from tensorflow.keras.layers import Dense
from tensorflow.keras.callbacks import EarlyStopping
import tensorflow.keras.backend as K
from tensorflow.keras.layers import Input
from tensorflow.keras import Model

n_col = 10
n_row = …
Run Code Online (Sandbox Code Playgroud)

python keras tensorflow loss-function

6
推荐指数
1
解决办法
3288
查看次数

变分自动编码器损失函数(keras)

我正在使用 Keras 构建一个变分自动编码器。我很大程度上受到@Fchollet 示例的启发:https : //github.com/fchollet/keras/blob/master/examples/variational_autoencoder.py

但我正在处理连续数据。我的输出是一个持续时间,而不是像 MNIST 那样对数字进行排名。在这方面,我将损失函数从 binary_crossentropy 更改为 mean_squared_error。我主要想知道第二项,即 KL 散度。它应该适用于连续数据吗?我无法绕过它。对我来说,它应该将相似的数据紧密地放在潜在空间中。例如,在 MNIST 数据的 cas 中,将每个“1”放在潜在空间中,将每个“2”放在一起等等......因为我正在处理连续数据,它是如何工作的?在我的情况下有更好的丢失功能吗?

这是丢失的功能:

def vae_loss(x, x_decoded_mean):
    xent_loss = original_dim *metrics.mean_squared_error(x, x_decoded_mean)
    kl_loss = - 0.5 * K.mean(1 + z_log_sigma - K.square(z_mean) - K.exp(z_log_sigma), axis=-1)
    return K.mean(xent_loss + kl_loss)
vae.compile(optimizer='Adam', loss=vae_loss)
Run Code Online (Sandbox Code Playgroud)

这是 3D 潜在空间中的表示。 在此处输入图片说明

如您所见,一些类似的数据会根据需要放在一起。当我将 kl_loss 函数的系数增加到 "-100000" 而不是 "-0.5" 时会发生以下情况: 在此处输入图片说明

我以为我会以几乎线性的方式从蓝色变为红色。相反,我以混乱的方式获得了所有数据的集群。

你们能帮帮我吗?谢谢 !

python python-3.x autoencoder keras loss-function

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

Keras中的自定义损失函数,如何处理占位符

我正在尝试在 TF/Keras 中生成自定义损失函数,如果它在会话中运行并传递常量,则损失函数会起作用,但是,它在编译成 Keras 时停止工作。

成本函数(感谢 Lior 将其转换为 TF)

def ginicTF(actual,pred):

    n = int(actual.get_shape()[-1])

    inds =  K.reverse(tf.nn.top_k(pred,n)[1],axes=[0]) 
    a_s = K.gather(actual,inds) 
    a_c = K.cumsum(a_s)
    giniSum = K.sum(a_c)/K.sum(a_s) - (n+1)/2.0

    return giniSum / n

def gini_normalizedTF(a,p):
    return -ginicTF(a, p) / ginicTF(a, a)

#Test the cost function

sess = tf.InteractiveSession()

p = [0.9, 0.3, 0.8, 0.75, 0.65, 0.6, 0.78, 0.7, 0.05, 0.4, 0.4, 0.05, 0.5, 0.1, 0.1]
a = [1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, …
Run Code Online (Sandbox Code Playgroud)

python-3.x keras gini tensorflow loss-function

5
推荐指数
0
解决办法
1086
查看次数

如何有条件地为张量赋值[掩蔽损失函数]?

我想创建一个 L2 损失函数,它忽略标签值为 0 的值(=> 像素)。张量batch[1]包含标签,output而是净输出的张量,两者的形状均为(None,300,300,1).

labels_mask = tf.identity(batch[1])
labels_mask[labels_mask > 0] = 1
loss = tf.reduce_sum(tf.square((output-batch[1])*labels_mask))/tf.reduce_sum(labels_mask)
Run Code Online (Sandbox Code Playgroud)

我当前的代码屈服于TypeError: 'Tensor' object does not support item assignment(在第二行)。什么是张量流方式来做到这一点?我还尝试将损失归一化为tf.reduce_sum(labels_mask),我希望它像这样工作。

python machine-learning loss tensorflow loss-function

5
推荐指数
2
解决办法
3611
查看次数

在训练期间逐渐更新 Keras 中自定义损失的权重

我在 Keras(张量流后端)中定义了一个自定义损失函数,该函数由重建 MSE 以及学习的概率分布和标准正态分布之间的 kullback leibler 散度组成。(它用于变分自动编码器。)

我希望能够在训练期间慢慢增加 KL 散度项对成本的影响,权重称为“reg”,从 reg=0.0 开始,逐渐增加,直到达到 1.0。我希望将增长率调整为超参数。(到目前为止,我只是将“reg”参数设置为常量 0.5。)

Keras 中有执行此操作的功能吗?

def vae_loss(y_true,y_pred):
    reg = 0.5
    # Average cosine distance for all words in a sequence 
    reconstruction_loss = tf.reduce_mean(mean_squared_error(y_true, y_pred),1)    
    # Second part of the loss ensures the z probability distribution doesn't stray too far from normal
    KL_divergence_loss = tf.reduce_mean(tf.log(z_sigma) + tf.div((1 + tf.square(z_mu)),2*tf.square(z_sigma)) - 0.5,1)
    loss = reconstruction_loss + tf.multiply(reg,KL_divergence_loss)
    return loss
Run Code Online (Sandbox Code Playgroud)

python keras tensorflow loss-function keras-2

5
推荐指数
0
解决办法
1112
查看次数

即使尺寸不匹配,自定义损失函数也能工作


我正在使用 Keras/TF 和以下模型:

conv = Conv2D(4, 3, activation = None, use_bias=True)(inputs)   
conv = Conv2D(2, 1, activation = None, use_bias=True)(conv)
model = Model(input = inputs, output = conv)
model.compile(optimizer=Adam(lr=1e-4), loss=keras.losses.mean_absolute_error)
Run Code Online (Sandbox Code Playgroud)

在 model.fit 中,我收到一条错误消息:

ValueError:检查目标时出错:预期 conv2d_2 的形状为 (300, 320, 2),但得到的数组形状为 (300, 320, 1)

这是符合预期的,因为目标是单通道图像,而模型的最后一层有 2 个通道。

我不明白的是为什么当我使用自定义损失函数时:

def my_loss2(y_true, y_pred):
    return keras.losses.mean_absolute_error(y_true, y_pred)
Run Code Online (Sandbox Code Playgroud)

并编译模型:

model.compile(optimizer = Adam(lr=1e-4), loss=my_loss2)
Run Code Online (Sandbox Code Playgroud)

确实有效(或者至少没有给出错误)。是否有任何类型的自动转换/截断正在进行?

我正在使用 TF (CPU) 1.12.0 和 Keras 2.2.2

此致,埃拉德

keras tensorflow loss-function

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

PyTorch:torch.LongTensor 类型未实现 _thnn_nll_loss_forward

当尝试使用 PyTorch 创建模型时,当我尝试实现损失函数时nll_loss,它抛出以下错误

RuntimeError: _thnn_nll_loss_forward is not implemented for type torch.LongTensor 
Run Code Online (Sandbox Code Playgroud)

我创建的拟合函数是:

for epoch in tqdm_notebook(range(1, epochs+1)):
    for batch_idx, (data, targets) in enumerate(train_loader):
        optimizer.zero_grad()
        net.float()
        output = net(data)
        output_x = output.argmax(dim=2) #to convert (64,50,43) -> (64, 50)
        loss = F.nll_loss(output_x, targets)
        loss.backward()
        optimizer.step()
        if batch_idx % 100 == 0:
            print('Train epochs: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
                epoch, batch_idx*len(data), len(ds.data),
                100.*batch_idx / len(ds), loss.item()
            ))
Run Code Online (Sandbox Code Playgroud)

其中输出和目标的形状是(64, 50),并且 dtypes 是torch.int64两者的。

python machine-learning computer-vision pytorch loss-function

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

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

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

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

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

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
查看次数