在tensorflow 2.0中的自定义损失和梯度代码中获取全无梯度

2024-02-07

我正在尝试在tensorflow 2.0中编写一个非常基本的损失函数。总之,我有 5 个类,我想使用一种热编码进行训练,而不对其中任何一个进行分组。我希望我的模型能够用 5 个类别中每个类别的值来预测每个输入。之后,我想尝试获取两个最高值,如果它们是 3 或 4,我想将其分类为“好”,如果不是,则将其分类为“坏”。最后,我希望我的损失为 1 精度,其中我所说的精度在以下情况下具有真阳性: 1.模型猜测3,真实类别为3 2.模型猜测为3,真实类别为4 3.模型猜测为4,真实类别为3 4.模型猜测为4,真实类别为4

再说一遍,我知道我可以更改数据标签,但我宁愿不这样做。 我使用了一些已经写好的指标来写我的损失,如下:

#@tf.function
def my_loss(output,real,threeandfour=1,weights=loss_weights,mod=m):
  m = tf.keras.metrics.TruePositives(thresholds=0.5)
  m.update_state(real,output,sample_weight=weights)
  shape_0=tf.shape(output)[0]
  #shape_1=tf.constant(2,dtype=tf.int32)
  shape_1=2
  halfs=tf.math.multiply(tf.constant(0.5,dtype=tf.float32),tf.ones((shape_0,shape_1),dtype=tf.float32))
  thrsfrs_1=output[:,2:4]
  thrsfrs=tf.cast(thrsfrs_1,dtype=tf.float32)
  logs_1=tf.math.greater(thrsfrs,halfs)
  logs=tf.cast(logs_1,dtype=tf.float32)
  print('shape of log: ',np.shape(logs))
  print('few logs: ',logs,)

  num_of_3_4s_in_model=tf.reduce_sum(logs)
  prec_1=tf.math.divide(m.result(),num_of_3_4s_in_model)
  prec=tf.cast(prec_1,dtype=tf.float32)
  return tf.math.subtract(tf.constant(1,dtype=tf.float32),prec)

梯度函数:

with tf.GradientTape() as tape:
      tape.watch(model.trainable_variables)
      y_=model(X_train)
      print('y_: ',y_)
      loss_value=my_loss(y_,tf_one_hot_train,mod=m,weights=loss_weights)
      #loss_value=tf.cast(loss_value,dtype=tf.float32)
      print('loss_value: ',loss_value)
grads=tape.gradient(loss_value,model.trainable_variables)
optimizer.apply_gradients(zip(grads, model.trainable_variables))

它确实成功地获得了张量流的损失值,并且看起来不错。这是我得到的梯度和错误:

python
got grads
[None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None]

ValueError                                Traceback (most recent call last)
<ipython-input-370-2f8f4b783a7b> in <module>()
     23 
     24 #optimizer.apply_gradients(zip(grads, model.trainable_variables), global_step)
---> 25 optimizer.apply_gradients(zip(grads, model.trainable_variables))
     26 
     27 #print("Step: {},         Loss: {}".format(global_step.numpy(),

