Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将tensorflow数据集记录分块到多个记录中_Tensorflow_Conv Neural Network_Tensorflow Datasets_Tfrecord - Fatal编程技术网

将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,您可以共享一个数据集来执行此操作吗?一些虚拟数据集就可以了。太好了。这个解决方案太棒了!