浅谈对transforms.ToTensor()和transforms.Normalize()函数的理解

前言

在进行tensor图片数据进行视觉时,一般会进行预处理操作,这个时候就需要用到ToTensor()和Normalize()这两个函数.

提示:以下是本篇文章正文内容,下面案例可供参考

一.ToTensor函数

1.ToTensor函数的作用

1.将shape为(H,W,C)的数据维度转变为(C,H,W),其中C表示通道数,H表示高度,W表示宽度。
2. 将输入数据归一化到(0,1)的范围内,其归一化方法为除以255进行缩放

2.代码实现

import torch
import torchvision
from   torchvision.transforms import transforms
import numpy as np

'''tranforms.Compose将多个函数进行组合'''
tranforms_1 = transforms.Compose([transforms.ToTensor()])

tensor1 = np.array([[[1,2,3],[4,5,6],[7,8,9],[5,6,7]],
           [[1,2,3],[4,5,6],[7,8,9],[5,6,7]],
           [[1,2,3],[4,5,6],[7,8,9],[5,6,7]],
           [[1,2,3],[4,5,6],[7,8,9],[5,6,7]]],dtype = np.float32)
print(f'未转换数据前数据的维度为{tensor1.shape}')
trans_tensor1 = tranforms_1(tensor1)
print(f'转换后数据的维度为{trans_tensor1.shape}')

3.数据没有归一化问题

可以看到,在经过ToTensor()函数的处理之后,维度确实发生了变化,达到预期的效果,接下来再输出转换前的数据和转换后的数据。

print(tensor1[0])

print(trans_tensor1[0])

可以发现,转换后的trans_tensor1虽然维度确实发现了变化,可是数据应该缩放到[0,1]的范围,但是数据本身却没有发生变化,进入到ToTensor()的实现函数查看原因

浅谈对transforms.ToTensor()和transforms.Normalize()函数的理解

可以看到,传入的数据需要是字节类型的数据,否则会返回传入的数据本身。那么传入的数据类型究竟应该是什么呢?接下来使用cv函数读取图片并转换数据查看结果

import cv2
images = cv2.imread('../data/cat1.jpg')

images_result = tranforms_1(images)

print(images.shape,images_result.shape)
print(images_result[0])

print(images.dtype)

在传入图片调用ToTensor()函数后,发现数据的维度发生了变化,数据也归一化,输出image的数据类型发现,为unit8,接着我们将前面的numpy数组的数据类型转变为unit8后发现,输出结果正常,因此传入的数据需要为unit8

tensor1 = np.array([[[1,2,3],[4,5,6],[7,8,9],[5,6,7]],
           [[1,2,3],[4,5,6],[7,8,9],[5,6,7]],
           [[1,2,3],[4,5,6],[7,8,9],[5,6,7]],
           [[1,2,3],[4,5,6],[7,8,9],[5,6,7]]],dtype = np.uint8)

print(tensor1[0])

print(trans_tensor1[0])

二.Normalize()函数

1.Normalize函数的作用

Normalize()函数的作用是将数据转换为标准高斯分布,每个通道都进行标准化,即每个通道的均值都变为0,标准差都变为1,这样可以加快模型的收敛。

2.代码实现

`'''均值mean=[0.485, 0.456, 0.406],
 标准差std=[0.229, 0.224, 0.225]
 这一组数据是由Imagenet训练集中抽样训练出来的'''
tranforms_2 = transforms.Compose([transforms.ToTensor(),transforms.Normalize
(mean = [0.485, 0.456, 0.406],
std = [0.229, 0.224, 0.225])])

tensor1 = np.array([[[1,2,3],[4,5,6],[7,8,9],[5,6,7]],
           [[1,2,3],[4,5,6],[7,8,9],[5,6,7]],
           [[1,2,3],[4,5,6],[7,8,9],[5,6,7]],
           [[1,2,3],[4,5,6],[7,8,9],[5,6,7]]],dtype = np.uint8)

trans_tensor2 = tranforms_2(tensor1)
trans_tensor2

Original: https://blog.csdn.net/m0_59249046/article/details/126800077
Author: m0_59249046
Title: 浅谈对transforms.ToTensor()和transforms.Normalize()函数的理解

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/762732/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球