Python 用于补丁分类的Tensorflow数据集管道

Python 用于补丁分类的Tensorflow数据集管道,python,tensorflow,tensorflow-datasets,tensorflow2.0,Python,Tensorflow,Tensorflow Datasets,Tensorflow2.0,我正试图在tensorflow中编写一个数据集管道,用于标记图像的补丁。现在我正在阅读一组tfrecord文件,其中每个文件都有多个补丁,但只有一个标记。标记有四个类 Tensorflow似乎不喜欢我通过管道传递一个单子。我得到以下错误: ValueError: Value Tensor("args_1:0", shape=(), dtype=int32) has insufficient rank for batching. 我正试图找出如何让这个用例工作。这就是我想做的。我可以使用关于我应

我正试图在
tensorflow
中编写一个数据集管道,用于标记图像的补丁。现在我正在阅读一组tfrecord文件,其中每个文件都有多个补丁,但只有一个标记。标记有四个类

Tensorflow似乎不喜欢我通过管道传递一个单子。我得到以下错误:

ValueError: Value Tensor("args_1:0", shape=(), dtype=int32) has insufficient rank for batching.
我正试图找出如何让这个用例工作。这就是我想做的。我可以使用关于我应该如何处理
y
的建议,以便在管道末端的每个补丁上都有一个标签。如果我需要更改tfrecord文件的结构,使
y
是一个onehot编码的向量,那就可以了;我只是不知道这是否必要

def parse_func(proto):
features=tf.io.parse_single_示例(
序列化=proto,
features={'X':tf.io.FixedLenFeature([],tf.string),
“长度”:tf.io.FixedLenFeature([],tf.int64),
“y”:tf.io.FixedLenFeature([],tf.int64)})
y=tf.cast(特征['y'],tf.int32)#这只是一个整数,但可能应该是一个热编码向量
X=tf.io.decode_raw(特征['X'],tf.float32)
length=tf.cast(特性['length'],tf.int32)
shape=tf.stack([length,60,1])
返回tf。重塑(X,形状),y
def get_补丁(X,y):
X=X[tf.newaxis,…]
patches=tf.image.extract_patches(X,
大小=[1128,60,1],
步幅=[1,4,1,1],
利率=[1,1,1,1],
padding='VALID')
面片=tf.重塑(面片,[-1128,60,1])
y=重复,以便每个补丁有一个标签(y)
返回补丁,y
dataset=(tf.data.dataset.from_tensor_切片('tf_记录_文件_路径'))
.洗牌(100)
.interleave(lambda x:tf.data.TFRecordDataset(x),周期长度=4)
.map(解析函数)
.map(获取补丁)
.unbatch()
.洗牌(100)
.重复
.batch(64,drop_rements=True)
.预取(1))

我的解决方法如下:

def repeat_以便每个补丁都有一个标签(y,补丁):
num_patches=tf.shape(patches)[0]
平铺y=tf.tile(y,倍数=[num\u面片])
返回tf.整形(平铺y,tf.整形(y)*补片数)

您解决过这个问题吗?是的。刚刚在jtlz2上发布了答案