gpt4 book ai didi

python - 如何在 tensorflow 中实现图像(二维数组)序列滑动窗口?

转载 作者:行者123 更新时间:2023-11-28 18:03:49 26 4
gpt4 key购买 nike

上下文

我们将数据存储在.tfrecord 文件中,X 是我们的训练数据> 40x40 灰度图像和Y: 是标签。这些图像按顺序排列(顺序很重要)。我们想使用 Tensorflows Estimator API 输入这些图像,以使用 GoogleML 训练具有各种时间窗口大小和偏移的神经网络模型(例如:LSTM)。

问题

如何将输入的特征字符串 reshape 为一定长度的序列,例如将 1000 图像放入一个序列中,然后对这些序列执行窗口操作,例如获取包含 50 个图像的窗口,窗口偏移 25

当前状态

我们已经设法实现了这一点(下面的稀疏示例),而无需首先重新整形为 1000 个长度集,但随后结果是从一个集合的元素 975 到下一个集合的元素 25 的窗口,我们这样做不想我们需要从每组 1000 图像的开始到结束的重叠窗口,但不能跨越它们的边界。

import tensorflow as tf

# .tfrecord file consisting of data 'X' and labels 'Y'
dataset = tf.data.TFRecordDataset('.tfrecord file')

# define parse function for dataset.map function
def _parse_function(proto):
# define constants for parsing
image_size = 40
num_channels = 1
num_classes = 3


# define your tfrecord feature keys and
# reshape 1D arrays into 2D arrays (images)
keys_to_features = {'X': tf.FixedLenFeature([image_size, image_size, num_channels], tf.float32), # image height, image width, num_channels
'Y': tf.FixedLenFeature([], tf.int64)}

# Load one example
parsed_features = tf.parse_single_example(proto, keys_to_features)

# extract image and labels
image = parsed_features['X']
labels = tf.cast( parsed_features['Y'], tf.int32 )
labels = tf.one_hot( labels, depth=num_classes ) # one hot encoding

return image, labels

# reshape the data into parse format
dataset = dataset.map(_parse_function)

# define dataset parameters
window_size = 50
batch_size = 500
window_shift = int( window_size / 2 ) # 25

# implement sliding window
dataset = dataset.window(size=window_size, shift=window_shift, drop_remainder=True ).flat_map( lambda x: x.batch(window_size) )

# batch the data
dataset = dataset.batch(batch_size)

# create an iterator
# iterator = dataset.make_one_shot_iterator().get_next()

上面的迭代器将为X数据返回一个形状张量(batch_size, window_size, image_height, image_width, number of channels),在我们的例子中( 500, 50, 40, 40, 1)Y 作为 (500, 3) 数组。

最佳答案

我设法通过过滤掉跨越边界的窗口来做到这一点。获得解析后的功能后,对所有内容应用窗口,然后计算哪些窗口溢出并将其过滤掉:

ds = tf.data.TFRecordDataset( filename )
ds = ds.map( _parse_function )

# apply windowing
ds = ds.window( size=50, shift=25, drop_remainder=True ).flat_map( lambda x, y: tf.data.Dataset.zip( (x.batch(50), y.batch(50)) ) )
# enumerate dataset and filter every 40th window
ds = ds.apply( tf.data.experimental.enumerate_dataset(start=1) ).filter( lambda i, x: tf.not_equal( i % 40, 0) )
# get rid of enumerations
ds = ds.map( lambda i, x: x )

# batching, shuffling etc...
...

澄清:过滤掉每 40 个窗口,因为如果您有 1000 组和 25 个窗口偏移,将有 set_len/win_shift = 40 个窗口,最后一个(即第 40 个)将是溢出到下一组。另请注意,枚举从 1 开始,因此不会取出第 0 个样本,因为 0 % x == 0

请注意,这与其说是一个真正的解决方案,不如说是一种黑客攻击。它适用于 50% 的重叠,但在其他百分比下,计算要丢弃的索引会变得更加复杂(如果重叠 >50%,则不止一个窗口会溢出到下一组,因此需要多个过滤器)。

关于python - 如何在 tensorflow 中实现图像(二维数组)序列滑动窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54745903/

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