自编码介绍
由于神经网络层与层之间的神经元连接存在输入和输出大小的不同,可以应用网络实现对数据的降维,图片的解压缩等操作。
以图片解压缩为例,输入神经元个数为m,输出神经元个数为n:
若m>n,则将图片进行降维,提取图片的精华信息;
若n<m,则将图片进行增维,对图片进行解压或者扩充图片信息。
网络搭建
#搭建网络
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
#压缩图片网络:由28*28压缩至3
self.encoder=nn.Sequential(
nn.Linear(28*28,128), #输入图片的像素为28*28
nn.Tanh(),
nn.Linear(128,64),
nn.Tanh(),
nn.Linear(64,12),
nn.Tanh(),
nn.Linear(12,3)
)
#解压图片网络:由3解压至28*28
self.decoder=nn.Sequential(
nn.Linear(3,12),
nn.Tanh(),
nn.Linear(12,64),
nn.Tanh(),
nn.Linear(64,128),
nn.Tanh(),
nn.Linear(128,28*28),
nn.Sigmoid(), #将其转换为(0,1)输出值
)
def forward(self, x):
#压缩
encoded=self.encoder(x)
#解压
decoded=self.decoder(encoded)
return encoded,decoded
数据模拟
由于自编码属于非监督学习,只需要训练数据,不需要使用标签数据。
def dataLoader():
# 获取Mnist手写数字数据集
train_data = torchvision.datasets.MNIST(
root='./mnist', #保存或者提取位置
train=True, #如果为True则为训练集,如果为False则为测试集
transform=torchvision.transforms.ToTensor(), #将图片转化成取值[0,1]的Tensor用于网络处理
download=False #是否下载数据集
)
plt.imshow(train_data.train_data[0].numpy(),cmap='gray')
plt.title('%i'%train_data.train_labels[0])
plt.show()
loader = Data.DataLoader(
dataset=train_data,
batch_size=50, #最小训练批量
shuffle=True, #是否对数据进行随机打乱
num_workers=2, #多线程来读数据
)
return loader
====================================
今天到此为止,后续记录其他神经网络技术的学习过程。
以上学习笔记,如有侵犯,请立即联系并删除!