计算机视觉: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.Dataset 类,提供了对数据集的高层封装。

  • 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常用功能模块的主要内容,如果未能解决你的问题,请参考以下文章

tensorflow 机器学习资料及其工具库

『计算机视觉』SSD源码学习_基于TensorFlow(待续)

计算机视觉入门

深度学习框架-TensorFlow

机器学习(TensorFlow)---Fashion MNIST数据集使用范例(计算机视觉)

黑马程序员深度学习框架TensorFlow讲义