news 2026/4/3 6:38:51

《动手学深度学习》-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/3/28 6:15:35

2026年普通人有什么机会?

宗旨: 1、最好能有长期发展。 2、不触及法律法规。 3、成本低,收益递增。 方向: 符合社会发展的大潮流。类似雷军当年看到手机的发展。 具体内容: AI带来的社会变革。普通人拥抱AI,利用AI带来的社会变革趋势。 …

作者头像 李华
网站建设 2026/3/30 7:22:24

<Linux基础第5集>关于apt命令的细节

零 先看目录 紧接上一集Linux命令 apt update 与 apt upgrade apt update # 更新本地软件源仓库 # 刷新一下软件商店 apt upgrade # 把所有软件包都更新到最新版本 # 更具本地软件商店,把系统下载的软件全部更新到最新版本 # 一般先执行apt update,在执行pat upgrade apt insta…

作者头像 李华
网站建设 2026/3/22 17:31:59

Linux操作系统(1)

前引:在Linux系统的高并发领域,I/O处理效率直接决定了服务的性能上限。当我们面对每秒数万甚至数十万的连接请求时,传统的“一连接一线程”模型会因线程切换开销暴增而迅速崩溃,而早期的I/O多路转接技术如select和poll&#xff0c…

作者头像 李华
网站建设 2026/3/26 13:51:43

XDP与eBPF:Linux网络性能优化实战指南

1.XDP与eBPF:Linux网络性能优化实战指南 掌握 XDP(eXpress Data Path)和 eBPF(extended Berkeley Packet Filter)的使用与开发,是深入 Linux 网络、安全、可观测性等领域的重要技能。以下是系统性的学习路…

作者头像 李华
网站建设 2026/2/28 23:54:20

从用户体验到提示工程:架构师分享如何将UX研究方法应用于提示词优化

从用户体验到提示工程:架构师分享如何将UX研究方法应用于提示词优化 关键词 UX研究、提示工程、用户需求、交互设计、AI提示优化、用户旅程地图、Persona 摘要 当我们谈论AI交互时,“提示词”就像一把钥匙——它决定了AI能否听懂你的需求,能否输出符合预期的结果。但现实…

作者头像 李华