news 2026/4/15 16:17:39

《动手学深度学习》-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/4/11 7:43:33

尺寸约束下商业卫星编码器系统的抗辐照MCU性能边界研究

摘要:随着低轨商业卫星星座的规模化部署,星载编码器系统对抗辐照微控制器单元(MCU)的性能、体积及成本提出了严苛的多重要求。本文基于国科安芯AS32S601系列MCU的完整辐照试验数据体系,系统性地研究在LQFP144塑封封装所…

作者头像 李华
网站建设 2026/4/12 16:33:18

Linux操作系统(3)

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

作者头像 李华
网站建设 2026/4/14 1:22:40

学术写作必备:8个AI工具降重与生成效果全面评测

工具对比总结 以下是8个AI论文工具的简要排名,基于核心功能、处理速度和适用性对比。排名侧重实用性与用户反馈,数据源于引用内容案例: 工具名称 主要功能 优势亮点 aibiye 降AIGC率 20分钟处理,AIGC率降至个位数&#xfff…

作者头像 李华
网站建设 2026/4/5 18:17:05

计算机深度学习毕设实战-基于卷神经网络python-CNN深度学习识别狗脸

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/3/27 6:00:27

基于AI的学术论文自动化:7个平台提供LaTeX与格式规范支持

工具快速对比排名(前7推荐) 工具名称 核心功能亮点 处理时间 适配平台 aibiye 学生/编辑双模式降AIGC 1分钟 知网、万方等 aicheck AI痕迹精准弱化查重一体 ~20分钟 知网、格子达、维普 askpaper AIGC率个位数优化 ~20分钟 高校检测规则通…

作者头像 李华
网站建设 2026/4/11 1:12:37

大规模语言模型在个性化学习路径生成中的应用

大规模语言模型在个性化学习路径生成中的应用关键词:大规模语言模型、个性化学习路径、教育技术、自适应学习、智能教育系统摘要:本文深入探讨了大规模语言模型在个性化学习路径生成中的应用。随着教育数字化的推进,个性化学习成为教育领域的…

作者头像 李华