将tensorflow数据集记录分块到多个记录中
我有一个未匹配的将tensorflow数据集记录分块到多个记录中,tensorflow,conv-neural-network,tensorflow-datasets,tfrecord,Tensorflow,Conv Neural Network,Tensorflow Datasets,Tfrecord,我有一个未匹配的tensorflow数据集,看起来如下: ds=。。。 对于ds中的记录,采取(3): 打印('data shape={}'。格式(记录['data'].shape)) ->数据形状=(512、512、87) ->数据形状=(512、512、277) ->数据形状=(512、512、133) 我想将数据以深度5的块形式提供给我的网络。在上面的示例中,形状张量(512、512、87)将被划分为17个形状张量(512、512、5)。矩阵的最后两行(张量[:,:,85:87])应该被
tensorflow
数据集,看起来如下:
ds=。。。
对于ds中的记录,采取(3):
打印('data shape={}'。格式(记录['data'].shape))
->数据形状=(512、512、87)
->数据形状=(512、512、277)
->数据形状=(512、512、133)
我想将数据以深度5的块形式提供给我的网络。在上面的示例中,形状张量(512、512、87)将被划分为17个形状张量(512、512、5)。矩阵的最后两行(张量[:,:,85:87]
)应该被丢弃
例如:
chunked\u ds=。。。
对于分块存储的记录,请选择(1):
打印('chunked data shape={}.format(记录['data'].shape))
->分块数据形状=(512,512,5)
如何从
ds
到chunked\u ds
?看起来像我需要的,但我无法使其工作。为了表达我的解决方案,我将首先创建一个虚拟数据集,其中每个形状有10个样本[512,512,87]
data = tf.random.normal( shape=[ 10 , 512 , 512 , 87 ] )
ds = tf.data.Dataset.from_tensor_slices( ( data ) )
在执行以下代码时
for record in ds.take( 3 ):
print( record.shape )
for sample in chunked_ds.take( 1 ):
print( sample.shape )
我们得到了输出
(512, 512, 87)
(512, 512, 87)
(512, 512, 87)
为了方便起见,我创建了一个数据集,其中最后一个维度的长度是一个常量,即87(这与您的方法相矛盾)。但提供的解决方案与最后一个维度的长度无关。
解决方案,
# chunk/window size
chunk_depth = 5
# array to store the chunks
chunks = []
# Iterating through each sample in ds ( Note: ds.as_numpy_iterator() returns NumPy arrays )
for sample in ds.as_numpy_iterator():
# Length of the last dimension
feature_size = sample.shape[ 2 ]
# No. of chunks that can be produced
num_chunks = feature_size // chunk_depth
# Perform slicing along the last dimension, storing the "chunks" in the chunks array.
for i in range( 0 , num_chunks , chunk_depth ):
chunk = sample[ : , : , i : i + chunk_depth ]
chunks.append( chunk )
# Convert array -> tf.data.Dataset
chunked_ds = tf.data.Dataset.from_tensor_slices( ( chunks ) )
下面代码的输出
for record in ds.take( 3 ):
print( record.shape )
for sample in chunked_ds.take( 1 ):
print( sample.shape )
正如问题中所预料的那样
(512, 512, 5)
该解决方案可作为。这实际上可以使用
tf.data.Dataset
操作来完成:
data=tf.random.normal(形状=[10,512,512,87])
ds=tf.data.Dataset.from_tensor_切片((数据))
块大小=5
chunked_ds=ds.flat_映射(lambda x:tf.data.Dataset.from_tensor_切片(tf.transpose(x,perm=[2,0,1]))。批处理(chunk_大小,drop_余数=True))\
.map(lambda rec:tf.transpose(rec,perm=[1,2,0]))
那里发生了什么:
首先,我们将每个记录视为一个单独的数据集,并对其进行排列,以便最后一个维度成为批处理维度(flat\u map
将再次将内部数据集展平为张量)
.flat\u map(lambda x:tf.data.Dataset.from\u tensor\u切片(tf.transpose(x,perm=[2,0,1]))
然后我们按5分批处理,但不关心剩余部分
.batch(块大小,拖放余数=True))
最后,重新排列张量,使我们在边界处有512x512:
.map(lambda rec:tf.transpose(rec,perm=[1,2,0]))
Hi,您可以共享一个数据集来执行此操作吗?一些虚拟数据集就可以了。太好了。这个解决方案太棒了!