TensorFlow实践5:图像识别与卷积神经网络(二)

 

【本章不做重点,并未实践,内容仅作参考】

内容摘要:

  • Inception-v3模型
  • TensorFlow实现迁移学习

5.1 Inception-v3模型

此模型中Incepton结构是将不同的卷积层通过并联的方式结合在一起的。

TensorFlow实践5:图像识别与卷积神经网络(二)

Inception模块会首先使用不同尺寸的过滤器处理输入数据。虽然过滤器的大小不一致,但是采用全0填充,所最后可以正常拼接。此模块不深入学习。其它介绍可以查看参考文献部分的两篇文档,介绍非常详细。

注:运行时自行从google下载inception_v3.ckpt文件。
TensorFlow的github代码库上可以找到完整的Inception-v3模型源码:

 

5.2 TensorFlow实现迁移学习

下面给出下载数据集的代码位置:

wget http://download.tensorflow.org/example_images/glower_photes.tgz
tar xzf flower_photos.tgz

解压后文件夹有5个子文件夹,每一个子文件夹的名称为一种花的名称,代表不同类别。平均每一种花有734章图片,每一张图片都有RGB色彩模式的,大小不同。

代码:

第一部分:数据处理部分

import glob
import os.path
import numpy as np
import tensorflow as tf
from tensorflow.python.platform import gfile

# 原始输入数据的目录,这个目录下有5个子目录,每个子目录底下保存这属于该
# 类别的所有图片。
INPUT_DATA = \'../../datasets/flower_photos\'
# 输出文件地址。我们将整理后的图片数据通过numpy的格式保存。
OUTPUT_FILE = \'../../datasets/flower_processed_data.npy\'

# 测试数据和验证数据比例。
VALIDATION_PERCENTAGE = 10
TEST_PERCENTAGE = 10


# 读取数据并将数据分割成训练数据、验证数据和测试数据。
def create_image_lists(sess, testing_percentage, validation_percentage):
    sub_dirs = [x[0] for x in os.walk(INPUT_DATA)]
    is_root_dir = True

    # 初始化各个数据集。
    training_images = []
    training_labels = []
    testing_images = []
    testing_labels = []
    validation_images = []
    validation_labels = []
    current_label = 0

    # 读取所有的子目录。
    for sub_dir in sub_dirs:
        if is_root_dir:
            is_root_dir = False
            continue

        # 获取一个子目录中所有的图片文件。
        extensions = [\'jpg\', \'jpeg\', \'JPG\', \'JPEG\']
        file_list = []
        dir_name = os.path.basename(sub_dir)
        for extension in extensions:
            file_glob = os.path.join(INPUT_DATA, dir_name, \'*.\' + extension)
            file_list.extend(glob.glob(file_glob))
        if not file_list: continue
        print("processing:", dir_name)

        i = 0
        # 处理图片数据。
        for file_name in file_list:
            i += 1
            # 读取并解析图片,将图片转化为299*299以方便inception-v3模型来处理。
            image_raw_data = gfile.FastGFile(file_name, \'rb\').read()
            image = tf.image.decode_jpeg(image_raw_data)
            if image.dtype != tf.float32:
                image = tf.image.convert_image_dtype(image, dtype=tf.float32)
            image = tf.image.resize_images(image, [299, 299])
            image_value = sess.run(image)