大家好,这是专栏《TensorFlow2.0》的第五篇文章,我们对专栏《TensorFlow2.0》进行一个总结。

我们知道全新的TensorFlow2.0 Alpha已经于2019年3月被发布,新版本对TensorFLow的使用方式进行了重大改进,为了满足各位AI人对TensorFlow2.0的需求,我们推出了专栏《TensorFlow2.0》,前四篇文章带大家领略了全新的TensorFlow2.0的变化及具体的使用方法。今天就带大家总结下TensorFlow2.0的一些变化。

作者 | 汤兴旺

编辑 | 言有三

1 默认动态图机制

在tensorflow2.0中,动态图是默认的不需要自己主动启用它。

import tensorflow as tf
a = tf.constant([1,2,3])
b = tf.constant([4,5,6])
print(a+b)

上面的结果是tf.Tensor([5 7 9], shape=(3,), dtype=int32)

可以说有了动态图,计算是非常方便的了,再也不需要理解复杂的graph和Session了。

另外我们在对比看下Pytorch中是如何计算上面的结果的。

import torch
a = torch.Tensor([1,2,3])
b = torch.Tensor([4,5,6])
print(a+b)

可以发现TensorFlow2.0和Pytorch一样简单了,而且代码基本一样。

2 弃用collections

我们知道在TensorFlow1.X中可以通过集合 (collection) 来管理不同类别的资源。例如使用tf.add_to_collection 函数可以将资源加入一个或多个集合。使用tf.get_collection获取一个集合里面的所有资源。这些资源可以是张量、变量或者运行 Tensorflow程序所需要的资源。我们在训练神经网络时会大量使用集合管理技术。如通过tf.add_n(tf.get_collection("losses")获得总损失。

由于collection控制变量很不友好,在TensorFlow2.0中,弃用了collections,这样代码会更加清晰。

我们知道TensorFlow2.0非常依赖Keras API,因此如果你使用tf.keras,每个层都会处理自己的变量,当你需要获取可训练变量的列表,可直接查询每个层。

from tensorflow import keras
from tensorflow.keras import Sequential
model = Sequential([keras.layers.Dense(100,activation="relu",input_shape=[2]),keras.layers.Dense(100,activation="relu"),keras.layers.Dense(1)
])

我们通过model.weights,就可以查询每一层的可训练的变量。结果如下面这种形式。

<tf.Variable'dense/kernel:0' shape=(2,100)             dtype=float32,   numpy=array([[...]]), dtype=float32)>,

另外在TensorFlow2.0中,也删除了Variable_scopes和tf.get_variable(),需要用面向对象的方式来处理变量共享。

3 删除杂乱的API,重用Keras

之前TensorFlow1.X中包含了很多重复的API或者不推荐使用的 API,杂乱无章,例如可以使用 tf.layers或tf.keras.layers创建图层,这样会造成很多重复和混乱的代码。

如今TensorFlow 2.0正在摆脱tf.layers,重用Keras 层,可以说如果你使用TensorFlow2.0,那么使用Keras构建深度学习模型是你的不二选择。

详细介绍请看文后第二篇文章《以后我们再也离不开Kera了》。

另外tf.contrib的各种项目也已经被合并到Keras等核心API 中,或者移动到单独的项目中,还有一些将被删除。

可以说TensorFlow 2.0会更好地组织API,使编码更简洁。

4 学习TensorFlow2.0的建议

不管你是AI小白,还是已经学习很久的大神,对于TensorFlow2.0,我们或许都需要重新学,因为它的变化太多了。当你学习TensorFlow2.0时,有如下建议供你参考:

首先不要上来就是import tensorflow as tf。其实没有必要,我建议大家先把数据预处理先学会了。比如数据你怎么read,怎么数据增强。

这个可以查看文后第三篇文章《数据读取与使用方式》。

这篇文章介绍了Tensorflow2.0读取数据的二种方式,分别是Keras API和Dataset类对数据预处理。

另外对于数据导入方式,最好使用Dataset类,个人认为这个比较方便。一个简单的例子如下:

import tensorflow as tf
import tensorflow_datasets as tfds
dataset, metadata = tfds.load('fashion_mnist', as_supervised=True, with_info=True)
train_dataset, test_dataset = dataset['train'], dataset['test']
train_dataset = train_dataset.shuffle(100).batch(12).repeat()
for img, label in train_dataset.take(1):img = img.numpy()print(img.shape)print(img)

