我是医学影像专业的学生。我需要构造一个用于图像分割的神经网络。我有一个由285个被试组成的数据集,每一个都有4种模式(T1,T2,T1ce,FLAIR) +他们各自的分割地面真相。一切都是3D的,分辨率为240x240x155体素(这是BraTS数据集)。
正如我们所知道的,由于内存原因,我不能将整个图像输入到GPU上。我必须对图像进行预处理,并将它们分解为3D重叠补丁(40x40x40的子卷),这是我使用scikit-image view_as_windows所做的,然后在TFRecords文件中序列化窗口。由于每个斑块在每个方向上重叠10个体素,因此每卷5 292个斑块。问题是,只有一个模式,我得到的大小为每个TFRecords文件800 GB。另外,我还必须计算它们各自的分段权重图,并将其存储为补丁。分割也作为补丁存储在同一个文件中。
最后,我必须包括所有其他的方式,这将不少于兆字节的存储。我还必须记住,我还必须对背景和前景之间相同数量的补丁进行示例(类平衡)。
因此,我想我必须做所有的预处理步骤在飞行中,就在每一个训练步骤之前(同时希望不要放慢训练速度)。我不能使用tf.data.Dataset.from_tensors(),因为我不能在内存中加载所有的东西。我不能使用tf.data.Dataset.from_tfrecords(),因为预处理之前需要占用大量的存储空间,最终我会用完的。
的问题是:,在训练图像推理之后,有可能重新加载模型,我还能做些什么呢?
非常感谢,并请随时询问任何其他细节。
皮埃尔-吕克
发布于 2019-01-29 22:14:46
最后,我找到了解决问题的方法。
我首先裁剪一个主题的图像,而不应用实际的裁剪。我只测量我需要的切片,我只需要将体积裁剪到大脑。然后,我将所有数据集图像序列化为一个TFRecord文件,每个训练示例都是图像模式、原始图像形状和切片(保存为Int64功能)。
我随后解码了TFRecords。每个训练样本都被重新塑造成它在一个特征中包含的形状。我使用tf.stack()方法将所有图像模式叠加到堆栈中。我使用先前提取的切片对堆栈进行裁剪(然后对堆栈中的所有图像进行裁剪)。我最终得到一些随机补丁使用tf.random_crop()方法,允许我随机裁剪一个四维阵列(高,宽度,深度,通道)。
我唯一还没搞清楚的就是数据增强。因为所有这些都是以张量格式出现的,所以我不能使用普通的Python和NumPy来旋转、剪切、翻转一个四维数组。我需要在tf.Session()中这样做,但我希望避免这种情况,并直接输入培训句柄。
对于评估,我只在TFRecords文件中序列化每个文件中的一个测试主题。实验对象也包含所有模式,但是由于没有TensorFLow方法来提取4-D中的补丁,所以图像是用Scikit-Learn extract_patches()方法在小块中进行预处理的。我将这些补丁序列化到TFRecords。
这样,TFRecords的训练就小得多了。我可以用批预测来评估测试数据。
感谢您的阅读,欢迎您发表评论!
https://stackoverflow.com/questions/53662978
复制相似问题