pytorch网络输入图片通道在前在后(channel_first和channel_last)的问题

刚开始学习pytorch卷积神经网络的时候,网络输入要求是(batch,3,32,32),我们如果想要测试自己电脑上的图片格式为(32,32,3)。即网络要求channel_first,本地图片是channel_last,此时我们只需要使用numpy中的np.transpose()函数调整下通道的顺序即可。代码如下:

import numpy as np
import cv2
path = r"C:\Users\X_man\Desktop\image\cat.jpg"
image = cv2.imread(path,0)
image = cv2.resize(image,(32,32))
image = cv2.cvtColor(image,cv2.COLOR_GRAY2BGR)
print(image.shape)

(32,32,3)

image = np.transpose(image,(2,0,1))
print(image.shape)

(3,32,32)

  • 16
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch中,一般使用"channel_first"格式的输入数据来定义卷积神经网络,特别是在使用GPU进行训练时,因为GPU更适合处理这种数据格式。但是,在某些情况下,也可以使用"channel_last"格式的输入数据,例如在使用一些特殊的库或工具时,或者在一些特定的应用场景下。 下面是一些使用"channel_first"和"channel_last"格式的输入数据的示例: - "channel_first":对于一个4D张量(batch_size, channels, height, width),可以使用以下方式来定义输入数据: ```python import torch # 定义一个batch_size为32,通道数为3,高度为224,宽度为224的输入张量 input_data = torch.randn(32, 3, 224, 224) ``` - "channel_last":对于一个4D张量(batch_size, height, width, channels),可以使用以下方式来定义输入数据: ```python import torch # 定义一个batch_size为32,高度为224,宽度为224,通道数为3的输入张量 input_data = torch.randn(32, 224, 224, 3) ``` 需要注意的是,如果使用"channel_last"格式的输入数据来定义卷积神经网络,需要在网络定义中增加一行代码来将输入数据转换为"channel_first"格式,例如: ```python import torch.nn as nn # 定义一个卷积神经网络模型 class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(3, 6, 5) self.pool = nn.MaxPool2d(2, 2) self.conv2 = nn.Conv2d(6, 16, 5) self.fc1 = nn.Linear(16 * 5 * 5, 120) self.fc2 = nn.Linear(120, 84) self.fc3 = nn.Linear(84, 10) def forward(self, x): # 将输入数据从channel_last转换为channel_first x = x.permute(0, 3, 1, 2) x = self.pool(nn.functional.relu(self.conv1(x))) x = self.pool(nn.functional.relu(self.conv2(x))) x = x.view(-1, 16 * 5 * 5) x = nn.functional.relu(self.fc1(x)) x = nn.functional.relu(self.fc2(x)) x = self.fc3(x) return x ``` 需要注意的是,如果使用"channel_last"格式的输入数据来定义卷积神经网络,需要在网络定义中增加一行代码来将输入数据转换为"channel_first"格式,例如: ```python import torch.nn as nn # 定义一个卷积神经网络模型 class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(3, 6, 5) self.pool = nn.MaxPool2d(2, 2) self.conv2 = nn.Conv2d(6, 16, 5) self.fc1 = nn.Linear(16 * 5 * 5, 120) self.fc2 = nn.Linear(120, 84) self.fc3 = nn.Linear(84, 10) def forward(self, x): # 将输入数据从channel_last转换为channel_first x = x.permute(0, 3, 1, 2) x = self.pool(nn.functional.relu(self.conv1(x))) x = self.pool(nn.functional.relu(self.conv2(x))) x = x.view(-1, 16 * 5 * 5) x = nn.functional.relu(self.fc1(x)) x = nn.functional.relu(self.fc2(x)) x = self.fc3(x) return x ``` 需要注意的是,模型中的其他层和参数都不需要改变,只需要在输入数据的格式上进行调整即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值