本文主要講解python文件中怎么調用另外一個py文件中定義的類,將通過代碼和示例解讀,幫助大家理解和使用。
目錄
- 代碼
- B.py
- A.py
- 調用過程
代碼
B.py
如在文件B.py
,定義了類別Bottleneck,其包含卷積層、正則化和激活函數層,主要對輸入圖像進行處理。但沒有讀取圖像等代碼。
from torch import nndef autopad(k, p=None, d=1): # kernel, padding, dilation# Pad to 'same' shape outputsif d > 1:k = d * (k - 1) + 1 if isinstance(k, int) else [d * (x - 1) + 1 for x in k] # actual kernel-sizeif p is None:p = k // 2 if isinstance(k, int) else [x // 2 for x in k] # auto-padreturn pclass Conv(nn.Module):# Standard convolution with args(ch_in, ch_out, kernel, stride, padding, groups, dilation, activation)default_act = nn.SiLU() # default activationdef __init__(self, c1, c2, k=3, s=2, p=None, g=1, d=1, act=True):super().__init__()self.conv = nn.Conv2d(c1, c2, k, s, autopad(k, p, d), groups=g, dilation=d, bias=False)self.bn = nn.BatchNorm2d(c2)self.act = self.default_act if act is True else act if isinstance(act, nn.Module) else nn.Identity()def forward(self, x):return self.act(self.bn(self.conv(x)))def forward_fuse(self, x):return self.act(self.conv(x))class Bottleneck(nn.Module):# Standard bottleneckdef __init__(self, c1, c2, shortcut=True, g=1, e=0.5): # ch_in, ch_out, shortcut, groups, expansionsuper().__init__()c_ = int(c2 * e) # hidden channelsself.cv1 = Conv(c1, c_, 1, 1)self.cv2 = Conv(c_, c2, 3, 2, g=g)self.add = shortcut and c1 == c2def forward(self, x):return x + self.cv2(self.cv1(x)) if self.add else self.cv2(self.cv1(x))
A.py
文件A.py
,在此部分,加載一幅圖像并對其進行卷積處理。在代碼中,沒有卷積等層的定義,通過調用B.py
中定義的類進行。
import B
from PIL import Image
from torchvision import transforms
import math
if __name__ == '__main__':image = Image.open("../11111.jpg")transform = transforms.Compose([transforms.ToTensor()])# 對圖像應用轉換操作input_image = transform(image)input_image = input_image.unsqueeze(0)CBR=B.Bottleneck(3,64)x=CBR(input_image )print(x.shape)
把上面代碼保存到自己本地,再把圖像路徑換成的圖像路徑,運行得到打印機結果為:
調用過程
在上面A.py
的代碼中,先通過import B導入B.py文件
,之后通過CBR=B.Bottleneck(3,64)
關聯和初始化定義的Bottleneck。最后使用x=CBR(input_image )
進行使用即可。
注意,本文中用的示例是A.py和B.py在同一文件夾中,如不在同一文件夾需要添加路徑。