TensorFlow:培训我自己的形象

时间:2016-05-20 07:07:40

标签: python tensorflow conv-neural-network tensorflow-datasets

我是TensorFlow的新手。我正在寻找有关图像识别的帮助,我可以训练我自己的图像数据集。

是否有训练新数据集的示例?

3 个答案:

答案 0 :(得分:68)

如果您对如何在TensorFlow中输入自己的数据感兴趣,可以查看this tutorial
我还在斯坦福大学here为CS230撰写了最佳实践指南。

新答案(使用tf.data)和标签

tf.data中引入r1.4后,我们可以创建一批没有占位符且没有队列的图像。步骤如下:

  1. 创建一个包含图像文件名和相应标签列表的列表
  2. 创建tf.data.Dataset读取这些文件名和标签
  3. 预处理数据
  4. tf.data.Dataset创建一个迭代器,它将生成下一批
  5. 代码是:

    # step 1
    filenames = tf.constant(['im_01.jpg', 'im_02.jpg', 'im_03.jpg', 'im_04.jpg'])
    labels = tf.constant([0, 1, 0, 1])
    
    # step 2: create a dataset returning slices of `filenames`
    dataset = tf.data.Dataset.from_tensor_slices((filenames, labels))
    
    # step 3: parse every image in the dataset using `map`
    def _parse_function(filename, label):
        image_string = tf.read_file(filename)
        image_decoded = tf.image.decode_jpeg(image_string, channels=3)
        image = tf.cast(image_decoded, tf.float32)
        return image, label
    
    dataset = dataset.map(_parse_function)
    dataset = dataset.batch(2)
    
    # step 4: create iterator and final input tensor
    iterator = dataset.make_one_shot_iterator()
    images, labels = iterator.get_next()
    

    现在我们可以直接运行sess.run([images, labels])而无需通过占位符提供任何数据。

    旧答案(使用TensorFlow队列)

    总结一下,你有多个步骤:

    1. 创建文件名列表(例如:图片的路径)
    2. 创建TensorFlow 文件名队列
    3. 读取并解码每个图像,将其大小调整为固定大小(批处理所需)
    4. 输出一批这些图像
    5. 最简单的代码是:

      # step 1
      filenames = ['im_01.jpg', 'im_02.jpg', 'im_03.jpg', 'im_04.jpg']
      
      # step 2
      filename_queue = tf.train.string_input_producer(filenames)
      
      # step 3: read, decode and resize images
      reader = tf.WholeFileReader()
      filename, content = reader.read(filename_queue)
      image = tf.image.decode_jpeg(content, channels=3)
      image = tf.cast(image, tf.float32)
      resized_image = tf.image.resize_images(image, [224, 224])
      
      # step 4: Batching
      image_batch = tf.train.batch([resized_image], batch_size=8)
      

答案 1 :(得分:5)

基于@ olivier-moindrot的答案,但针对Tensorflow 2.0 +:

# step 1
filenames = tf.constant(['im_01.jpg', 'im_02.jpg', 'im_03.jpg', 'im_04.jpg'])
labels = tf.constant([0, 1, 0, 1])

# step 2: create a dataset returning slices of `filenames`
dataset = tf.data.Dataset.from_tensor_slices((filenames, labels))

def im_file_to_tensor(file, label):
    def _im_file_to_tensor(file, label):
        path = f"../foo/bar/{file.numpy().decode()}"
        im = tf.image.decode_jpeg(tf.io.read_file(path), channels=3)
        im = tf.cast(image_decoded, tf.float32) / 255.0
        return im, label
    return tf.py_function(_im_file_to_tensor, 
                          inp=(file, label), 
                          Tout=(tf.float32, tf.uint8))

dataset = dataset.map(im_file_to_tensor)

如果遇到类似以下问题:

ValueError:无法采用未知等级的Shape的长度

当将tf.data.Dataset张量传递给model.fit时,请看一下https://github.com/tensorflow/tensorflow/issues/24520。上面的代码片段的解决方法是:

def im_file_to_tensor(file, label):
    def _im_file_to_tensor(file, label):
        path = f"../foo/bar/{file.numpy().decode()}"
        im = tf.image.decode_jpeg(tf.io.read_file(path), channels=3)
        im = tf.cast(image_decoded, tf.float32) / 255.0
        return im, label

    file, label = tf.py_function(_im_file_to_tensor, 
                                 inp=(file, label), 
                                 Tout=(tf.float32, tf.uint8))
    file.set_shape([192, 192, 3])
    label.set_shape([])
    return (file, label)

答案 2 :(得分:0)

使用Tensorflow Hub的

2.0兼容答案 Tensorflow Hub Tensorflow提供的商品/产品,包括Google开发的模型,用于文本和图像数据集。

saves Thousands of Hours of Training Time and Computational Effort ,因为它可以重用现有的预训练模型。

如果我们有一个图像数据集,我们可以从TF Hub中获取现有的预训练模型,并将其应用于我们的数据集。

使用预训练模型MobileNet重新训练图像数据集的代码如下所示:

import itertools
import os

import matplotlib.pylab as plt
import numpy as np

import tensorflow as tf
import tensorflow_hub as hub

module_selection = ("mobilenet_v2_100_224", 224) #@param ["(\"mobilenet_v2_100_224\", 224)", "(\"inception_v3\", 299)"] {type:"raw", allow-input: true}
handle_base, pixels = module_selection
MODULE_HANDLE ="https://tfhub.dev/google/imagenet/{}/feature_vector/4".format(handle_base)
IMAGE_SIZE = (pixels, pixels)
print("Using {} with input size {}".format(MODULE_HANDLE, IMAGE_SIZE))

BATCH_SIZE = 32 #@param {type:"integer"}

#Here we need to Pass our Dataset

data_dir = tf.keras.utils.get_file(
    'flower_photos',
    'https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz',
    untar=True)

model = tf.keras.Sequential([
    hub.KerasLayer(MODULE_HANDLE, trainable=do_fine_tuning),
    tf.keras.layers.Dropout(rate=0.2),
    tf.keras.layers.Dense(train_generator.num_classes, activation='softmax',
                          kernel_regularizer=tf.keras.regularizers.l2(0.0001))
])
model.build((None,)+IMAGE_SIZE+(3,))
model.summary()

完整的图像再训练教程代码可以在此Github Link中找到。

有关Tensorflow Hub的更多信息,可以在此TF Blog中找到。

与图像相关的预训练模块可以在此TF Hub Link中找到。

所有与图像,文本,视频等相关的预培训模块都可以在此TF HUB Modules Link中找到。

最后,这是Basic Page for Tensorflow Hub