相关疑难解决方法(0)

Keras 中带有权重的自定义损失函数

我是神经网络新手。我想在 TensorFlow 中制作一个自定义损失函数,但我需要获取权重向量,所以我这样做了:

def my_loss(weights):
  def custom_loss(y, y_pred):
    return weights*(y - y_pred)
  return custom_loss
model.compile(optimizer='adam', loss=my_loss(weights), metrics=['accuracy'])
model.fit(x_train, y_train, batch_size=None,  validation_data=(x_test, y_test), epochs=100)

Run Code Online (Sandbox Code Playgroud)

当我启动它时,我收到此错误:

InvalidArgumentError:  Incompatible shapes: [50000,10] vs. [32,10]
Run Code Online (Sandbox Code Playgroud)

形状是:

print(weights.shape)
print(y_train.shape)
Run Code Online (Sandbox Code Playgroud)
(50000, 10)
(50000, 10)
Run Code Online (Sandbox Code Playgroud)

所以我认为这是批次的问题,我没有很强的TensorFlow背景,所以我尝试使用全局变量以简单的方式解决

batch_index = 0
Run Code Online (Sandbox Code Playgroud)

然后在自定义回调中将其更新到“on_batch_begin”挂钩中。但这没有用,而且是一个糟糕的解决方案。那么,如何才能得到对应y的权重的精确部分呢?我有办法获取自定义损失中的当前批次索引吗?预先感谢您的帮助

python neural-network keras tensorflow loss-function

8
推荐指数
1
解决办法
1万
查看次数

Keras - 自定义损失函数/访问张量的第 75 个百分位元素

我正在尝试为 Keras 中的模型实现一个稍微修改的二元交叉熵损失函数。在 Keras 中,binary_crossentropy 定义为:

def binary_crossentropy(y_true, y_pred):
  return K.mean(K.binary_crossentropy(y_true, y_pred), axis=-1)
Run Code Online (Sandbox Code Playgroud)

我拥有的数据是分组的(即有一列指示 group1、group2 等)但每个组的行数不同(即 group1 有 52 个观察值,group2 有 101 个观察值等)。

理想情况下,我想找到每个组的平均二元交叉熵,并返回最大平均二元交叉熵(最大的平均二元交叉熵,按组)。

似乎没有使用组的任何现成的解决方案,我无法想出一个解决方案。关于观察属于哪个组的信息会丢失,并且不会传递到 y_true 和 y_pred,而且我不确定 k-fold cv 将如何准确地改变作为 y_true 和 y_pred 传递的观察值/数量。如果有办法通过 Sequential 模型保留组信息,那可能就是解决方案。代码将完成类似的事情:

def custom_loss(y_true, y_pred):
  max_bc = []
  for group in groups:
     max_bc += [K.mean(K.binary_crossentropy(y_true, y_pred), axis=-1)]
  return max_bc
Run Code Online (Sandbox Code Playgroud)

如果上述方法不可行,另一种度量可能是张量的第 75 个百分位值。就像是:

def custom_loss(y_true, y_pred):
  return K.binary_crossentropy(y_true, y_pred)[len(y_true)*0.75]
Run Code Online (Sandbox Code Playgroud)

但我确信这是错误的——我只是对 Keras 和 Tensorflow 不够熟悉,无法获得正确的代码。

编辑:我可能刚刚找到了一种方法来做百分位数,但结果并不如预期......对第一部分有所了解仍然很棒。

def custom_loss(y_true, y_pred):
  e = K.binary_crossentropy(y_true,y_pred)
  return distributions.percentile(e, q=75.)
Run Code Online (Sandbox Code Playgroud)

python sequential keras tensorflow loss-function

6
推荐指数
0
解决办法
588
查看次数

如何在Keras中将损失函数指定为二次加权kappa?

我的理解是,keras要求损失函数具有签名:

def custom_loss(y_true, y_pred):
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用sklearn.metrics.cohen_kappa_score,需要(y1,y2,labels = None,weights = None,sample_weight = None)`

如果我按原样使用它:

model.compile(loss=metrics.cohen_kappa_score,
              optimizer='adam', metrics=['accuracy'])
Run Code Online (Sandbox Code Playgroud)

然后,weights将不会设置。我想将其设置为quadtratic。有什么要通过这个吗?

python scikit-learn keras

2
推荐指数
1
解决办法
2708
查看次数