pytorch构建卷积自编码器实现图片的压缩的功能,图片检索(以图搜图)功能

该博客通过PyTorch实现了卷积自编码器,应用于MNIST数据集的图像压缩。同时,利用自编码器进行了手写数字的‘以图搜图’功能,展示训练过程及代码,并呈现了在测试集中随机10张不同类别图片的最相似搜索结果。
摘要由CSDN通过智能技术生成
  1. 使用Pytorch构建卷积自编码器,尝试对MNIST数据集进行压缩。
  2. 利用上述自编码器完成手写数字的“以图搜图”的功能。
    要求有构建与训练自编码器的代码和训练过程,以及以图搜图的结果(在测试集中随机拿出10张类别不同的图片,查找其中每个图片的最接近的5-10张图片)。

代码实现:

import numpy as np
import torch
import torchvision
from torch.utils.data import Dataset,DataLoader
import torch.nn as nn
from torch import optim
from torchvision.datasets import MNIST
from PIL import Image
import matplotlib.pyplot as plt
from torch.optim.lr_scheduler import StepLR
import os
from torchvision import transforms as T
import cv2

os.environ["CUDA_VISIBLE_DEVICES"]="0,1,2"

transform=T.Compose([
        T.Resize((28,28)),
        T.Grayscale(),
        T.ToTensor(),
    ])

#定义数据对象
class MNISTDataset(Dataset):
    def __init__(self,images,transform):
        self.dataset=images.data.to(torch.float32)
        self.transform=transform
    def __getitem__(self,index):
        data=self.dataset[index]
        data=np.asarray(data)
        data=Image.fromarray(data)
        data=self.transform(data)
        return data
    def __len__(self):
        return len(self.dataset)
    
##加载数据
def load_mnist():
    trainMnist=MNIST('',download=False,train=True)
    testMnist=MNIST('',download=False,train=False)
    trainMnist=MNISTDataset(trainMnist,transform=transform)
    testMnist
  • 5
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
PyTorch卷积自编码器是一种使用卷积神经网络(CNN)结构来实现的自编码器。自编码器的思想很简单,通过编码器将输入图像转换为一个低维的表示(code),然后再通过解码器将该code重构成与原图像相似的输出图像。 在传统自编码器中,编码器和解码器都是由多个全连接层组成。编码器逐步降低特征映射的尺寸,最终得到一个低维的code表示,解码器则通过多个全连接层逐步将该code解码为与原图像相同尺寸的输出图像。 而在卷积自编码器中,编码器和解码器都是由卷积层、池化层、激活函数和批归一化层组成。编码器通过多个卷积层和池化层逐渐降低特征映射的尺寸,最终得到一个低维的code表示。解码器通过多个转置卷积层、激活函数和批归一化层操作,将该code解码为与原图像相同尺寸的输出图像。 在使用PyTorch实现卷积自编码器时,需要定义一个继承自nn.Module的自编码器类,并在其中定义编码器和解码器的结构。然后通过重写forward方法来实现前向传播过程。在训练过程中,可以使用优化器和损失函数来进行模型的训练和优化。 示例代码如下所示: ```python import torch import torch.nn as nn # 定义自编码器结构 class ConvAutoEncoder(nn.Module): def __init__(self): super(ConvAutoEncoder, self).__init__() # 定义编码器结构 self.encoder = nn.Sequential( nn.Conv2d(3, 16, kernel_size=3, stride=2, padding=1), nn.ReLU(), nn.Conv2d(16,8, kernel_size=3, stride=2, padding=1), nn.ReLU() ) # 定义解码器结构 self.decoder = nn.Sequential( nn.ConvTranspose2d(8, 16, kernel_size=3, stride=2, padding=1, output_padding=1), nn.ReLU(), nn.ConvTranspose2d(16, 3, kernel_size=3, stride=2, padding=1, output_padding=1), nn.Sigmoid() ) def forward(self, x): x = self.encoder(x) x = self.decoder(x) return x # 创建自编码器实例 model = ConvAutoEncoder() ``` 这是一个简单的卷积自编码器示例,其中编码器和解码器分别由卷积层和转置卷积层组成。编码器逐步降低特征映射的尺寸,解码器通过转置卷积层逐步将其解码为与原图像相同尺寸的输出图像。你可以根据实际需求和数据集的特点来调整网络结构和超参数。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [【12】自编码器(Auto-Encoder)的介绍与pytorch实现](https://blog.csdn.net/weixin_44751294/article/details/116328073)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Pytorch:基于转置卷积解码的卷积自编码网络](https://blog.csdn.net/weixin_44979150/article/details/123425338)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值