• TensorFlow 2.9的零零碎碎(一)-tf.keras里的兜兜转转


    目录

    tf.keras

    TensorFlow 1的时代

    TensorFlow 2(2.6之前)的时代

    TensorFlow 2(2.6之后,含2.6)的时代

    表面统一,背后杂乱

    举几个例子

    tf.keras.datasets.mnist

    tf.keras.models.Sequential()

    tf.keras.layers


    TensorFlow和Keras就不过多介绍了。

    反正记得对于很多人来说,TensorFlow+Keras的组合就够用了,并且也很好用。

    tf.keras

    深度学习系统里有一个很严重的问题,就是兼容性。这是因为深度学习系统里有很多的模块(构件、组件),并且很可能是不同的团队开发,比如TensorFlow和Keras。

    TensorFlow 1的时代

    TensorFlow 1和Keras互相独立,虽然在TensorFlow 1.1x的时候就整合了Keras,但整合进去的还不完善,所以当时得分别安装

    1. pip install tensorflow
    2. pip install keras

    也要分别引用

    1. import tensorflow
    2. import keras

    TensorFlow 2(2.6之前)的时代

    TensorFlow 2(2.6之前)完成了对Keras 的整合,Keras变成了TensorFlow代码库的一部分。

    安装变成了只安装TensorFlow即可,Keras不再作为独立的模块出现,而是TensorFlow的一部分。

    pip install tensorflow

    这个时候感觉代码的结构就已经比较混乱了。因为想使用Keras,有好多入口(调用方法)

    比如

    1. import tensorflow.keras.xxxx
    2. import tensorflow.python.keras.xxx

    TensorFlow 2(2.6之后,含2.6)的时代

    种种原因,TensorFlow 2(2.6之后,含2.6),Keras的代码又独立出来了。

    Tensorflow 2.6 的发行说明中指出,Keras 被拆分为单独的 PIP 包(keras),Keras代码已移至 GitHub 存储库 keras-team/keras,tf.keras 的 API 端点保持不变,但现在由 keras PIP 包支持。

    对于用户来说,安装命令还是一样。

    虽然命令一样,但实际的动作和TensorFlow 2(2.6之前)不一样了,执行这条命令除了安装Tensorflow模块之外,还会自动安装Keras模块(Keras模块从TensorFlow模块中拆分出来了)

    pip install tensorflow

    Tensorflow 2.6 的发行说明中还说明了tensorflow/python/keras 中的现有代码是一个陈旧的副本,将在未来版本 (2.7) 中删除。

    应删除对 tensorflow.python.keras 的任何导入,并将它们替换为公共 tf.keras API。

    所以应统一使用

    import tensorflow.keras.xxxx

     

    表面统一,背后杂乱

    当然了,tensorflow和keras发展的过程中,分分合合,造成了很多历史遗留问题。虽然现在统一使用tensorflow.keras这个入口,但这个入口背后的代码却是层层跳转,显得非常复杂。

    tensorflow.keras里定义了很多模块,比如layers、models

    假设有一个模块叫tf.keras.xxx

    CTRL+鼠标左键点击xxx无法跳转到定义

    断点调试可以发现,tf.keras模块实际调用的是keras.api._v2.keras模块,

    查看tf.keras的源码也佐证了这一点

    1. _keras_module = "keras.api._v2.keras"
    2. keras = _LazyLoader("keras", globals(), _keras_module)
    3. _module_dir = _module_util.get_parent_dir_for_name(_keras_module)
    4. if _module_dir:
    5.   _current_module.__path__ = [_module_dir] + _current_module.__path__
    6. setattr(_current_module, "keras", keras)

    举几个例子

    tf.keras.datasets.mnist

    keras.api._v2.keras.datasets.mnist模块其实还不是最终节点,在其__init__.py中有定义

    from keras.datasets.mnist import load_data

    keras.datasets.mnist才是实现了mnist数据集操作的模块

    我们主要用到的是读取数据集,即loda_data函数

    tf.keras.models.Sequential()

    来源于from keras.api._v2.keras import models

    在keras.api._v2.keras.models的__init__.py中有定义

    from keras.engine.sequential import Sequential

    可以看出,Sequential其实是在keras.engine.sequential中实现的

    tf.keras.layers

    和tf.keras.models类似,都是定义在keras.api._v2.keras下,最终在keras.engine.xx或者keras.layers.xx中实现

    例如ReLU,实际是在from keras.layers.activation.relu import ReLU中实现

     

  • 相关阅读:
    SLAM进阶(十一)---- cannot open shared object file:解决运行时错误问题
    VMware tools的安装以及按钮灰色的解决方法
    2022.11.10 vs每次都需要重新配置环境解决方案
    为什么讨厌Java的人比较多且易见?
    Elasticsearch 批量导入数据
    C# List集合赋值
    【java爬虫】爬虫获取某交易所公司半年报全量数据
    从0搭建Vue3组件库(三): 组件库的环境配置
    【jmeter】连接mysql无法使用executeQuery()
    【鸿蒙开发】第十七章 Web组件(一)
  • 原文地址:https://blog.csdn.net/ytomc/article/details/126278293