我正在尝试创建一个简单的加权损失函数。
假设我的输入尺寸为100 * 5,输出尺寸也为100 *5。我也有一个相同尺寸的权重矩阵。
类似于以下内容:
import numpy as np
train_X = np.random.randn(100, 5)
train_Y = np.random.randn(100, 5)*0.01 + train_X
weights = np.random.randn(*train_X.shape)
def custom_loss_1(y_true, y_pred):
return K.mean(K.abs(y_true-y_pred)*weights)
from keras.layers import Dense, Input
from keras import Model
import keras.backend as K
input_layer = Input(shape=(5,))
out = Dense(5)(input_layer)
model = Model(input_layer, out)
model.compile('adam','mean_absolute_error')
model.fit(train_X, train_Y, epochs=1)
model.compile('adam',custom_loss_1)
model.fit(train_X, train_Y, epochs=10)
它给出以下堆栈跟踪:
InvalidArgumentError (see above for traceback): Incompatible shapes: [32,5] vs. [100,5]
[[Node: loss_9/dense_8_loss/mul = Mul[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"](loss_9/dense_8_loss/Abs, loss_9/dense_8_loss/mul/y)]]
数字32是哪里来的?
def custom_loss_2(y_true, y_pred):
return K.mean(K.abs(y_true-y_pred)*K.ones_like(y_true))
似乎可以完成此功能。因此,可能暗示将Keras张量用作权重矩阵会起作用。因此,我创建了损失函数的另一个版本。
from functools import partial
def custom_loss_3(y_true, y_pred, weights):
return K.mean(K.abs(y_true-y_pred)*K.variable(weights, dtype=y_true.dtype))
cl3 = partial(custom_loss_3, weights=weights)
使用cl3拟合数据会产生与上述相同的错误。
InvalidArgumentError (see above for traceback): Incompatible shapes: [32,5] vs. [100,5]
[[Node: loss_11/dense_8_loss/mul = Mul[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"](loss_11/dense_8_loss/Abs, loss_11/dense_8_loss/Variable/read)]]
我想知道我缺少什么!我本可以在Keras中使用sample_weight的概念;但是然后我必须将输入重塑为3d向量。
我认为该自定义损失函数确实应该微不足道。
在model.fit
批量大小是默认32,这就是这个数字的来源。这是正在发生的事情:
在custom_loss_1
张量中K.abs(y_true-y_pred)
有形状(batch_size=32, 5)
,而在numpy数组中weights
有形状(100, 5)
。这是无效的乘法,因为维数不一致并且无法应用广播。
在custom_loss_2
这个问题中不存在,因为您要乘以2个具有相同形状的张量(batch_size=32, 5)
。
在custom_loss_3
问题是相同custom_loss_1
的,因为转换weights
成Keras变量不改变它们的形状。
更新: 似乎您想对每个训练样本中的每个元素赋予不同的权重,因此weights
数组(100, 5)
确实应具有形状。在这种情况下,我将权重的数组输入模型中,然后在损失函数中使用该张量:
import numpy as np
from keras.layers import Dense, Input
from keras import Model
import keras.backend as K
from functools import partial
def custom_loss_4(y_true, y_pred, weights):
return K.mean(K.abs(y_true - y_pred) * weights)
train_X = np.random.randn(100, 5)
train_Y = np.random.randn(100, 5) * 0.01 + train_X
weights = np.random.randn(*train_X.shape)
input_layer = Input(shape=(5,))
weights_tensor = Input(shape=(5,))
out = Dense(5)(input_layer)
cl4 = partial(custom_loss_4, weights=weights_tensor)
model = Model([input_layer, weights_tensor], out)
model.compile('adam', cl4)
model.fit(x=[train_X, weights], y=train_Y, epochs=10)
我在Tensorflow后端使用Keras。我想创建一个自定义损失函数,它将获得两个直方图之间的欧几里德距离,但我得到了以下错误: TypeError:“Mul”Op的输入“y”的类型float32与参数“x”的类型int32不匹配。 因此,我不知道如何定义我的损失函数。 我试图修改代码,但我得到另一个错误。“h_true=tf.cast(h_true,dtype=tf.dtypes.float3
问题内容: 在Keras中,如果您需要自定义损失以及其他参数,我们可以像https://datascience.stackexchange.com/questions/25029/custom- loss-function-with-additional-parameter-in- 凯拉斯 当我训练模型时,上述方法有效。但是,一旦训练了模型,我将很难加载模型。当我尝试在load_model中使用c
问题内容: 在Keras(具有Tensorflow后端)中,当前输入模式可用于我的自定义损失函数吗? 当前输入模式定义为用于产生预测的输入向量。例如,考虑以下内容:。然后,当前输入模式是与y_train(在损失函数中称为y_true)关联的当前X_train向量。 在设计自定义损失函数时,我打算优化/最小化一个需要访问当前输入模式而不只是当前预测的值。 我已经看过https://github.co
嗨,我一直试图使一个自定义损失函数在kerasdice_error_coefficient。它有它的实现在张量板和我尝试使用相同的函数在keras与张量流但它不断返回一个NoneType当我使用model.train_on_batch或model.fit在那里,因为它给适当的值时,使用在模型中的指标...能不能请人帮帮我我该怎么办?我尝试过跟随像Keras-FCN这样的库,在那里他使用了自定义损失
问题内容: 我正在创建一个自定义图层,其权重需要在激活之前乘以逐个元素。当输出和输入的形状相同时,我可以使它工作。当我将一阶数组作为输入,将二阶数组作为输出时,会发生问题。tensorflow.multiply支持广播,但是当我尝试在Layer.call(x,self.kernel)中使用它来将x与self.kernel变量相乘时,它抱怨它们是不同的形状,说: 这是我的代码: 编辑:给定输入形状(
本文向大家介绍keras 自定义loss损失函数,sample在loss上的加权和metric详解,包括了keras 自定义loss损失函数,sample在loss上的加权和metric详解的使用技巧和注意事项,需要的朋友参考一下 首先辨析一下概念: 1. loss是整体网络进行优化的目标, 是需要参与到优化运算,更新权值W的过程的 2. metric只是作为评价网络表现的一种“指标”, 比如ac