计算机视觉:Tensorflow常用功能模块
Posted GeniusAng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算机视觉:Tensorflow常用功能模块相关的知识,希望对你有一定的参考价值。
计算机视觉笔记总目录
1 fit的callbacks详解
回调是在训练过程的给定阶段应用的一组函数。可以使用回调来获取培训期间内部状态和模型统计信息的视图。您可以将回调列表(作为关键字参数callbacks
)传递给或类的 fit()
方法。然后将在训练的每个阶段调用回调的相关方法。
- 定制化保存模型
- 保存events文件
1.1 ModelCheckpoint
from tensorflow.python.keras.callbacks import ModelCheckpoint
ModelCheckpoint(filepath, monitor='val_loss', save_best_only=False, save_weights_only=False, mode='auto', period=1)
- Save the model after every epoch:每隔多少次迭代保存模型
- filepath:保存模型字符串
- 如果设置 weights.epoch:02d-val_loss:.2f.hdf5格式,将会每隔epoch number数量并且将验证集的损失保存在该位置
- 如果设置weights.epoch:02d-val_acc:.2f.hdf5,将会按照val_acc的值进行保存模型
- monitor:quantity to monitor.设置为’val_acc’或者’val_loss’
- save_best_only:if save_best_only=True, 只保留比上次模型更好的结果
- save_weights_only:if True, 只保存去那种(model.save_weights(filepath)), else the full model is saved (model.save(filepath)).
- mode:one of auto, min, max. 如果save_best_only=True, 对于val_acc, 要设置max, 对于val_loss要设置min
- period: 迭代保存checkpoints的间隔
check = ModelCheckpoint('./ckpt/singlenn_epoch:02d-val_acc:.2f.h5',
monitor='val_acc',
save_best_only=True,
save_weights_only=True,
mode='auto',
period=1)
SingleNN.model.fit(self.train, self.train_label, epochs=5, callbacks=[check], validation_data=(x, y))
注意:使用ModelCheckpoint一定要在fit当中指定验证集才能使用,否则报错误。
1.2 Tensorboard
添加Tensorboard观察损失等情况
from tensorflow.python.keras.callbacks import TensorBoard
TensorBoard(log_dir='./logs', histogram_freq=0, batch_size=32, write_graph=True, write_grads=False, write_images=False, embeddings_freq=0, embeddings_layer_names=None, embeddings_metadata=None, embeddings_data=None, update_freq='epoch')
- log_dir:保存事件文件目录
- write_graph=True:是否显示图结构
- write_images=False:是否显示图片
- write_grads=True:是否显示梯度histogram_freq 必须大于0
# 添加tensoboard观察
tensorboard = keras.callbacks.TensorBoard(log_dir='./graph', histogram_freq=1,
write_graph=True, write_images=True)
SingleNN.model.fit(self.train, self.train_label, epochs=5, callbacks=[tensorboard])
打开终端查看:
# 指定存在文件的目录,打开下面命令
tensoboard --logdir "./"
2 tf.data:数据集的构建与预处理
问题引入:
在大部分时候,我们希望使用自己的数据集来训练模型。然而,面对一堆格式不一的原始数据文件,将其预处理并读入程序的过程往往十分繁琐,甚至比模型的设计还要耗费精力。比如,为了读入一批图像文件,我们可能需要纠结于 python 的各种图像处理包(比如 pillow ),自己设计 Batch 的生成方式,最后还可能在运行的效率上不尽如人意。为此,TensorFlow 提供了 tf.data 这一模块,包括了一套灵活的数据集构建 API,能够帮助我们快速、高效地构建数据输入的流水线,尤其适用于数据量巨大的场景。
2.1 数据集对象的建立
tf.data
的核心是 tf.data.Datase
t 类,提供了对数据集的高层封装。
tf.data.Dataset
由一系列的可迭代访问的元素(element)组成,每个元素包含一个或多个张量。比如说,对于一个由图像组成的数据集,每个元素可以是一个形状为 长×宽×通道数 的图片张量,也可以是由图片张量和图片标签张量组成的元组(Tuple)。
最基础的建立 tf.data.Dataset
的方法是使用 tf.data.Dataset.from_tensor_slices()
,适用于数据量较小(能够整个装进内存)的情况。
import tensorflow as tf
import numpy as np
X = tf.constant([2015, 2016, 2017, 2018, 2019])
Y = tf.constant([12000, 14000, 15000, 16500, 17500])
# 也可以使用NumPy数组,效果相同
# X = np.array([2015, 2016, 2017, 2018, 2019])
# Y = np.array([12000, 14000, 15000, 16500, 17500])
dataset = tf.data.Dataset.from_tensor_slices((X, Y))
for x, y in dataset:
print(x.numpy(), y.numpy())
输出:
2013 12000
2014 14000
2015 15000
2016 16500
2017 17500
同样类似地,我们可以载入 MNIST 数据集:
import matplotlib.pyplot as plt
(train_data, train_label), (_, _) = tf.keras.datasets.mnist.load_data()
# [60000, 28, 28, 1]
train_data = np.expand_dims(train_data.astype(np.float32) / 255.0, axis=-1)
mnist_dataset = tf.data.Dataset.from_tensor_slices((train_data, train_label))
for image, label in mnist_dataset:
print(label.numpy())
print(image.numpy())
2.2 数据集对象的预处理
tf.data.Dataset
类为我们提供了多种数据集预处理方法。最常用的如:
-
1、
Dataset.map(f)
对数据集中的每个元素应用函数 f ,得到一个新的数据集(这部分往往结合 tf.io 进行读写和解码文件, tf.image 进行图像处理)
-
2、
Dataset.shuffle(buffer_size)
将数据集打乱(设定一个固定大小的缓冲区(Buffer),取出前 buffer_size 个元素放入,并从缓冲区中随机采样,采样后的数据用后续数据替换);
-
3、
Dataset.batch(batch_size)
将数据集分成批次,即对每 batch_size 个元素,使用 tf.stack() 在第 0 维合并,成为一个元素。
-
4、
Dataset.prefetch()
预取出数据集中的若干个元素
-
5、除此以外,还有
Dataset.repeat()
(重复数据集的元素)、Dataset.reduce()
(与 Map 相对的聚合操作)、Dataset.take()
等,可参考 API文档 进一步了解。
2.3 使用案例
- 使用
Dataset.map()
将所有图片旋转 90 度
def rot90(image, label):
image = tf.image.rot90(image)
return image, label
mnist_dataset = mnist_dataset.map(rot90)
for image, label in mnist_dataset:
plt.title(label.numpy())
plt.imshow(image.numpy()[:, :, 0])
plt.show()
- 使用
Dataset.batch()
将数据集划分批次,每个批次的大小为 4
# 获取批次数据
mnist_dataset = mnist_dataset.batch(4)
for images, labels in mnist_dataset:
fig, axs = plt.subplots(1, 4)
for i in range(4):
axs[i].set_title(labels.numpy()[i])
axs[i].imshow(images.numpy()[i, :, :, 0])
plt.show()
- 使用
Dataset.shuffle()
将数据打散后再设置批次,缓存大小设置为 10000- 设定一个固定大小为 buffer_size 的缓冲区(Buffer);初始化时,取出数据集中的前 buffer_size 个元素放入缓冲区;
- 每次需要从数据集中取元素时,即从缓冲区中随机采样一个元素并取出,然后从后续的元素中取出一个放回到之前被取出的位置,以维持缓冲区的大小。
mnist_dataset = mnist_dataset.shuffle(buffer_size=10000).batch(4)
for images, labels in mnist_dataset:
fig, axs = plt.subplots(1, 4)
for i in range(4):
axs[i].set_title(labels.numpy()[i])
axs[i].imshow(images.numpy()[i, :, :, 0])
plt.show()
以上是关于计算机视觉:Tensorflow常用功能模块的主要内容,如果未能解决你的问题,请参考以下文章
『计算机视觉』SSD源码学习_基于TensorFlow(待续)