一文上手最新TensorFlow2.0系列(二)
本文是全系列中第6 / 23篇:TensorFlow 从入门到精通
- Tensorflow 介绍和安装
- 【干货】史上最全的Tensorflow学习资源汇总
- 文末福利|一文上手TensorFlow2.0(一)
- TensorFlow 卷积神经网络手写数字识别数据集介绍
- 特征工程
- 一文上手最新TensorFlow2.0系列(二)
- 深度学习之激活函数
- Tensorflow实现MNIST手写数字识别
- 一文上手Tensorflow2.0之tf.keras|三
- 卷积神经网络概述
- 损失函数综述
- 一文上手Tensorflow2.0(四)
- TensorFlow 一步一步实现卷积神经网络
- Tensorboard 详解(上篇)
- 深度学习发展史
- Tensorflow从入门到精通之——Tensorflow基本操作
- Tensorboard详解(下篇)
- 卷积的发展历程,原理和基于 TensorFlow 的实现
- 五大经典卷积神经网络介绍:LeNet / AlexNet / GoogLeNet / VGGNet/ ResNet
- TensorFlow 多GPU使用详解
- 一文彻底搞懂BP算法:原理推导+数据演示+项目实战(上篇)
- TensorFlow 实战卷积神经网络之 LeNet
- 深度学习之视频人脸识别系列二:人脸检测与对齐
【磐创AI导读】:本系列文章介绍了与tensorflow的相关知识,包括其介绍、安装及使用等。本篇文章将接着上篇文章继续介绍它的安装及部分使用。查看上篇:文末福利|一文上手TensorFlow2.0(一)。想要获取更多的机器学习、深度学习资源,欢迎大家点击上方蓝字关注我们的公众号:磐创AI。
-
Tensorflow2.0 介绍 -
Tensorflow 常见基本概念 -
从1.x 到2.0 的变化 -
Tensorflow2.0 的架构 -
Tensorflow2.0 的安装(CPU和GPU) -
Tensorflow2.0 使用 -
“tf.data” API -
“tf.keras”API
-
使用GPU加速 -
安装配置GPU环境 -
使用Tensorflow-GPU
2. TensorFlow2.0安装
conda create --name apython python=3.6
接着出现提示是否继续,输入“y”回车,稍等片刻一个Python3.6的虚拟环境就创建好了。此时系统中有多个版本的Python,为了方便使用,我们配置一下环境变量,为每个版本的Python设置一个别名。另外为了后面方便使用“pip”来管理虚拟环境的包,我们为虚拟环境的“pip”命令也创建一个别名。
编辑“~/.bashrc”文件,在文件末尾增加如下内容:
alias python="/usr/bin/python2"
alias python3="/usr/bin/python3"
alias apython="/home/lqhou/anaconda3/envs/apython/bin/python3"
alias apip="/home/lqhou/anaconda3/envs/apython/bin/pip"
apip install tensorflow-2.0.0a0-cp36-cp36m-manylinux1_x86_64.whl
安装完成后,我们进入python的交互式解释器环境验证安装是否成功,如图8所示:
3 TensorFlow2.0使用
3.1 “tf.data”API
-
Extract:从硬盘中读取数据(可以是本地的也可以是云端的)。
-
Transform:数据的预处理(例如数据清洗、格式转换等)。
-
Load:将处理好的数据加载到计算设备(例如CPU、GPU以及TPU等)。
数据输入管道一般使用CPU来执行ELT过程,GPU等其他硬件加速设备则负责模型的训练,ELT过程和模型的训练并行执行,从而提高模型训练的效率。另外ELT过程的各个步骤也都可以进行相应的优化,例如并行的读取数据以及并行的处理数据等。在TensorFlow中我们可以使用“tf.data”API来构建这样的数据输入管道。
import tensorflow as tf
import pathlib
print(tf.__version__)
# 获取当前路径
data_root = pathlib.Path.cwd()
# 获取指定目录下的文件路径(返回是一个列表,每一个元素是一个PosixPath对象)
all_image_paths = list(data_root.glob('*/*/*'))
print(type(all_image_paths[0]))
# 将PosixPath对象转为字符串
all_image_paths = [str(path) for path in all_image_paths]
print(all_image_paths[0])
print(data_root)
# 获取图片类别的名称,即存放样本图片的五个文件夹的名称
label_names = sorted(item.name for item in data_root.glob('*/*/') if item.is_dir())
# 将类别名称转为数值型的类标
label_to_index = dict((name, index) for index, name in enumerate(label_names))
# 获取所有图片的类标
all_image_labels = [label_to_index[pathlib.Path(path).parent.name]
print(label_to_index)
print("First 10 labels indices: ", all_image_labels[:2])
print("First 10 labels indices: ", all_image_paths[:2])
def load_and_preprocess_image(path):
# 读取图片
image = tf.io.read_file(path)
# 将jpeg格式的图片解码,得到一个张量(三维的矩阵)
image = tf.image.decode_jpeg(image, channels=3)
# 由于数据集中每张图片的大小不一样,统一调整为192*192
image = tf.image.resize(image, [192, 192])
# 对每个像素点的RGB值做归一化处理
image /= 255.0
return image
# 构建图片路径的“dataset”
path_ds = tf.data.Dataset.from_tensor_slices(all_image_paths)
# 使用AUTOTUNE自动调节管道参数
AUTOTUNE = tf.data.experimental.AUTOTUNE
# 构建图片数据的“dataset”
image_ds = path_ds.map(load_and_preprocess_image,
num_parallel_calls=AUTOTUNE)
# 构建类标数据的“dataset”
label_ds = tf.data.Dataset.from_tensor_slices(tf.cast(all_image_labels, tf.int64))
# 将图片和类标压缩为(图片,类标)对
image_label_ds = tf.data.Dataset.zip((image_ds, label_ds))
print(image_ds)
print(label_ds)
print(image_label_ds)
import matplotlib.pyplot as plt
plt.figure(figsize=(8,8))
for n,image_label in enumerate(image_label_ds.take(4)):
plt.subplot(2,2,n+1)
plt.imshow(image_label[0])
plt.grid(False)
plt.xticks([])
plt.yticks([])
plt.xlabel(image_label[1])
# 下载的模型在用户根目录下,具体位置:“~/.keras/models/
mobilenet_v2_weights_tf_dim_ordering_tf_kernels_1.0_192_no_top.h5”
mobile_net = tf.keras.applications.MobileNetV2(input_shape=(192, 192, 3),
include_top=False)
# 禁止训练更新“MobileNetV2”模型的参数
mobile_net.trainable = False
# 使用Dataset类的shuffle方法打乱数据集
image_count = len(all_image_paths)
ds = image_label_ds.shuffle(buffer_size=image_count)
# 让数据集重复多次
ds = ds.repeat()
# 设置每个batch的大小
BATCH_SIZE = 32
ds = ds.batch(BATCH_SIZE)
# 通过“prefetch”方法让模型的训练和每个batch数据集的加载并行
ds = ds.prefetch(buffer_size=AUTOTUNE)
# 定义一个函数用来将范围在[0,1]之间的数据映射到[-1,1]之间
def change_range(image,label):
return 2*image-1, label
# 使用“map”方法对dataset进行处理
keras_ds = ds.map(change_range)
model = tf.keras.Sequential([
mobile_net,
tf.keras.layers.GlobalAveragePooling2D(),
tf.keras.layers.Dense(len(label_names))])
model.compile(optimizer=tf.keras.optimizers.Adam(),
loss='sparse_categorical_crossentropy',
metrics=["accuracy"])
model.summary()
model.fit(ds, epochs=1, steps_per_epoch=10)
留言送书福利
/ 今日留言主题 /
原创文章,作者:fendouai,如若转载,请注明出处:https://panchuang.net/2019/08/20/793f8c9bdd/