Tensorflow基础教程8:自定义层、损失函数和评估指标

在开始学习之前推荐大家可以多在  FlyAI竞赛服务平台 多参加训练和竞赛,以此来提升自己的能力。FlyAI是为AI开发者提供数据竞赛并支持GPU离线训练的一站式服务平台。每周免费提供项目开源算法样例,支持算法能力变现以及快速的迭代算法模型。

目录

  自定义层、损失函数和评估指标

  自定义层

  自定义损失函数和评估指标

  自定义层、损失函数和评估指标

  可能你还会问,如果现有的这些层无法满足我的要求,我需要定义自己的层怎么办?事实上,我们不仅可以继承 tf.keras.Model 编写自己的模型类,也可以继承 tf.keras.layers.Layer 编写自己的层。

  自定义层

  自定义层需要继承 tf.keras.layers.Layer 类,并重写 __init__ 、 build 和 call 三个方法,如下所示:

  class MyLayer(tf.keras.layers.Layer):

  def __init__(self):

  super().__init__()

  # 初始化代码

  def build(self, input_shape): # input_shape 是一个 TensorShape 类型对象,提供输入的形状

  # 在第一次使用该层的时候调用该部分代码,在这里创建变量可以使得变量的形状自适应输入的形状

  # 而不需要使用者额外指定变量形状。

  # 如果已经可以完全确定变量的形状,也可以在__init__部分创建变量

  self.variable_0 = self.add_weight(...)

  self.variable_1 = self.add_weight(...)

  def call(self, inputs):

  # 模型调用的代码(处理输入并返回输出)

  return output

  例如,如果我们要自己实现一个 Tensorflow模型建立与训练 一节中的全连接层( tf.keras.layers.Dense ),可以按如下方式编写。此代码在 build 方法中创建两个变量,并在 call 方法中使用创建的变量进行运算:

  class LinearLayer(tf.keras.layers.Layer):

  def __init__(self, units):

  super().__init__()

  self.units = units

  def build(self, input_shape): # 这里 input_shape 是第一次运行call()时参数inputs的形状

  self.w = self.add_variable(name='w',

  shape=[input_shape[-1], self.units], initializer=tf.zeros_initializer())

  self.b = self.add_variable(name='b',

  shape=[self.units], initializer=tf.zeros_initializer())

  def call(self, inputs):

  y_pred = tf.matmul(inputs, self.w) + self.b

  return y_pred

  在定义模型的时候,我们便可以如同 Keras 中的其他层一样,调用我们自定义的层 LinearLayer:

  class LinearModel(tf.keras.Model):

  def __init__(self):

  super().__init__()

  self.layer = LinearLayer(units=1)

  def call(self, inputs):

  output = self.layer(inputs)

  return output

  自定义损失函数和评估指标

  自定义损失函数需要继承 tf.keras.losses.Loss 类,重写 call 方法即可,输入真实值 y_true 和模型预测值 y_pred ,输出模型预测值和真实值之间通过自定义的损失函数计算出的损失值。下面的示例为均方差损失函数:大连妇科医院哪家好 http://mobile.84211111.cn/

  class MeanSquaredError(tf.keras.losses.Loss):

  def call(self, y_true, y_pred):

  return tf.reduce_mean(tf.square(y_pred - y_true))

  自定义评估指标需要继承 tf.keras.metrics.Metric 类,并重写 __init__、 update_state 和 result 三个方法。下面的示例对前面用到的 SparseCategoricalAccuracy 评估指标类做了一个简单的重实现:

  class SparseCategoricalAccuracy(tf.keras.metrics.Metric):

  def __init__(self):

  super().__init__()

  self.total = self.add_weight(name='total', dtype=tf.int32, initializer=tf.zeros_initializer())

  self.count = self.add_weight(name='count', dtype=tf.int32, initializer=tf.zeros_initializer())

  def update_state(self, y_true, y_pred, sample_weight=None):

  values = tf.cast(tf.equal(y_true, tf.argmax(y_pred, axis=-1, output_type=tf.int32)), tf.int32)

  self.total.assign_add(tf.shape(y_true)[0])

  self.count.assign_add(tf.reduce_sum(values))

  def result(self):

  return self.count / self.total

在这里插入图片描述


更多关于人工智能的文章,敬请访问:FlyAI-AI竞赛服务平台学习圈学习;同时FlyAI欢迎广大算法工程师在平台发文,获得更多原创奖励。此外,FlyAI竞赛平台提供大量数据型赛题供学习党和竞赛党参与,免费GPU试用,更多大赛经验分享。

 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值