我知道如何在 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) 我正在使用 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)
如您所见,一些类似的数据会根据需要放在一起。当我将 kl_loss 函数的系数增加到 "-100000" 而不是 "-0.5" 时会发生以下情况:

我以为我会以几乎线性的方式从蓝色变为红色。相反,我以混乱的方式获得了所有数据的集群。
你们能帮帮我吗?谢谢 !
我正在尝试在 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) 我想创建一个 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),我希望它像这样工作。
我在 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)
我正在使用 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
此致,埃拉德
当尝试使用 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
我想使用 训练循环神经网络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]是给定的权重数组。
有人可以帮助我实现这样的自定义损失函数吗?(我在训练时也使用小批量)
我目前正在与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)
?
先感谢您!
loss-function ×10
keras ×7
tensorflow ×7
python ×5
python-3.x ×2
pytorch ×2
autoencoder ×1
gini ×1
keras-2 ×1
loss ×1