首页 > 解决方案 > 在 Tensorflow 2.0 中从路径部分创建标签,而路径不是标签名称

问题描述

我目前正在 Tensorflow 中处理医疗数据。我遇到的问题是关于将标签附加到数据。我的目录结构如下:有一个大文件夹,其中包含每个患者的 3 个子文件夹(有 24 个患者,所以 72 个文件夹)是数据。

现在的问题是将患者分为两组,第 1 组和第 0 组(对治疗有反应,或无反应)。我的目标是训练模型以确定患者应该属于哪个组。我正在关注本教程,了解如何从所有这些文件创建数据集。但在示例中,标签是路径的一部分。这是不可能的(大学不想改变目录的结构)

这是我的示例代码“函数”是我的所有函数的 python 脚本,设置是一个应该创建全局变量的 python 脚本:

设置.json:

是我所有设置的 json 文件。是的,我有两个名为设置的文件,我将在某个时候重命名它们。“标签”是每个子文件夹的标签列表。(前三个是患者 1,第二个是患者 2 的三个,依此类推)

“标签”:[1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0 .....(这里太长了) “datasetpath”只是我的数据的路径。设置.py:

import functions

def init():
    global settings
    settings = functions.initjson()
    global a

    a = 1

functions.py: 导入设置导入 tensorflow as tf

def process_path(file_path):
    parts = tf.strings.split(file_path, '/')
    #label = settings.settings["labels"][settings.a]
    label = settings.a #To test if it ticks up at all
    settings.a = settings.a +1
    return tf.io.read_file(file_path), label

如你看到的

实际脚本:

datasetpath = settings.settings["datasetpath"]
file_paths = functions.getfilepaths(datasetpath,verbose=True)
setpath = pathlib.Path(datasetpath)
list_ds = tf.data.Dataset.list_files(str(setpath/'*/*'))
labeled_ds = list_ds.map(functions.process_path)
for f in list_ds.take(5):
  print(f.numpy())
for image_raw, label_text in labeled_ds.take(3):
  print(repr(image_raw.numpy()[:100]))
  print()
  print(label_text.numpy())

所以我不能只把路径的一部分作为他们如何做的标签。我无法将路径中的患者姓名与普通列表进行比较(请参阅此处)我尝试使用一个全局变量来标记并访问列表,但它没有标记。而且我的想法很新鲜。有没有人知道如何解决这个问题?

标签: pythontensorflow

解决方案


所以我现在自己解决了。这并不理想,但我所做的是遍历所有路径并将它们与“标签”列表进行比较。这是我使用的功能。

def PD_PET_list():
    datasetpath = settings["Path to PET"]
    labels = settings["labels"]
    #if settings.verbose: print("Path to Dataset for label Creation:",datasetpath)

    setpath = pathlib.Path(datasetpath)  
    #if settings.debug: print(setpath)
    pat = sorted(glob.glob(str(setpath / '*')))
    global pd
    pd = []
    for i in range(len(labels)):
        # print(pat[i])
        # print(labels[i])
        if labels[i] == 1:
            #print(pat[i])
            #print(labels[i])
            parts = tf.strings.split(pat[i], '/')
            pd.append(parts[-1])

之后我只是检查了文件夹的名称是否在该列表中(循环遍历列表“如果 x in y”并没有令人遗憾地工作。


推荐阅读