【发布时间】:2022-12-23 23:26:58
【问题描述】:
我正在尝试将 U-net 应用于 CT 扫描的图像分割。我的数据集包含大约 8,000 张用于训练的图像和 506 张用于验证的图像。我已经一步步关注this tutorial,但我的训练时间对于单个 epoch 来说太长了,准确地说是 29 小时。我做错了什么?
import os
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "2"
import numpy as np
import cv2
from glob import glob
from sklearn.utils import shuffle
import tensorflow as tf
from tensorflow.python.keras.callbacks import ModelCheckpoint, CSVLogger, ReduceLROnPlateau, EarlyStopping, TensorBoard
from tensorflow.python.keras.optimizers import Adam
from tensorflow.python.keras.metrics import Recall, Precision
from model import build_unet
from metrics import dice_loss, dice_coef, iou
H = 512
W = 512
def create_dir(path):
""" Create a directory. """
if not os.path.exists(path):
os.makedirs(path)
def shuffling(x, y):
x, y = shuffle(x, y, random_state=42)
return x, y
def load_data(path):
x = sorted(glob(os.path.join(path, "image", "*.jpg")))
y = sorted(glob(os.path.join(path, "mask", "*.jpg")))
return x, y
def read_image(path):
path = path.decode()
x = cv2.imread(path, cv2.IMREAD_COLOR)
x = x/255.0
x = x.astype(np.float32)
return x
def read_mask(path):
path = path.decode()
x = cv2.imread(path, cv2.IMREAD_GRAYSCALE)
x = x/255.0
x = x > 0.5
x = x.astype(np.float32)
x = np.expand_dims(x, axis=-1)
return x
def tf_parse(x, y):
def _parse(x, y):
x = read_image(x)
y = read_mask(y)
return x, y
x, y = tf.numpy_function(_parse, [x, y], [tf.float32, tf.float32])
x.set_shape([H, W, 3])
y.set_shape([H, W, 1])
return x, y
def tf_dataset(x, y, batch=8):
dataset = tf.data.Dataset.from_tensor_slices((x, y))
dataset = dataset.map(tf_parse)
dataset = dataset.batch(batch)
dataset = dataset.prefetch(10)
return dataset
if __name__ == "__main__":
""" Seeding """
np.random.seed(42)
tf.random.set_seed(42)
""" Directory for storing files """
create_dir("files")
""" Hyperparameters """
batch_size = 16
lr = 1e-3
num_epochs = 5
model_path = os.path.join("files", "model.h5")
csv_path = os.path.join("files", "data.csv")
""" Dataset """
dataset_path = os.path.join("new_data")
train_path = os.path.join(dataset_path, "train")
valid_path = os.path.join(dataset_path, "valid")
train_x, train_y = load_data(train_path)
train_x, train_y = shuffling(train_x, train_y)
valid_x, valid_y = load_data(valid_path)
print(f"Train: {len(train_x)} - {len(train_y)}")
print(f"Valid: {len(valid_x)} - {len(valid_y)}")
train_dataset = tf_dataset(train_x, train_y, batch=batch_size)
valid_dataset = tf_dataset(valid_x, valid_y, batch=batch_size)
""" Model """
model = build_unet((H, W, 3))
metrics = [dice_coef, iou, Recall(), Precision()]
model.compile(loss=dice_loss, optimizer=Adam(lr), metrics=metrics)
callbacks = [
ModelCheckpoint(model_path, verbose=1, save_best_only=True),
ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=10, min_lr=1e-7, verbose=1),
CSVLogger(csv_path),
TensorBoard(),
EarlyStopping(monitor='val_loss', patience=50, restore_best_weights=False),
]
model.fit(
train_dataset,
epochs=num_epochs,
validation_data=valid_dataset,
callbacks=callbacks,
shuffle=False
)
【问题讨论】:
-
我不知道这是否有用,但我有以下警告:tensorflow/core/common_runtime/gpu/gpu_device.cc:1934] 无法打开某些 GPU 库。如果您想使用 GPU,请确保正确安装了上述缺少的库。 tensorflow/core/platform/cpu_feature_guard.cc:193] 此 TensorFlow 二进制文件使用 oneAPI 深度神经网络库 (oneDNN) 进行了优化,以在性能关键型操作中使用以下 CPU 指令:AVX AVX2 要在其他操作中启用它们,请重建 TensorFlow适当的编译器标志。
-
本教程中的代码运行大约 45 分钟 ETA,所以我想知道它可能是什么问题。
-
你有GPU吗?如果有,是哪一个?
-
您需要安装正确的 CUDA 和 cuDNN 库,有关缺少库的消息会告诉您缺少哪些库。
-
110 可能意味着 CUDA 版本 11.0,安装这个确切的版本并确保库在 PATH 环境变量中。
标签: tensorflow machine-learning keras deep-learning