改用自己数据集代替MNIST数据集的自编码器代码(加了几层网络)

我找到了自己改的代码,还加了几层网络,效果确实是比只有一层网络的好
(当然,这是在学长学姐们的帮助下修改完成的,尤其感谢文哥帮我调试并修改错误)

import torch
from torch.utils.data import Dataset 
import torchvision.datasets as dsets
import torchvision.transforms as transforms
import torchvision
from torch.autograd import Variable
import torch.nn as nn
import os
import numpy as np
# from skimage import io
from PIL import Image
from time import time
#from test_ae import *

num_epochs = 500
batch_size = 128  
hidden_size = 10  
'''
# MNIST dataset
dataset = dsets.MNIST(root='../MINIST/MNIST',
                            train=True,
                            transform=transforms.ToTensor(),
                            download=True)
'''
class AnimalData(Dataset): #继承Dataset
    def __init__(self, root_dir, transform=None): #__init__是初始化该类的一些基础参数
        self.root_dir = root_dir   #文件目录
        self.transform = transform #变换
        self.images = os.listdir(self.root_dir)#目录里的所有文件
    
    def __len__(self):#返回整个数据集的大小
        return len(self.images)
    
    def __getitem__(self,index):#根据索引index返回dataset[index]
        image_index = self.images[index]#根据索引index获取该图片
        img_path = os.path.join(self.root_dir, image_index)#获取索引为index的图片的路径名
        sample = Image.open(img_path).convert('L')# 读取该图片
               
        if self.transform:
            sample = self.transform(sample)#对样本进行变换
        return sample, 1 #返回该样本

dir_path = '/mnt/sdc/cxdu/cat_pic/tesst'
transform = transforms.Compose([transforms.Resize(size = 256), transforms.CenterCrop(size = 224), transforms.Grayscale(num_output_channels=1), transforms.ToTensor()])
dataset = AnimalData(dir_path, transform)

# Data loader
data_loader = torch.utils.data.DataLoader(dataset=dataset,
                                            batch_size=batch_size,
                                            shuffle=True)

def to_var(x):
    if torch.cuda.is_available():
        x = x.cuda()
    return Variable(x)


class Autoencoder(nn.Module):
    #def __init__(self, in_dim=784, h_dim=400):
    def __init__(self, in_dim, n_hidden_1, n_hidden_2, n_hidden_3, h_dim):
        super(Autoencoder, self).__init__()

        self.enlayer1 = nn.Sequential(nn.Linear(in_dim, n_hidden_1), nn.ReLU(True))
        self.enlayer2 = nn.Sequential(nn.Linear(n_hidden_1, n_hidden_2), nn.ReLU(True))
        self.enlayer3 = nn.Sequential(nn.Linear(n_hidden_2, n_hidden_3), nn.ReLU(True))
        self.enlayer4 = nn.Sequential(nn.Linear(n_hidden_3, h_dim), nn.ReLU(True))

        self.delayer1 = nn.Sequential(nn.Linear(h_dim, n_hidden_3), nn.Sigmoid())
        self.delayer2 = nn.Sequential(nn.Linear(n_hidden_3, n_hidden_2), nn.Sigmoid())
        self.delayer3 = nn.Sequential(nn.Linear(n_hidden_2, n_hidden_1), nn.Sigmoid())
        self.delayer4 = nn.Sequential(nn.Linear(n_hidden_1, in_dim), nn.Sigmoid())

    def forward(self, x):     
        x1 = self.enlayer1(x)
        x2 = self.enlayer2(x1)
        x3 = self.enlayer3(x2)
        x4 = self.enlayer4(x3)
        y1 = self.delayer1(x4)
        y2 = self.delayer2(y1)
        y3 = self.delayer3(y2)
        out = self.delayer4(y3)
        return out


ae = Autoencoder(in_dim=50176, n_hidden_1=5000, n_hidden_2=500, n_hidden_3=50, h_dim=hidden_size)

if torch.cuda.is_available():
    ae.cuda()

criterion = nn.BCELoss()
#This is used for measuring the error of a reconstruction in for example an auto-encoder. Note that the targets yy should be numbers between 0 and 1.

optimizer = torch.optim.Adam(ae.parameters(), lr=0.001)
iter_per_epoch = len(data_loader)
data_iter = iter(data_loader)

# save fixed inputs for debugging
fixed_x, _ = next(data_iter)
# print(fixed_x.shape)
x1, y1 = fixed_x.shape[2], fixed_x.shape[3]
torchvision.utils.save_image(Variable(fixed_x).data.cpu(), './result/real_images.png')
fixed_x = to_var(fixed_x.view(fixed_x.size(0), -1))

for epoch in range(num_epochs):
    t0 = time()
    for i, (images, _) in enumerate(data_loader):

        # flatten the image
        images = to_var(images.view(images.size(0), -1))
        print(images.shape)
        out = ae(images)
        loss = criterion(out, images)

        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        if (i+1) % 100 == 0:
            epoch_index = int((epoch+1)/num_epochs)
            #print(dataset)
            #print(len(dataset))
            iter_index = int((i+1)/len(dataset)*batch_size)
            print ('Epoch [%d/%d], Iter [%d/%d] Loss: %.4f Time: %.2fs'%(epoch+1, num_epochs, i+1, len(dataset)//batch_size, loss.data, time()-t0))




    # save the reconstructed images
    reconst_images = ae(fixed_x)
    reconst_images = reconst_images.view(reconst_images.size(0), 1, x1, y1)
    torchvision.utils.save_image(reconst_images.data.cpu(), './data/reconst_images_%d.png' % (epoch+1))
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
下面是一个简单的使用BP神经网络MNIST数据集进行分类的Python代码: ``` python import numpy as np import tensorflow as tf # MNIST数据集 mnist = tf.keras.datasets.mnist (x_train, y_train), (x_test, y_test) = mnist.load_data() # 数据预处理 x_train, x_test = x_train / 255.0, x_test / 255.0 x_train = x_train.reshape(-1, 784) x_test = x_test.reshape(-1, 784) # 定义BP神经网络模型 model = tf.keras.models.Sequential([ tf.keras.layers.Dense(128, activation='sigmoid'), tf.keras.layers.Dense(10) ]) # 编译模型 model.compile(optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy']) # 训练模型 model.fit(x_train, y_train, epochs=10, validation_data=(x_test, y_test)) # 评估模型 model.evaluate(x_test, y_test, verbose=2) ``` 在这个代码中,我们使用Keras API搭建了一个简单的BP神经网络模型,其中包含一个输入层、一个隐藏层和一个输出层。输入层的神经元数为784,即MNIST数据集中每张图片的像素数。隐藏层的神经元数为128,输出层的神经元数为10,即MNIST数据集中的10个数字类别。我们使用Sigmoid激活函数作为隐藏层的激活函数,并且没有为输出层指定激活函数,因为我们使用的是“from_logits=True”的交叉熵损失函数。我们使用Adam优化器来优化模型,并且使用SparseCategoricalCrossentropy作为损失函数。我们将数据集分成了训练集和测试集,并且对模型进行了10轮的训练。最后,我们使用测试集对模型进行了评估。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值