2026/5/18 13:22:28
网站建设
项目流程
网站主题切换,什么是网络营销的现实基础,网页空间层次,中小型企业网站优化案例全连接神经网络通过卷积神经网络CNN实现特征提取#xff0c;然后通过1x1的卷积将通道数转换为类别个数#xff0c;最后通过转置卷积层将图像的高宽变换为原输入图的尺寸大小一、代码1.构建net#xff08;1#xff09;框架pretrained_nettorchvision.models.resnet18(pretra…全连接神经网络通过卷积神经网络CNN实现特征提取然后通过1x1的卷积将通道数转换为类别个数最后通过转置卷积层将图像的高宽变换为原输入图的尺寸大小一、代码1.构建net1框架pretrained_nettorchvision.models.resnet18(pretrainedTrue) # print(list(pretrained_net.children())[-3:])#最后两层为AdaptiveAvgPool2d、Linear去掉 netnn.Sequential(*list(pretrained_net.children())[:-2])num_classes21 net.add_module(final_conv,nn.Conv2d(in_features512, out_featuresnum_classes,kernel_size1)) net.add_module(Transposed_conv,nn.ConvTranspose2d(num_classes,num_classes,kernel_size64,padding16,stride32))2初始化def bilinear_kernel(in_channel,out_channel,kernel_size): factor(kernel_size1)//2 #上采样放大倍数 if kernel_size %21: centerfactor-1 else: centerfactor-0.5 og(torch.arange(kernel_size).reshape(-1,1),torch.arange(kernel_size).reshape(1,-1))#og[0]是行向量kx1ogp[1]列向量1xk广播之后变成kxk filt(1-torch.abs(og[0]-center)/factor)*(1-torch.abs(og[1]-center)/factor)#kxk的矩阵中心大周围小 weighttorch.zeros((in_channel,out_channel,kernel_size,kernel_size)) weight[range(in_channel),range(out_channel),:,:]filt#让输入通道c只影响同编号C’输出不进行混合只改变对角线上的K初始化 return weightWbilinear_kernel(num_classes,num_classes,64) net.Transposed_conv.weight.data.copy_(W)3测试conv_transopsednn.ConvTranspose2d(3,3,kernel_size4,padding1,stride2,biasFalse) conv_transopsed.weight.data.copy_(bilinear_kernel(3,3,4)) imgtorchvision.transforms.ToTensor()(Image.open(D:/PycharmDocument/limu/data/dogcat.png).convert(RGB)) Ximg.unsqueeze(0) Yconv_transopsed(X) out_imgY[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,axesplt.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_size36,(320,480)train_iter,test_itertest46SemanticSegmentation.load_data_voc(batch_sizebatch_size,crop_sizecrop_size)voc_dir D:/VOCtrainval_11-May-2012/VOCdevkit/VOC2012def read_voc_images(voc_dir, is_trainTrue):读取所有VOC图像并标注# 这里代码会自动拼路径voc_dir ImageSets Segmentation train.txttxt_fname os.path.join(voc_dir, ImageSets, Segmentation,train.txt if is_train else val.txt)mode torchvision.io.image.ImageReadMode.RGBwith 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, labels3.训练def loss(inputs,targets):return F.cross_entropy(inputs,targets,reductionnone).mean(1).mean(1)num_epochs,lr,wd,device5,0.01,1e-3,d2l.try_gpu()trainertorch.optim.SGD(net.parameters(),lrlr,weight_decaywd)d2l.train_ch3(net,trainer,num_epochs,batch_size,device)4.预测def predect(img):Xtest_iter.dataset.normalize_image(img).unsqueeze(0)#(1,3,h,w,)prednet(X.to(device)).argmax(dim1)#(1,h,w)return pred.reshape(pred.shape[1],pred.shape[2])#(h,w)#根据类别反向找对应的rgb将像素点涂对应的颜色def label2image(pred):colormaptorch.tensor(test46SemanticSegmentation.VOC_COLORMAP,devicedevice)Xpred.long()return colormap[X,:]test_images,test_labelsread_voc_images(voc_dir,is_trainFalse)n,imags4,[]for i in range(n):crop_rect(0,0,320,480)Xtorchvision.transforms.functional.crop(test_images[i],*crop_rect)predlabel2image(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,scale2)