我尝试将 2 个损失函数传递给模型,因为Keras 允许这样做。
损失:字符串(目标函数名称)或目标函数或损失实例。见损失。如果模型有多个输出,您可以通过传递字典或损失列表对每个输出使用不同的损失。模型将最小化的损失值将是所有单个损失的总和。
两个损失函数:
def l_2nd(beta):
def loss_2nd(y_true, y_pred):
...
return K.mean(t)
return loss_2nd
Run Code Online (Sandbox Code Playgroud)
和
def l_1st(alpha):
def loss_1st(y_true, y_pred):
...
return alpha * 2 * tf.linalg.trace(tf.matmul(tf.matmul(Y, L, transpose_a=True), Y)) / batch_size
return loss_1st
Run Code Online (Sandbox Code Playgroud)
然后我建立模型:
l2 = K.eval(l_2nd(self.beta))
l1 = K.eval(l_1st(self.alpha))
self.model.compile(opt, [l2, l1])
Run Code Online (Sandbox Code Playgroud)
当我训练时,它会产生错误:
1.15.0-rc3 警告:tensorflow:来自 /usr/local/lib/python3.6/dist-packages/tensorflow_core/python/ops/resource_variable_ops.py:1630:调用 BaseResourceVariable。不推荐使用带有约束的init(来自 tensorflow.python.ops.resource_variable_ops)并将在未来版本中删除。说明
更新:如果使用 Keras 将 *_constraint 参数传递给层。
NotImplementedError Traceback (最近一次调用最后一次) in () 47 create_using=nx.DiGraph(), nodetype=None, data=[('weight', int)]) 48 ---> 49 model = SDNE(G, …
我正在研究一种图像类增量分类器方法,使用CNN作为特征提取器和一个完全连接的块进行分类.
首先,我对每个训练有素的VGG网络进行了微调,以完成一项新任务.一旦网络被训练用于新任务,我就为每个班级存储一些示例,以避免在新班级可用时忘记.
当某些类可用时,我必须计算样本的每个输出,包括新类的示例.现在为旧类的输出添加零,并在新类输出上添加与每个新类对应的标签,我有新标签,即:如果有3个新类输入....
旧班类型输出: [0.1, 0.05, 0.79, ..., 0 0 0]
新类类型输出:[0.1, 0.09, 0.3, 0.4, ..., 1 0 0]**最后的输出对应于类.
我的问题是,我如何改变自定义的损失函数来训练新的类?我想要实现的损失函数定义为:
蒸馏损失对应于旧类别的输出以避免遗忘,而分类损失对应于新类别.
如果你能给我一些代码样本来改变keras中的损失函数会很好.
谢谢!!!!!
computer-vision deep-learning conv-neural-network keras loss-function
所以我的问题是,如果我有类似的东西:
model = Model(inputs = input, outputs = [y1,y2])
l1 = 0.5
l2 = 0.3
model.compile(loss = [loss1,loss2], loss_weights = [l1,l2], ...)
Run Code Online (Sandbox Code Playgroud)
为了获得最终损失,keras做了什么损失?是这样的:
final_loss = l1*loss1 + l2*loss2
Run Code Online (Sandbox Code Playgroud)
此外,在培训期间意味着什么?loss2仅用于更新y2来自的层的权重吗?或者它是否用于所有模型的图层?
我很困惑
我尝试参加我的第一次Kaggle比赛,RMSLE作为所需的损失函数.因为我没有发现如何实现这个loss function我试图解决的问题RMSE.我知道这是Keras过去的一部分,有没有办法在最新版本中使用它,也许通过自定义功能backend?
这是我设计的NN:
from keras.models import Sequential
from keras.layers.core import Dense , Dropout
from keras import regularizers
model = Sequential()
model.add(Dense(units = 128, kernel_initializer = "uniform", activation = "relu", input_dim = 28,activity_regularizer = regularizers.l2(0.01)))
model.add(Dropout(rate = 0.2))
model.add(Dense(units = 128, kernel_initializer = "uniform", activation = "relu"))
model.add(Dropout(rate = 0.2))
model.add(Dense(units = 1, kernel_initializer = "uniform", activation = "relu"))
model.compile(optimizer = "rmsprop", loss = "root_mean_squared_error")#, metrics =["accuracy"])
model.fit(train_set, label_log, batch_size = …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Keras和Tensorflow后端使用LSTM实现序列到序列任务.输入是具有可变长度的英语句子.为了构建具有二维形状[batch_number,max_sentence_length]的数据集,我在行尾添加EOF并用足够的占位符填充每个句子,例如"#".然后将句子中的每个字符转换为单热矢量,现在数据集具有3-D形状[batch_number,max_sentence_length,character_number].在LSTM编码器和解码器层之后,计算输出和目标之间的softmax交叉熵.
为了消除模型训练中的填充效应,可以在输入和丢失功能上使用掩蔽.Keras中的掩码输入可以通过使用"layers.core.Masking"来完成.在Tensorflow中,可以按如下方式 屏蔽损失函数:Tensorflow中的自定义屏蔽损失函数
但是,我没有找到在Keras中实现它的方法,因为keras中使用定义的损失函数只接受参数y_true和y_pred.那么如何将真正的sequence_lengths输入到丢失函数和掩码?
此外,我在\ keras\engine\training.py中找到了一个函数"_weighted_masked_objective(fn)".它的定义是"为目标函数添加对屏蔽和样本加权的支持."但似乎该函数只能接受fn(y_true,y_pred).有没有办法使用这个函数来解决我的问题?
具体来说,我修改了余阳的例子.
from keras.models import Model
from keras.layers import Input, Masking, LSTM, Dense, RepeatVector, TimeDistributed, Activation
import numpy as np
from numpy.random import seed as random_seed
random_seed(123)
max_sentence_length = 5
character_number = 3 # valid character 'a, b' and placeholder '#'
input_tensor = Input(shape=(max_sentence_length, character_number))
masked_input = Masking(mask_value=0)(input_tensor)
encoder_output = LSTM(10, return_sequences=False)(masked_input)
repeat_output = RepeatVector(max_sentence_length)(encoder_output)
decoder_output = LSTM(10, return_sequences=True)(repeat_output)
output = Dense(3, activation='softmax')(decoder_output)
model = Model(input_tensor, output)
model.compile(loss='categorical_crossentropy', optimizer='adam')
model.summary()
X = np.array([[[0, 0, 0], …Run Code Online (Sandbox Code Playgroud) 我正在使用带有tensorflow后端的keras。我的目标是batchsize在自定义损失函数中查询当前批次的。这是计算定制损失函数的值所必需的,该值取决于特定观测值的索引。鉴于以下最少的可重现示例,我想更清楚地说明这一点。
(顺便说一句:当然,我可以使用为培训过程定义的批量大小,并在定义自定义损失函数时使用它的值,但是有一些原因可以使之变化,特别是如果epochsize % batchsize(epochsize modulo batchsize)不等于零,那么最后一个时期的大小是不同的,我没有在stackoverflow中找到合适的方法,特别是例如
自定义损失函数中的Tensor索引和 Keras中的Tensorflow自定义损失函数-在张量上循环和在张量上循环因为显然在建立图时无法推断任何张量的形状(损失函数就是这种情况)-形状推断仅在评估给定数据时才可能进行,而这仅在给定图时才可能进行。因此,我需要告诉自定义损失函数对沿某个维度的特定元素执行某些操作,而无需知道维度的长度。
from keras.models import Sequential
from keras.layers import Dense, Activation
# Generate dummy data
import numpy as np
data = np.random.random((1000, 100))
labels = np.random.randint(2, size=(1000, 1))
model = Sequential()
model.add(Dense(32, activation='relu', input_dim=100))
model.add(Dense(1, activation='sigmoid'))
Run Code Online (Sandbox Code Playgroud)
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy'])
# Train the model, iterating on the data in batches of 32 samples
model.fit(data, labels, epochs=10, batch_size=32)
Run Code Online (Sandbox Code Playgroud)
(输出省略,这完全可以正常运行)
def custom_loss(yTrue, …Run Code Online (Sandbox Code Playgroud) 我试图理解 TensorFlow 中的这个损失函数,但我不明白。它是SparseCategoricalCrossentropy。所有其他损失函数都需要相同形状的输出和标签,而这个特定的损失函数不需要。
源代码:
import tensorflow as tf;
scce = tf.keras.losses.SparseCategoricalCrossentropy();
Loss = scce(
tf.constant([ 1, 1, 1, 2 ], tf.float32),
tf.constant([[1,2],[3,4],[5,6],[7,8]], tf.float32)
);
print("Loss:", Loss.numpy());
Run Code Online (Sandbox Code Playgroud)
错误是:
InvalidArgumentError: Received a label value of 2 which is outside the valid range of [0, 2).
Label values: 1 1 1 2 [Op:SparseSoftmaxCrossEntropyWithLogits]
Run Code Online (Sandbox Code Playgroud)
如何为损失函数 SparseCategoricalCrossentropy 提供适当的参数?
machine-learning deep-learning tensorflow cross-entropy loss-function
当损失函数是均方误差时,如何定义准确度?是绝对百分比误差吗?
我使用的模型具有输出激活线性和编译 loss= mean_squared_error
model.add(Dense(1))
model.add(Activation('linear')) # number
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])
Run Code Online (Sandbox Code Playgroud)
输出看起来像这样:
Epoch 99/100
1000/1000 [==============================] - 687s 687ms/step - loss: 0.0463 - acc: 0.9689 - val_loss: 3.7303 - val_acc: 0.3250
Epoch 100/100
1000/1000 [==============================] - 688s 688ms/step - loss: 0.0424 - acc: 0.9740 - val_loss: 3.4221 - val_acc: 0.3701
Run Code Online (Sandbox Code Playgroud)
那么例如val_acc:0.3250是什么意思?Mean_squared_error应该是标量而不是百分比 - 不应该吗?那么val_acc - 均方误差,或平均百分比误差或其他函数?
根据维基百科上的MSE定义:https://en.wikipedia.org/wiki/Mean_squared_error
MSE是估计量质量的度量 - 它总是非负的,接近零的值更好.
这是否意味着价值val_acc: 0.0优于val_acc: 0.325?
编辑:我训练时精确度量输出的更多示例 - 随着我训练更多,精度会增加.虽然损失函数 - mse应该减少.是否为mse定义了准确度 - 它是如何在Keras中定义的?
lAllocator: After …Run Code Online (Sandbox Code Playgroud) regression machine-learning mean-square-error keras loss-function
我正在 tensorflow(2.3) 中学习 keras API。在tensorflow 网站上的本指南中,我找到了一个自定义损失函数的示例:
def custom_mean_squared_error(y_true, y_pred):
return tf.math.reduce_mean(tf.square(y_true - y_pred))
Run Code Online (Sandbox Code Playgroud)
在reduce_mean这个自定义损失函数函数会返回一个标量。
这样定义损失函数合适吗?据我所知,y_true和形状的第一维y_pred是批量大小。我认为损失函数应该为批次中的每个样本返回损失值。所以损失函数应该给出一个形状数组(batch_size,)。但是上面的函数为整个批次提供了一个值。
也许上面的例子是错误的?任何人都可以在这个问题上给我一些帮助吗?
ps为什么我认为损失函数应该返回一个数组而不是单个值?
我阅读了Model类的源代码。当您向方法提供损失函数(请注意它是一个函数,而不是损失类)时Model.compile(),该损失函数用于构造一个LossesContainer对象,该对象存储在Model.compiled_loss. 传递给LossesContainer类的构造函数的这个损失函数再次用于构造一个LossFunctionWrapper对象,该对象存储在LossesContainer._losses.
根据LossFunctionWrapper类的源代码,训练批次的整体损失值是通过LossFunctionWrapper.__call__()方法(继承自Loss类)计算的,即它返回整个批次的单个损失值。但是第LossFunctionWrapper.__call__()一个调用该LossFunctionWrapper.call()方法以获得训练批次中每个样本的损失数组。然后将这些损失最后平均以获得整批的单个损失值。这是在LossFunctionWrapper.call()方法的损失函数提供给Model.compile()方法被调用。
这就是为什么我认为自定义损失函数应该返回一系列损失,而不是单个标量值。此外,如果我们Loss为Model.compile()方法编写自定义类call(),我们自定义Loss类的方法也应该返回一个数组,而不是一个信号值。
我在github上打开了一个问题。已确认需要自定义损失函数来为每个样本返回一个损失值。该示例将需要更新以反映这一点。
machine-learning keras tensorflow loss-function tensorflow2.0
我正在训练 PyTorch 模型来执行二元分类。我的少数群体约占数据的 10%,所以我想使用加权损失函数。的文档BCELoss说CrossEntropyLoss我可以为每个示例使用 a 'weight'。
但是,当我声明CE_loss = nn.BCELoss()ornn.CrossEntropyLoss()然后 do CE_Loss(output, target, weight=batch_weights), where output, target, and batch_weightsare Tensors of 时batch_size,我收到以下错误消息:
forward() got an unexpected keyword argument 'weight'
Run Code Online (Sandbox Code Playgroud) loss-function ×10
keras ×8
tensorflow ×4
python ×3
lstm ×1
masking ×1
pytorch ×1
regression ×1