pytorch-将图片转成可训练的张量

import os

创建一个多图像的数据集作为神经网络的输入,以3为例,以获得一个N*C*H*W,预先分配一个适当大小的张量,并使用从目录中加载的图像填充它。

batch_size=3
batch=torch.zeros(batch_size,3,256,256,dtype=torch.uint8)
data_dir='E:/PyTorch_Book_Code/dlwpt-code-master/data/p1ch4/image-cats/'
filenames=[name for name in os.listdir(data_dir)
          if os.path.splitext(name)[-1]=='.png']
for i,filename in enumerate(filenames):
    img_arr=imageio.imread(os.path.join(data_dir,filename))
    img_t=torch.from_numpy(img_arr)
    img_t=img_t.permute(2,0,1)
    img_t=img_t[:3]
    batch[i]=img_t
    print(batch[i])

神经网络通常使用浮点数张量作为输入,当输入数据的范围为0~1或-1~1时,神经网络表现出最佳的训练性能。
因此需将张量转换为浮点数并进行归一化。

batch=batch.float()
batch/=255.0

正规化的另一种方法是计算输入数据的均值和标准差,并对其进行缩放,使每个通道的均值为0,标准差为1.

n_channels = batch.shape[1]
for c in range(n_channels):
    mean = torch.mean(batch[:, c]) #求第C维度的平均数
    std = torch.std(batch[:, c])#求第C维度的标准差
    batch[:, c] = (batch[:, c] - mean) / std#标准化

filenames=[name for name in os.listdir(data_dir)
          if os.path.splitext(name )]
python在方括号[]中使用for循环的两种方式,列表解析List Comprehensions,类似[0 for i in range(10)]
两种语法:

[expression for iter_val in iterable]
[expression for iter_val in iterable if cond_expr]
举例说明:https://blog.csdn.net/qq_36414085/article/details/103685651

os.path.splitext("文件路径名")
用法:分离文件名和扩展名
if os.path.splitext(name)[-1]=='.png'  :如果name的最后一位是'.png'

os.listdir(data_dir):返回指定的文件夹或文件的名字的列表。

enumerate()遍历一个集合对象,遍历的同时,还可以得到当前元素的索引位置。

imageio.imread("文件路径"):将图片读成张量。

os.path.join():用于文件路径连接

torch.from_numpy(ndarray):从numpy数组创建一个张量,数组和张量共享相同内存。

permute(2,0,1):交换维度

[:]和[:,]的用法:(23条消息) Python中列表索引 A[ : 2 ]与A[ : , 2]的区别_liuyhoo的博客-CSDN博客_python[2:]什么意思icon-default.png?t=M3K6https://blog.csdn.net/liuyhoo/article/details/80789715

猜你喜欢

转载自blog.csdn.net/qq_45828494/article/details/124638856