Python TensorFlow:从3D CNN的numpy阵列获取输入批次

Python TensorFlow:从3D CNN的numpy阵列获取输入批次,python,numpy,tensorflow,keras,Python,Numpy,Tensorflow,Keras,我有3D图像(tiff)数据和文件夹中的每个卷。我想读取数据并制作卷积网络的批量张量。我可以读取numpy数组的数据,但我不知道如何为CNN批量输入张量。这是我的密码 import os import tensorflow as tf import numpy as np from skimage import io from matplotlib import pyplot as plt from pathlib import Path data_dir = 'C:/Users/myname/

我有3D图像(tiff)数据和文件夹中的每个卷。我想读取数据并制作卷积网络的批量张量。我可以读取numpy数组的数据,但我不知道如何为CNN批量输入张量。这是我的密码

import os
import tensorflow as tf
import numpy as np
from skimage import io
from matplotlib import pyplot as plt
from pathlib import Path
data_dir = 'C:/Users/myname/Documents/Projects/Segmentation/DeepLearning/L-net/data/'
data_folders = os.listdir(data_dir)
train_input = []
train_output = []
test_input = []
test_output = []

for idx, folder in enumerate(data_folders):
        im = io.imread(data_dir+folder+'/f0.tiff')
        im = im/im.max()
        train_input.append(tf.convert_to_tensor(im, dtype=tf.float32))
        im = io.imread(data_dir+folder+'/g0.tiff')
        im = im/im.max()
        train_output.append(tf.convert_to_tensor(im, dtype=tf.float32))

因为我在CNN上使用3D过滤器,所以输入应该是5D tesnor。有人能帮我吗?谢谢。

使用您的方法,您必须将所有数据一次加载到内存中,并且还必须处理所有维度。我建议使用Keras
flow\u目录
生成器
。Keras有一个
ImageDataGenerator
类,该类允许用户从目录中执行图像采集,将所有图像更改为您想要的任何大小,将它们洗牌。您可以在他们的网站上找到文档

下载列车数据集和测试数据集,将其解压缩到名为“列车”和“测试”的两个不同文件夹中。列车文件夹应包含“n”个文件夹,每个文件夹包含各自类别的图像。例如,在Dog vs Cats数据集中,train文件夹应该有两个文件夹,即“Dog”和“Cats”,其中包含各自的图像

这是一个关于如何为模型输入创建数据集的示例:

train_generator = train_datagen.flow_from_directory(
    directory=r"C:/Users/myname/Documents/Projects/Segmentation/DeepLearning/L-net/data/",
    target_size=(224, 224), # the size of your input images
    color_mode="rgb", # could be grayscale or rgb
    batch_size=32, # Number of images in each batsh
    class_mode="categorical",
    shuffle=True, # Whether to shuffle the images or not
    seed=42 # Random seed for applying random image augmentation
)
您可以执行如下训练:

STEP_SIZE_TRAIN=train_generator.n//train_generator.batch_size
STEP_SIZE_VALID=valid_generator.n//valid_generator.batch_size
model.fit_generator(generator=train_generator,
                    steps_per_epoch=STEP_SIZE_TRAIN,
                    validation_data=valid_generator,
                    validation_steps=STEP_SIZE_VALID,
                    epochs=10
)

使用这种方法,您必须一次将所有数据加载到内存中,还必须处理所有维度。我建议使用Keras
flow\u目录
生成器
。Keras有一个
ImageDataGenerator
类,该类允许用户从目录中执行图像采集,将所有图像更改为您想要的任何大小,将它们洗牌。您可以在他们的网站上找到文档

下载列车数据集和测试数据集,将其解压缩到名为“列车”和“测试”的两个不同文件夹中。列车文件夹应包含“n”个文件夹,每个文件夹包含各自类别的图像。例如,在Dog vs Cats数据集中,train文件夹应该有两个文件夹,即“Dog”和“Cats”,其中包含各自的图像

这是一个关于如何为模型输入创建数据集的示例:

train_generator = train_datagen.flow_from_directory(
    directory=r"C:/Users/myname/Documents/Projects/Segmentation/DeepLearning/L-net/data/",
    target_size=(224, 224), # the size of your input images
    color_mode="rgb", # could be grayscale or rgb
    batch_size=32, # Number of images in each batsh
    class_mode="categorical",
    shuffle=True, # Whether to shuffle the images or not
    seed=42 # Random seed for applying random image augmentation
)
您可以执行如下训练:

STEP_SIZE_TRAIN=train_generator.n//train_generator.batch_size
STEP_SIZE_VALID=valid_generator.n//valid_generator.batch_size
model.fit_generator(generator=train_generator,
                    steps_per_epoch=STEP_SIZE_TRAIN,
                    validation_data=valid_generator,
                    validation_steps=STEP_SIZE_VALID,
                    epochs=10
)

您可能只需要4D作为输入。在第一个卷积层之后,它将变为5D。对于3到4 D转换,堆栈图像或使用TF.ExpExtIdim每批使用一个图像。如果你用<代码> IVIIO 读取3D卷,考虑使用<代码> Value而不是<代码> imRead <代码>,你可能只需要4D作为输入。在第一个卷积层之后,它将变为5D。对于3到4 D转换,堆栈图像或使用TF.ExpExtIdim每批使用一个图像。如果您使用“代码> IMAIOO < /代码>读取3D卷,请考虑使用<代码> Value,而不是<代码> imRead < /Cord>