本文主要讲解python文件中怎么调用另外一个py文件中定义的类,将通过代码和示例解读,帮助大家理解和使用。
如在文件B.py
,定义了类别Bottleneck,其包含卷积层、正则化和激活函数层,主要对输入图像进行处理。但没有读取图像等代码。
from torch import nn
def autopad(k, p=None, d=1): # kernel, padding, dilation
# Pad to 'same' shape outputs
if d > 1:
k = d * (k - 1) + 1 if isinstance(k, int) else [d * (x - 1) + 1 for x in k] # actual kernel-size
if p is None:
p = k // 2 if isinstance(k, int) else [x // 2 for x in k] # auto-pad
return p
class Conv(nn.Module):
# Standard convolution with args(ch_in, ch_out, kernel, stride, padding, groups, dilation, activation)
default_act = nn.SiLU() # default activation
def __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 bottleneck
def __init__(self, c1, c2, shortcut=True, g=1, e=0.5): # ch_in, ch_out, shortcut, groups, expansion
super().__init__()
c_ = int(c2 * e) # hidden channels
self.cv1 = Conv(c1, c_, 1, 1)
self.cv2 = Conv(c_, c2, 3, 2, g=g)
self.add = shortcut and c1 == c2
def forward(self, x):
return x + self.cv2(self.cv1(x)) if self.add else self.cv2(self.cv1(x))
文件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在同一文件夹中,如不在同一文件夹需要添加路径。