tensorflow+keras杂话

前言:
现在需要用到tensorflow+keras,有一些遇到的问题在此记录,内容随时更新可能会非常杂乱,也许会整理。


版本对应问题

从TensorFlow 2.3开始可以使用tensorflow.keras来导入Keras,即可以

import tensorflow as tf
import tensorflow.keras as keras
# 通常会直接从keras中导入模型使用,即:
from tensorflow.keras import Sequential
# 可以直接导入贯序模型使用

以下列出tensorflow、keras和python的几个常用较低版本的对应关系:(详细完整的对应关系见官方文档

tensorflow版本keras版本python版本
TensorFlow 2.2.0Keras 2.3.1Python 3.7
TensorFlow 2.1.0Keras 2.3.1Python 3.6
TensorFlow 2.0.0Keras 2.3.1Python 3.6
TensorFlow 1.15.0Keras 2.3.1Python 3.6
TensorFlow 1.14.0Keras 2.2.5Python 3.6

交叉熵损失函数

直接调用compile使用自定义的加权交叉熵损失函数作为loss时,keras接收的是一个batch_size大小的tensor对象,因此在初用时遇到定义时没问题但fit时compile收到报错:Incompatible shapes: [100,1] vs. [159999,1](这里我的batch_size是100,样本个数159999也即自定义的损失函数输出了一个159999维的向量,这里应该要让损失函数的输出维度等于1——即计算这159999个数的均值再输出,然后模型会将batch_size个均值以向量形式一次输出作为一个epoch的损失)。

接下来又发现,直接用tf.keras.losses.binary_crossentropy()是可以的,即:

def my_loss(y_true, y_pred):
    return keras.losses.binary_crossentropy(y_true,y_pred)*lamda

正常运行(其中lamda是全局变量)
发现网上大家普遍有两种调用交叉熵损失函数的方法,用到了两个不同的keras定义的交叉熵损失函数:

  1. tf.keras.losses.binary_crossentropy()
  2. tf.keras.backend.binary_crossentropy()

tf.keras.losses.binary_crossentropy()是通过调用tf.keras.backend.binary_crossentropy()来工作的,以下为官方文档提供的源码说明中的关键部分:源码地址
/keras/losses.py
即可以理解为:

from keras import backend as K

tf.keras.losses.binary_crossentropy(): 
	return K.mean( K.binary_crossentropy() )

而backend.binary_crossentropy()的完整计算过程为:(红框为关键部分)
在这里插入图片描述

可以发现计算公式为:(公式图片来源知乎(懒得自己写了)
在这里插入图片描述

tensorflow中填充tensor的方法

背景: 我在自定义的损失函数最后计算损失时,由于最后一个批次的数量不足一个batch_size的大小,因此在做损失累加时会出错,因此需要在计算loss时将tensor重构为尺寸是[batch_size,1]的tensor。
需求: 将一个[15,1]的Tensor转为一个[16,1]的Tensor。

要实现需求,需要的函数是tensorflow.pad(),首先感谢这位博主对tensor维度操作的总结及绘图:博文地址

以下提炼以下tensorflow.pad()的用法:

import tensorflow as tf


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值