我正在使用来自Kaggle challange 的MNIST 数据集,并且在数据预处理方面遇到了麻烦。此外,我不知道什么是最佳实践,想知道您是否可以就此提出建议。
免责声明:我不能只使用 torchvision.datasets.mnist 因为我需要使用 Kaggle 的数据进行训练和提交。
在本教程中,建议创建一个从文件加载 .pt 张量的 Dataset 对象,以充分利用 GPU。为了实现这一点,我需要加载 Kaggle 提供的 csv 数据并将其保存为 .pt 文件:
import pandas as pd
import torch
import numpy as np
# import data
digits_train = pd.read_csv('data/train.csv')
train_tensor = torch.tensor(digits_train.drop(label, axis=1).to_numpy(), dtype=torch.int)
labels_tensor = torch.tensor(digits_train[label].to_numpy())
for i in range(train_tensor.shape[0]):
torch.save(train_tensor[i], "data/train-" + str(i) + ".pt")
Run Code Online (Sandbox Code Playgroud)
每个train_tensor[i].shape是torch.Size([1, 784])
但是,每个此类 .pt 文件的大小约为 130MB。相同大小的张量,随机生成整数,大小为 6.6kB。为什么这些张量如此巨大,我该如何减小它们的大小?
数据集是 42 000 个样本。我什至应该打扰批处理这些数据吗?我是否应该费心将张量保存到单独的文件中,而不是将它们全部加载到 RAM 中然后分批?这里最好的方法是什么?
我在 Airflow 的 TaskFlowAPI 中找不到分支的文档。我尝试以“Pythonic”方式进行操作,但是当运行时,DAG 没有看到task_2_execute_if_true,无论前一个任务返回的真值如何。
@dag(
schedule_interval=None,
start_date=pendulum.datetime(2021, 1, 1, tz="UTC"),
catchup=False,
tags=['test'],
)
def my_dag():
@task()
def task_1_returns_boolean():
# evaluate and return boolean value
return boolean_value
@task()
def task_2_execute_if_true():
# do_something...
outcome_1 = task_1_returns_boolean()
if outcome_1:
outcome_2 = task_2_execute_if_true()
executed = my_dag()
Run Code Online (Sandbox Code Playgroud)
TaskFlowAPI 中正确的分支方式是什么?我应该再添加一个专门用于分支的函数吗?