gpt4 book ai didi

tensorflow - 对具有不同图像大小的数据集使用 tensorflow TFRecords

转载 作者:行者123 更新时间:2023-12-03 16:43:15 25 4
gpt4 key购买 nike

在 TensorFlow 教程示例中,TFRecords 的用法与 MNIST 数据集一起提供。
MNIST 数据集被转换为 TFRecords 文件,如下所示:

def convert_to(data_set, name):
images = data_set.images
labels = data_set.labels
num_examples = data_set.num_examples

if images.shape[0] != num_examples:
raise ValueError('Images size %d does not match label size %d.' %
(images.shape[0], num_examples))
rows = images.shape[1]
cols = images.shape[2]
depth = images.shape[3]

filename = os.path.join(FLAGS.directory, name + '.tfrecords')
print('Writing', filename)
writer = tf.python_io.TFRecordWriter(filename)
for index in range(num_examples):
image_raw = images[index].tostring()
example = tf.train.Example(features=tf.train.Features(feature={
'height': _int64_feature(rows),
'width': _int64_feature(cols),
'depth': _int64_feature(depth),
'label': _int64_feature(int(labels[index])),
'image_raw': _bytes_feature(image_raw)}))
writer.write(example.SerializeToString())
writer.close()

然后像这样读取和解码它:
def read_and_decode(filename_queue):
reader = tf.TFRecordReader()
_, serialized_example = reader.read(filename_queue)
features = tf.parse_single_example(
serialized_example,
# Defaults are not specified since both keys are required.
features={
'image_raw': tf.FixedLenFeature([], tf.string),
'label': tf.FixedLenFeature([], tf.int64),
})

# Convert from a scalar string tensor (whose single string has
# length mnist.IMAGE_PIXELS) to a uint8 tensor with shape
# [mnist.IMAGE_PIXELS].
image = tf.decode_raw(features['image_raw'], tf.uint8)
image.set_shape([mnist.IMAGE_PIXELS])

# OPTIONAL: Could reshape into a 28x28 image and apply distortions
# here. Since we are not applying any distortions in this
# example, and the next step expects the image to be flattened
# into a vector, we don't bother.

# Convert from [0, 255] -> [-0.5, 0.5] floats.
image = tf.cast(image, tf.float32) * (1. / 255) - 0.5

# Convert label from a scalar uint8 tensor to an int32 scalar.
label = tf.cast(features['label'], tf.int32)

return image, label

问题:有没有办法从不同大小的 TFRecords 中读取图像?因为此时
image.set_shape([mnist.IMAGE_PIXELS])

需要知道所有张量的大小。这意味着我不能做类似的事情
width = tf.cast(features['width'], tf.int32)
height = tf.cast(features['height'], tf.int32)
tf.reshape(image, [width, height, 3])

那么在这种情况下如何使用 TFRecords 呢?
我也无法理解为什么在教程中作者在 TFRecords 文件中保存高度和宽度,如果他们之后不使用它,而是在读取和解码图像时使用预定义的常量。

最佳答案

对于这种特殊情况下的训练,没有理由保持宽度和高度,但是由于图像被序列化为单个字节流,因此您可能想知道数据最初具有什么形状而不是 784字节 - 从本质上讲,它们只是在创建自包含的示例。

对于不同大小的图像,您必须记住,在某些时候您需要将特征张量映射到权重,并且由于给定网络的权重数量是固定的,因此特征张量的尺寸必须是固定的。要考虑的另一点是数据标准化:如果您使用不同形状的图像,它们是否具有相同的均值和方差?你可能会选择忽略这一点,但如果你不这样做,你也必须想出一个解决方案。

如果您只是要求使用不同尺寸的图像,即 100x100x3而不是 28x28x1 , 你当然可以使用

image.set_shape([100, 100, 3])

为了 reshape 30000 的单个张量“元素”总计为单个 rank-3 张量。
或者,如果您正在处理批处理(大小待定),您可以使用
image_batch.set_shape([None, 100, 100, 3])

请注意,这不是张量列表,而是单个 4 级张量,因此该批处理中的所有图像都必须具有相同的尺寸;即拥有 100x100x3图片后跟 28x28x1同一批处理中的图像是不可能的。

在批处理之前,尽管您可以自由地拥有您想要的任何大小和形状,并且您也可以从记录中加载形状 - 它们在 MNIST 示例中没有这样做。例如,您可以应用 image processing operations 中的任何一个为了获得固定大小的增强图像进行进一步处理。

另请注意,图像的序列化表示可能确实具有不同的长度和形状。例如,您可能决定存储 JPEG or PNG bytes而不是原始像素值;它们显然会有不同的尺寸。

最后是 tf.FixedLenFeature()也是,但他们正在创建 SparseTensor申述。不过,这通常与非二进制图像无关。

关于tensorflow - 对具有不同图像大小的数据集使用 tensorflow TFRecords,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38762365/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com