我想使用 训练循环神经网络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)
?
先感谢您!
尝试在 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) 我尝试编写一个自定义的二元交叉熵损失函数。这是我的脚本:
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之间。这个范围应该存在日志。
谢谢你。
当不使用 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
我正在做一个图像分割任务。总共有 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
我正在构建时间序列分类模型。数据非常不平衡,所以我决定使用加权交叉熵函数作为我的损失。
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 一起使用?
我使用 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) 我想在训练期间替换与我的神经网络相关的损失函数,这是网络:
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)
为什么?我该如何解决?还有另一种改变损失函数的方法吗?
谢谢