news 2026/5/5 18:12:40

《动手学深度学习》-48全连接卷积神经网络FCN实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
《动手学深度学习》-48全连接卷积神经网络FCN实现

全连接神经网络通过卷积神经网络CNN实现特征提取,然后通过1x1的卷积将通道数转换为类别个数,最后通过转置卷积层将图像的高宽变换为原输入图的尺寸大小

一、代码

1.构建net

(1)框架

pretrained_net=torchvision.models.resnet18(pretrained=True) # print(list(pretrained_net.children())[-3:])#最后两层为AdaptiveAvgPool2d、Linear去掉 net=nn.Sequential(*list(pretrained_net.children())[:-2])
num_classes=21 net.add_module('final_conv',nn.Conv2d(in_features=512, out_features=num_classes,kernel_size=1)) net.add_module('Transposed_conv',nn.ConvTranspose2d(num_classes,num_classes,kernel_size=64,padding=16,stride=32))

(2)初始化

def bilinear_kernel(in_channel,out_channel,kernel_size): factor=(kernel_size+1)//2 #上采样放大倍数 if kernel_size %2==1: center=factor-1 else: center=factor-0.5 og=(torch.arange(kernel_size).reshape(-1,1),torch.arange(kernel_size).reshape(1,-1))#og[0]是行向量kx1,ogp[1]列向量1xk,广播之后变成kxk, filt=(1-torch.abs(og[0]-center)/factor)*(1-torch.abs(og[1]-center)/factor)#kxk的矩阵,中心大,周围小 weight=torch.zeros((in_channel,out_channel,kernel_size,kernel_size)) weight[range(in_channel),range(out_channel),:,:]=filt#让输入通道c只影响同编号C’输出,不进行混合,只改变对角线上的K初始化 return weight
W=bilinear_kernel(num_classes,num_classes,64) net.Transposed_conv.weight.data.copy_(W)

(3)测试

conv_transopsed=nn.ConvTranspose2d(3,3,kernel_size=4,padding=1,stride=2,bias=False) conv_transopsed.weight.data.copy_(bilinear_kernel(3,3,4)) img=torchvision.transforms.ToTensor()(Image.open('D:/PycharmDocument/limu/data/dogcat.png').convert('RGB')) X=img.unsqueeze(0) Y=conv_transopsed(X) out_img=Y[0].permute(1,2,0).detach() print('input image shape',img.permute(1,2,0).shape) print('output image shape',out_img.shape) d2l.set_figsize() fig,axes=plt.subplots(1,2) axes[0].imshow(img.permute(1,2,0)) axes[0].set_title('input image') axes[1].imshow(out_img) axes[1].set_title('output image') d2l.plt.show()

输入一张图,采用conv_transopsed操作,看一下大小,可以看出经过转置卷积,输出图片尺寸大一倍,

2.读取数据

batch_size,crop_size=36,(320,480)
train_iter,test_iter=test46SemanticSegmentation.load_data_voc(batch_size=batch_size,crop_size=crop_size)
voc_dir = 'D:/VOCtrainval_11-May-2012/VOCdevkit/VOC2012'
def read_voc_images(voc_dir, is_train=True):
"""读取所有VOC图像并标注"""
# 这里代码会自动拼路径:voc_dir + ImageSets + Segmentation + train.txt
txt_fname = os.path.join(voc_dir, 'ImageSets', 'Segmentation',
'train.txt' if is_train else 'val.txt')
mode = torchvision.io.image.ImageReadMode.RGB
with open(txt_fname, 'r') as f:
images = f.read().split()
features, labels = [], []
for i, fname in enumerate(images):
# 读取原始图片
features.append(torchvision.io.read_image(os.path.join(
voc_dir, 'JPEGImages', f'{fname}.jpg')))
# 读取语义分割标签图
labels.append(torchvision.io.read_image(os.path.join(
voc_dir, 'SegmentationClass' ,f'{fname}.png'), mode))
return features, labels

3.训练

def loss(inputs,targets):
return F.cross_entropy(inputs,targets,reduction='none').mean(1).mean(1)
num_epochs,lr,wd,device=5,0.01,1e-3,d2l.try_gpu()
trainer=torch.optim.SGD(net.parameters(),lr=lr,weight_decay=wd)
d2l.train_ch3(net,trainer,num_epochs,batch_size,device)
4.预测
def predect(img):
X=test_iter.dataset.normalize_image(img).unsqueeze(0)#(1,3,h,w,)
pred=net(X.to(device)).argmax(dim=1)#(1,h,w)
return pred.reshape(pred.shape[1],pred.shape[2])#(h,w)
#根据类别反向找对应的rgb,将像素点涂对应的颜色
def label2image(pred):
colormap=torch.tensor(test46SemanticSegmentation.VOC_COLORMAP,device=device)
X=pred.long()
return colormap[X,:]
test_images,test_labels=read_voc_images(voc_dir,is_train=False)
n,imags=4,[]
for i in range(n):
crop_rect=(0,0,320,480)
X=torchvision.transforms.functional.crop(test_images[i],*crop_rect)
pred=label2image(predect(X))
imags+=[X.permute(1,2,0),pred.cpu(),torchvision.transforms.functional.crop(test_labels[i],*crop_rect).permute(1,2,0)]
d2l.show_images(imags[::3]+imags[1::3]+imags[2::3],3,n,scale=2)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 0:42:58

如何通过服装管理ERP软件实现生产流程的高效优化?

如何选择适合的服装管理ERP软件以提升企业效益 在选择适合的服装管理ERP软件时,首先要考虑企业的具体需求。不同企业在规模、业务流程和管理模式上存在差异,因此定制化解决方案尤为关键。其次,软件的易用性也是重要考量之一,高效的…

作者头像 李华
网站建设 2026/5/2 21:50:40

Storm资源调度策略:提升大数据处理集群效率

Storm资源调度策略:提升大数据处理集群效率 关键词:Storm、资源调度、大数据处理、集群效率、反亲和性调度、动态资源调整、拓扑结构 摘要:在大数据实时处理场景中,Storm作为经典的流计算框架,其资源调度策略直接影响集…

作者头像 李华
网站建设 2026/5/1 16:49:12

亲测好用8个AI论文写作软件,继续教育学生轻松搞定毕业论文!

亲测好用8个AI论文写作软件,继续教育学生轻松搞定毕业论文! AI 工具如何成为论文写作的得力助手 在当前的学术环境中,越来越多的学生和科研工作者开始依赖 AI 工具来提升论文写作的效率。尤其是在继续教育领域,许多学生需要兼顾工…

作者头像 李华
网站建设 2026/5/3 2:03:16

【RAG】22-RAG评估的挑战与未来方向:当前问题及未来发展趋势

引言RAG评估(检索增强生成评估)是一种系统化的评估工具,旨在帮助组织识别、评估和应对潜在的风险因素。该评估框架涵盖了多个关键领域,提供全面的风险管理视角。RAG评估的主要目的是通过结构化的方法,帮助组织识别和量…

作者头像 李华
网站建设 2026/5/3 0:48:40

小麦病害数据集(yolo使用)

1.数据集:根据不同病害种类划分为包括健康小麦在内的多类国内常见的小麦病害,分别为:根冠腐烂(Crown and Root Rot)、叶锈病(Leaf Rust)、小麦散斑,又名小麦黑穗病(Wheat…

作者头像 李华