1 frames
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/optimizer_v2/optimizer_v2.py in _filter_grads(grads_and_vars)
    973   if not filtered:
    974     raise ValueError("No gradients provided for any variable: %s." %
--> 975                      ([v.name for _, v in grads_and_vars],))
    976   if vars_with_empty_grads:
    977     logging.warning(

ValueError: No gradients provided for any variable: ['dense_40/kernel:0', 'dense_40/bias:0', 'dense_41/kernel:0', 'dense_41/bias:0', 'dense_42/kernel:0', 'dense_42/bias:0', 'dense_43/kernel:0', 'dense_43/bias:0', 'dense_44/kernel:0', 'dense_44/bias:0', 'dense_45/kernel:0', 'dense_45/bias:0', 'dense_46/kernel:0', 'dense_46/bias:0', 'dense_47/kernel:0', 'dense_47/bias:0']

我试图包含 @tf.function,我尝试将 2 转换为 int 等。我还尝试使用许多不同的其他函数(例如 tf.confusion_matrix)甚至不包含任何东西,包括仅 tf.arg_max诸如此类的事情。似乎什么都不起作用。

我正在为我能想到的损失添加最张量流的代码。同样的事情不断发生。我将它与张量流对象、numpy 对象一起使用,我检查了我的输入是从零到一,仍然没有渐变。这是我的张量流损失:

#@tf.function
def my_loss(real,output):
  threeandfour=tf.constant(1,dtype=tf.float32)
  #turning real into real classes (opposite of one hot encoding)
  real_classes=tf.argmax(real,axis=1)
  real_classes=tf.cast(real_classes,dtype=tf.float32)
  #tf.print('real_classes: ',real_classes)

  pred_classes=tf.argmax(output,axis=1)
  pred_classes=tf.cast(pred_classes,dtype=tf.float32)
  #tf.print('pred_classes: ',pred_classes)

  #checking how many 3s and 4s there are in both
  good_real=(tf.logical_or(tf.equal(real_classes,3),tf.equal(real_classes,4)))
  good_real=tf.cast(good_real,dtype=tf.float32)
  #tf.print('good_real: ',good_real)

  good_pred=(tf.logical_or(tf.equal(pred_classes,3),tf.equal(pred_classes,4)))
  good_pred=tf.cast(good_pred,dtype=tf.float32)
  #tf.print('good_pred: ',good_pred)

  #which ones do the real and model agree on
  same=tf.math.equal(good_pred,good_real)
  same=tf.cast(same,dtype=tf.float32)
  #print('same: ',same)

  #which ones do they both think are good (3 and 4)
  same_goods=tf.math.multiply(same,good_pred)
  same_goods=tf.cast(same_goods,dtype=tf.float32)
  #print('same goods: ',same_goods)

  #number of ones they both think are good
  num_same_goods=tf.reduce_sum(same_goods)
  num_same_goods=tf.cast(num_same_goods,dtype=tf.float32)
  #print('num_same_goods: ',num_same_goods)

  #number of ones model thinks are good
  num_pred_goods=tf.reduce_sum(good_pred)
  num_pred_goods=tf.cast(num_pred_goods,dtype=tf.float32)
  #print('num_pred_goods: ',num_pred_goods)

  #making sure not to divide by 0
  non_zero_num=tf.math.add(num_pred_goods,tf.constant(0.0001,dtype=tf.float32))
  #precision
  prec=tf.math.divide(num_same_goods,non_zero_num)
  prec=tf.cast(prec,dtype=tf.float32)
  #tf.print('prec: ',prec)
  #1-precision
  one_minus_prec=tf.math.subtract(tf.constant(1,dtype=tf.float32),prec)
  one_minus_prec=tf.cast(one_minus_prec,dtype=tf.float32)

  return one_minus_prec


我遇到了同样的问题tensorflow==2.0.0a0.

更新至2.0.0b1解决了我的案子

pip install -U tensorflow==2.0.0b1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在tensorflow 2.0中的自定义损失和梯度代码中获取全无梯度 的相关文章

随机推荐

  • YouTube iframe API:无法使其响应

    我正在尝试通过 iFrame API 实现 Youtube 视频 我需要捕捉一些事件 因此单独嵌入播放器不是一个选择 正如文档中所解释的 一切正常 我这样称呼视频 var tag document createElement script
  • 什么时候应该使用按位运算符?

    我阅读了以下 Stack Overflow 问题 并且了解了按位和逻辑之间的区别 参考 这个符号在 PHP 中意味着什么 https stackoverflow com questions 3737139 reference what do
  • DataSets to POCOs - 有关 DAL 架构的询问

    我必须非常快速地开发一个相当大的 ASP NET MVC 项目 并且我想获得一些关于我的 DAL 设计的意见 以确保不会有任何问题困扰我 因为 BL 可能会变得相当复杂 一些背景知识 我正在使用 Oracle 后端 因此内置的 LINQ t
  • scala并行收集处理的性能

    我遇到过需要一次处理数千条记录的情况 有时 可能有数百条 甚至可能多达 30000 条记录 我正在考虑使用scala的并行集合 为了理解其中的区别 我编写了一个简单的 pgm 如下所示 object Test extends App val
  • 当目标应用程序以管理员身份运行时,ShowWindow 功能不起作用

    我正在编写一个程序来显示 隐藏某些目标应用程序的窗口 我之前测试过它并注意到一些奇怪的事情 如果我以管理员身份运行目标应用程序 右键单击 gt 属性 兼容性 选项卡 以管理员身份运行此程序 它不起作用 为了演示 我编写了一个名为 Targe
  • Bundle install 将 gems 安装在 ./mysql2 文件夹中

    我最近在我的机器上升级了mysql 因此 我正在尝试相应地更新我的 mysql2 gem 在此过程中 我运行 bundle install 由于某种原因 我的 Gemfile 中的所有 gem 都安装在 mysql2 目录中 ruby 1
  • 如何在 Ruby 中计算标准差?

    我有几条具有给定属性的记录 我想找到标准差 我怎么做 module Enumerable def sum self inject 0 accum i accum i end def mean self sum self length to
  • Java中如何检查一个日期是否大于另一个日期? [复制]

    这个问题在这里已经有答案了 我正在开发一个 Java 应用程序 它生成用户在命令行中输入的持续时间的报告 用户需要按以下格式输入日期 dd MM yyyy gt java report startDate endDate Example j
  • TS2683 (TS) 'this' 隐式具有类型 'any',因为它没有类型注释

    我在 TypeScript 文件中遇到了这个问题 想知道如何解决这个问题 现在我已经抑制了这个打字稿异常 但想了解如何解决这个问题 以下是我的代码 export class BaseResult isSuccessful boolean t
  • 如何在 Rust 中迭代 Hashmap、打印键/值并删除值?

    对于任何语言来说 这都应该是一个微不足道的任务 这在 Rust 中不起作用 use std collections HashMap fn do it map mut HashMap
  • Angular 2 @ViewChild 不起作用。无法读取未定义的属性“标题”

    即使使用 ViewChild 导入后 我也无法访问组件的属性 下面是代码 header monitor component ts import AdminComponent from admin admin component import
  • Content-Script-Type 和 Content-Style-Type 有什么意义

    考虑这两行 来自 W3 的文档脚本编写 http www w3 org TR html4 interact scripts html 在该部分默认脚本语言 http www w3 org TR html4 interact scripts
  • 即时渲染视图

    我正在开发一个 ASP NET MVC 应用程序 它将向用户发送一封确认电子邮件 对于电子邮件本身 我想创建一个视图 然后呈现该视图并使用 NET 邮件对象发送它 我如何使用 MVC 框架来做到这一点 你基本上需要使用IView Rende
  • 记录在可枚举相等性上返回 false [重复]

    这个问题在这里已经有答案了 测试新的 C 9 记录 并希望澄清为什么序列相等在记录上不起作用 假设我有以下代码 public record Person string FirstName string LastName 以下代码将返回 tr
  • 如何在没有服务器或 UI 的情况下从嵌入式报表定义生成 PDF?

    独立的可执行文件是否可以生成报告并将其输出为 PDF 或报告查看器提供的其他导出选项之一 而不显示 ReportViewer 控件 报表定义应嵌入到可执行文件中 并且不应使用 Reporting Services Web 服务 实际上你根本
  • 如何以类似热图的方式在 ggplot2 中的地图顶部绘制样方计数

    我试图获取一个 shapefile 和其中包含的点 并最终得到 shapefile 点的绘图 然后最终在顶部覆盖有一定量的 alpha 透明度的样方分析 我尝试并想出了这个应该可以使用的示例 library ggplot2 library
  • Google Colaboratory 10-15 分钟后断开连接

    我正在尝试在 Google colab 上训练我的深度学习模型 他们提供免费的 K80 GPU 我了解到它一次可以使用12小时 然后你必须重新连接它 但我的连接在 10 15 分钟后丢失 并且无法重新连接 它停留在初始化状态 这里有什么问题
  • Spring Kafka 客户端 SSL 设置

    我的设置 JDK 11 0 6 Spring Boot 2 2 4 RELEASE 春天卡夫卡2 4 1 我已经在明文中验证了我的 Zookeeper Kafka 客户端应用程序 一切正常 我还使用 Kafka 客户端工具验证了我的密钥库
  • 如何更改 Netbeans 中 toString() 代码片段的功能

    Netbeans IDE 中是否有可能如何从上下文菜单中更改其在 into toString Alt Shift S 代码片段功能中的行为 我想在最终生成的 toString 方法中包含从类及其超类中选择的方法 主要是吸气剂 我不知道是否可
  • 在tensorflow 2.0中的自定义损失和梯度代码中获取全无梯度

    我正在尝试在tensorflow 2 0中编写一个非常基本的损失函数 总之 我有 5 个类 我想使用一种热编码进行训练 而不对其中任何一个进行分组 我希望我的模型能够用 5 个类别中每个类别的值来预测每个输入 之后 我想尝试获取两个最高值