TensorFlow:用我自己的图像训练
conv-neural-network
python
tensorflow
tensorflow-datasets
5
0

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

有没有训练新数据集的例子?

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

基于@ 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)
收藏
评论

如果您对如何在TensorFlow中输入自己的数据感兴趣,可以查看本教程
我也写与CS230的最佳做法指南在斯坦福这里


新答案(带有tf.data )和标签

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

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

代码是:

# 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. 输出一批这些图像

最简单的代码是:

# 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)
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号