从上面的代码我们可以看出在2.0中导入数据没有make_one_shot_iter() 这样的方法了。这个方法已经被弃用了,直接用 take(1)。

当你学会了读取数据和数据增强后,你就需要学会如何使用TensorFlow2.0构建网络模型,在TensorFlow2.0中搭建网络模型主要使用的就是Keras高级API。

如果你想要学会这个本领,可以参考文后的第四篇文章《如何搭建网络模型》。

在这篇文章我们详细介绍了如何使用Keras API搭建线性模型VGG16和非线性模型Resnet。如果你是AI小白,想要更好的掌握TensorFlow2.0,建议你使用TensorFlow2.0完成搭建VGG、GoogLeNet、Resnet等模型,这样对你掌握深度学习框架和网络结构更有帮助。

当你完成了数据读取和模型搭建后,现在你需要做的就是训练模型和可视化了。一个简单的示例如下:

import tensorflow as tf
from tensorflow.keras.callbacks import TensorBoard
from tensorflow.keras.optimizers import SGD
from tensorflow.keras.preprocessing.image import ImageDataGeneratormodel = tf.keras.models.Sequential([tf.keras.layers.Conv2D(12, (3,3), activation='relu', input_shape=(48, 48, 3),strides=(2, 2), padding='same'),tf.keras.layers.BatchNormalization(axis=3),tf.keras.layers.Conv2D(24, (3,3), activation='relu',strides=(2, 2), padding='same'),tf.keras.layers.BatchNormalization(axis=3),tf.keras.layers.Conv2D(48, (3,3), activation='relu',strides=(2, 2), padding='same'),tf.keras.layers.BatchNormalization(axis=3),tf.keras.layers.Flatten(),tf.keras.layers.Dense(128, activation='relu'),tf.keras.layers.Dense(1, activation='sigmoid')
])model.compile(loss='binary_crossentropy',optimizer = SGD(lr=0.001, decay=1e-6, momentum=0.9),metrics=['acc'])
train_datagen = ImageDataGenerator(rescale=1/255, shear_range=0.2,zoom_range=0.2, horizontal_flip=True)
validation_datagen = ImageDataGenerator(rescale=1/255)
train_generator = train_datagen.flow_from_directory(r"D://Learning//tensorflow_2.0//data//train",  # 训练集的根目录target_size=(48, 48),  # 所有图像的分辨率将被调整为48x48batch_size=32,        # 每次读取32个图像# 类别模式设为二分类class_mode='binary')# 对验证集做同样的操作
validation_generator = validation_datagen.flow_from_directory(r"D://Learning//tensorflow_2.0//data//val",target_size=(48, 48),batch_size=16,class_mode='binary')
history = model.fit_generator(train_generator,steps_per_epoch=28,epochs=500,verbose=1,validation_data = validation_generator,callbacks=[TensorBoard(log_dir=(r"D:Learninglogs"))],validation_steps=6)

上面简单示例的数据集是我们框架系列文章一直所用的表情二分类数据集。从上面的代码我们可以看出从数据读取到模型定义再到训练和可视化基本用的都是Keras 高级API,这里不再赘述。需要下载数据集的请移步github。

acc和loss可视化结果如下两图,可以看出效果还是比较可以的,上面的代码已经同步到有三AI的GitHub项目,如下第一个。

5 TensorFlow2.0优秀的github

1、https://github.com/tangxingwang/yousan.ai
1、https://github.com/czy36mengfei/tensorflow2_tutorials_chinese
3、https://github.com/jinfagang/yolov3_tf2

总结

本期我们总结了TensorFlow2.0的变化及使用方法,而且还介绍了学习它的方法和一些比较好的Github。希望您尽快能掌握它!

往期

  • 有三AI一周年了,说说我们的初衷,生态和愿景
  • 【TensorFlow2.0】TensorFlow2.0专栏上线,你来吗?
  • 【TensorFlow2.0】以后我们再也离不开Keras了?
  • 【TensorFlow2.0】数据读取与使用方式
  • 【TensorFlow2.0】如何搭建网络模型?

internetreadfile读取数据长度为0_【完结】TensorFlow2.0 快速上手手册相关推荐

  1. internetreadfile读取数据长度为0_YOLOV3的TensorFlow2.0实现,支持在自己的数据集上训练...

    GitHub链接: calmisential/YOLOv3_TensorFlow2​github.com 我主要参考了yolov3的一个keras实现版本: qqwweee/keras-yolo3​g ...

  2. internetreadfile读取数据长度为0_Go发起HTTP2.0请求流程分析(后篇)——标头压缩

    阅读建议 这是HTTP2.0系列的最后一篇,笔者推荐阅读顺序如下: Go中的HTTP请求之--HTTP1.1请求流程分析 Go发起HTTP2.0请求流程分析(前篇) Go发起HTTP2.0请求流程分析 ...

  3. internetreadfile读取数据长度为0_Hadoop 读取数据

    MapReduce - 读取数据 通过InputFormat决定读取的数据的类型,然后拆分成一个个InputSplit,每个InputSplit对应一个Map处理,RecordReader读取Inpu ...

  4. internetreadfile读取数据长度为0_Datax3.0的安装和基本使用

    今天安装了下datax,正好有一些心得,感觉可以记录下来,避免下一次在踩坑. DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL.Oracle.SqlServer.P ...

  5. 深度学习loss值变为0_利用TensorFlow2.0为胆固醇、血脂、血压数据构建时序深度学习模型(python源代码)...

    背景数据描述 胆固醇.高血脂.高血压是压在广大中年男性头上的三座大山,如何有效的监控他们,做到早发现.早预防.早治疗尤为关键,趁着这个假期我就利用TF2.0构建了一套时序预测模型,一来是可以帮我预发疾 ...

  6. diskgeniusv4.4.0_入门TensorFlow2.0

    今天老师带领我们入门TensorFlow2.0.至于tensorflow2.0是啥嘛,详细的可以度娘一下.我简述一下,就是一个end-to-end machine-Learning open sour ...

  7. 【NLP】NLP实战篇之tensorflow2.0快速入门

    修改上版代码格式问题.Tensorflow2.0跟Keras紧密结合,相比于1.0版本,2.0可以更快上手,并且能更方便找到需要的api.本文中以IMDB文本分类为例,简单介绍了从数据下载.预处理.建 ...

  8. 进一步封装axios并调用其读取数据(吐槽~在安卓9.0以下或者IOS10.X以下手机端H5页面不支持,在这两种情况下的系统只能使用ajax或者原生js请求后台数据)

    注意!!!(修改于2020年7月18日) 在安卓9.0以下或者IOS10.X以下手机端H5页面不支持,在这两种情况下的系统只能使用ajax或者原生js请求后台数据 报错截图如下 报错内容: {&quo ...

  9. SPI 读取不同长度 寄存器_正点原子Linux第二十七章SPI实验

    1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 第二十七章SPI实验 同I2C一样,SPI是很常用的通信 ...

最新文章

  1. Easy UI Tree操作
  2. 【传智播客】JavaWeb程序设计任务教程 第一章练习答案
  3. 由于开发者通过接口修改了菜单配置_Android SDK开发艺术探索(四)个性化配置...
  4. epoll nio区别_【总结】两种 NIO 实现:Selector 与 Epoll
  5. [转载] java中关于用\t格式输出
  6. Skywalking-13:Skywalking模块加载机制
  7. 本地使用TensorBoard
  8. Python3,10行代码,给pdf文件去水印,再也不用花费冤枉钱了。
  9. 【Web技术】969- 如何实现高性能的在线 PDF 预览
  10. 计算机审计质量论文,如何保证计算机审计的质量
  11. spss26没有典型相关性分析_SPSS数据分析—典型相关分析
  12. 珊瑚--shopee平台提现流程
  13. 移动硬盘内容变成快捷方式处理
  14. 内涵一下我参加过的那些竞赛。
  15. 前端base64解密
  16. Python打印车次信息
  17. 初玩《剑与家园》体验和对游戏设计的一些思考
  18. shell获取脚本本身名称_linux,shell脚本中获取脚本的名字,使用脚本的名字。
  19. 十张图带你看中国交通变迁
  20. Linux指令--let

热门文章

  1. HBase实战:记一次Safepoint导致长时间STW的踩坑之旅
  2. Matlab之rand(), randn(), randi()函数的使用方法
  3. A start job is running for Raise network interface(5min 13s )问题解决方法
  4. [Luogu1821][USACO07FEB]银牛派对Silver Cow Party
  5. easyui datagrid 列拖动
  6. OpenCV cv::Mat类
  7. Tiff – 值得你体验一下的可视化的字体对比工具
  8. 【翻译】怎样使用css制作迷人的button
  9. javaweb学习总结(四十五)——监听器(Listener)学习二
  10. springboot---成员初始化顺序