【问题标题】:Epoch taking too long to complete时代需要太长时间才能完成
【发布时间】: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


【解决方案1】:

在我运行的旧桌面上,在重新编译 Tensorflow API 库之前,我遇到了同样的问题,发现日志指示缺少的库并找到了它们。

对于我非常旧的桌面,我添加了它们并编译了它们。

  1. C:Program FilesNVIDIA GPU Computing ToolkitCUDA11.4in
  2. C:Program FilesNVIDIA GPU Computing 工具包CUDA11.4extrasCUPTIlib64

【讨论】:

  • 不幸的是,这个答案没有意义。
  • 您询问过长时间运行的 epochs 没有返回支持库的错误,要求再次重新编译它然后我建议您将目标库添加到路径中。
猜你喜欢
  • 1970-01-01
  • 2018-02-07
  • 2016-07-30
  • 2013-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-19
  • 1970-01-01
相关资源
最近更新 更多