迁移学习
迁移学习就是将一个问题上训练好的模型通过简单的调整使其适用于一个新的问题。
由于大型网络很复杂,训练一个复杂的卷积神经网络需要非常多的标注数据,而且需要比较长的时间。迁移学习就是为了解决大量标注数据和训练时间问题的一种变通处理方式。
在数据量足够的情况下,迁移学习的效果不如完全重新训练。但是迁移学习所需要的训练时间和训练样本数要远远小于训练完整的模型。而且可以得到不错的准确率。
下面利用ImageNet 数据集上训练好的Inception-v3 模型来解决一个新的图像分类问题。
完整代码
数据处理代码
import glob
import os.path
import numpy as np
import tensorflow as tf
from tensorflow.python.platform import gfile
# 原始输入数据的目录,这个目录下有5个子目录,每个子目录底下保存这属于该
# 类别的所有图片。
#下载链接:http://download.tensorflow.org/example_images/flower_photos.tgz
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):
'''
os.walk() 方法用于通过在目录树中游走输出在目录中的文件名,向上或者向下。
os.walk() 方法是一个简单易用的文件、目录遍历器,可以帮助我们高效的处理文件、目录方面的事情。
在Unix,Windows中有效。
'''
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:
print ("sub_dir:", sub_dir)
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:
#os.path.join就是获取INPUT_DATA目录,并组合成新目录
file_glob = os.path.join(INPUT_DATA, dir_name, '*.' + extension)
#使用glob.glob获得文件路径
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()