当前位置:   article > 正文

深度学习技术栈 —— Pytorch之TensorDataset、DataLoader

深度学习技术栈


前言

简单来说,TensorDatasetDataLoader这两个类的作用, 就是将数据读入并做整合,以便交给模型处理。就像石油加工厂一样,你不关心石油是如何采集与加工的,你关心的是自己去哪加油,油价是多少,对于一个模型而言,DataLoader就是这样的一个予取予求的数据服务商。

参考文章或视频链接
[1] How to use TensorDataset, Dataloader (pytorch)

一、TensorDataset、DataLoader的用法?

# coding:utf-8
# @Time: 2024/1/23 上午9:57
# @Author: 键盘国治理专家
# @File: __init__.py.py
# @Description: 

import numpy as np
import torch
from torch.utils.data import TensorDataset
from torch.utils.data import DataLoader


def test_TensorDataset():
    input = np.random.rand(4, 2)  # Input data
    correct = np.random.rand(4, 1)  # Correct answer data

    input = torch.FloatTensor(input)  # Change to an array that can be handled by pytorch
    correct = torch.FloatTensor(correct)  # Same as above

    print(input)
    print(correct)

    dataset = TensorDataset(input, correct)  # set the data,注意,是TensorDataset而不是Dataset,Dataset是个abstract class不能实例化

    print(dataset)  # 打印地址
    print(vars(dataset))  # vars prints the contents of the object
    return dataset


def test_DataLoader(dataset):
    train_load = DataLoader(dataset, batch_size=3, shuffle=False)  # Data shuffle with shuffle=True
    for x, t in train_load:
        print('x-->', x)
        print('t-->', t)


if __name__ == '__main__':
    dataset = test_TensorDataset()
    print("========================================================================================")
    test_DataLoader(dataset)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

二、从.csv文件–>tensor张量

一般说来,大部分Kaggle比赛的数据都是以.csv为格式的,而Pytorch处理的是tensor张量,所以我们要了解如何将.csv文件的数据变成tensor张量数据。

"""
步骤如下
(1) xx.csv --> 经由pandas 变成 numpy 数组
(2) numpy 变成 tensor 张量
(3) tensor张量经过TensorDataset的组合
(4) dataset再经过DataLoader的处理,进而保证数据可用,以上为清洗过程
.csv --> numpy --> tensor --> dataset --> dataloader 四个过程,五个数据中转形式。
"""
# coding:utf-8
# @Time: 2024/1/23 下午1:01
# @Author: 键盘国治理专家
# @File: csv2tensor.py
# @Description:

import numpy
import pandas as pd
import numpy as np
import torch
import torch.nn as nn
from torch.utils.data import TensorDataset
from torch.utils.data import DataLoader

def csv2numpy(csv_path):
    data = pd.read_csv(csv_path, dtype=np.float64)
    # numpy_data = data.iloc[:, data.columns != "xx"]  # 另一种用法,data.columns != "xx" 可以过滤掉你不想读入的字段
    numpy_data = data.iloc[:].values
    return numpy_data


def numpy2tensor(numpy_data):
    tensor_data = torch.from_numpy(numpy_data)
    return tensor_data


def tensor2DataLoader(tensor_data):  # 一步到位,直接变成DataLoader。最简单的实现方式,这个func还有改进空间,DataSet可以接收多个tensor数据
    dataset = torch.utils.data.TensorDataset(tensor_data)
    data_loader = torch.utils.data.DataLoader(dataset, shuffle=False)
    return data_loader


# 你甚至可以直接将.csv处理成DataLoader了,把这几个过程简单组合下形成一个新函数
def csv2DataLoader(csv_path):
    numpy_data = csv2numpy(csv_path)
    tensor_data = numpy2tensor(numpy_data)
    data_loader = tensor2DataLoader(tensor_data)
    return data_loader


if __name__ == '__main__':

    numpy_data = csv2numpy("./test.csv")
    # print(type(numpy_data))
    # print(numpy_data.shape)
    # print(numpy_data)

    tensor_data = numpy2tensor(numpy_data)
    # print(type(tensor_data))
    # print(tensor_data.shape)
    # print(tensor_data)

    data_loader = tensor2DataLoader(tensor_data)
    # print(type(data_loader))
    # print(data_loader)
    # print(data_loader.dataset)
    # # 用遍历的方式才能输出data_loader里的数据
    # for data_item in data_loader:
    #     print('data_item-->', data_item)
    # # 把数据的索引也一起输出
    # for i, data_item in enumerate(data_loader):
    #     print('i', i)
    #     print('data_item-->', data_item)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71

总结

本篇工作虽然简单,但确是进阶的一个不大不小的绊脚石,功夫虽小,也不能不练。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/557435
推荐阅读
相关标签
  

闽ICP备14008679号