监督学习与非监督学习 监督学习:通过已有的一部分输入数据与输出数据之间的对应关系,生成一个函数,将输入映射到合适的输出,例如分类。 非监督学习:直接对输入数据集进行建模,例如聚类。 半监督学习:综合利用有类标的数据和没有类标的数据,来生成合适的分类函数。
自编码 自编码是一种非监督学习 有时神经网络要接受大量的输入信息, 何不压缩一下, 提取出原图片中的最具代表性的信息, 缩减输入信息量, 再把缩减过后的信息放进神经网络学习. . 所以, 自编码就能在这时发挥作用. 通过将原数据白色的X 压缩, 解压 成黑色的X, 然后通过对比黑白 X ,求出预测误差, 进行反向传递, 逐步提升自编码的准确性. 训练好的自编码中间这一部分就是能总结原数据的精髓.
编码器 Encoder 编码器能得到原数据的精髓, 然后我们只需要再创建一个小的神经网络学习这个精髓的数据,不仅减少了神经网络的负担, 而且同样能达到很好的效果.
主要作用 给特征值降维
解码器 至于解码器 Decoder, 我们也能那它来做点事情. 我们知道, 解码器在训练的时候是要将精髓信息解压成原始信息, 那么这就提供了一个解压器的作用, 甚至我们可以认为是一个生成器 (类似于GAN).
训练手写数字 数据集 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import torchvisionimport torch.utils .data as Data # 超参数 EPOCH = 10 BATCH_SIZE = 64 LR = 0.005 DOWNLOAD_MNIST = True # 下过数据的话, 就可以设置成 False N_TEST_IMG = 5 # 到时候显示 5 张图片看效果, 如上图一# Mnist digits dataset train_data = torchvision.datasets .MNIST ( root='./mnist/' , train=True , # this is training data transform=torchvision.transforms .ToTensor (), # Converts a PIL .Image or numpy.ndarray to # torch.FloatTensor of shape (C x H x W) and normalize in the range [0.0 , 1.0 ] download=DOWNLOAD_MNIST , # download it if you don't have it ) train_loader = Data.DataLoader(dataset=train_data, batch_size=BATCH_SIZE, shuffle=True)
自编码模型 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 import torch.nn as nnclass AutoEncoder (nn.Module ): def __init__ (self): super (AutoEncoder , self).__init__ () # 压缩 self.encoder = nn.Sequential ( nn.Linear (28 *28 , 128 ), nn.Tanh (), nn.Linear (128 , 64 ), nn.Tanh (), nn.Linear (64 , 12 ), nn.Tanh (), nn.Linear (12 , 3 ), # 压缩成3 个特征, 进行 3D 图像可视化 ) # 解压 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 autoencoder = AutoEncoder ()
训练 注意训练的时候是拿自己和自己编码解码后的数据进行比较 不是和label
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 import torchimport torch.nn as nnfrom 自编码器模型 import autoencoderfrom 训练数据 import EPOCH ,train_loader,LR optimizer = torch.optim .Adam (autoencoder.parameters (), lr=LR ) loss_func = nn.MSELoss () for epoch in range (EPOCH ): for step, (x, b_label) in enumerate (train_loader): b_x = x.view (-1 , 28 *28 ) # batch x, shape (batch, 28 *28 ) b_y = x.view (-1 , 28 *28 ) # batch y, shape (batch, 28 *28 ) encoded, decoded = autoencoder (b_x) loss = loss_func (decoded, b_y) # mean square error optimizer.zero_grad () # clear gradients for this training step loss.backward () # backpropagation, compute gradients optimizer.step () # apply gradients import 可视化
可视化 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 # 要观看的数据 from matplotlib import cmfrom mpl_toolkits.mplot3d import Axes3D import torchfrom 训练数据 import train_datafrom 自编码器模型 import autoencoderimport matplotlib.pyplot as pltview_data = train_data.train_data [:200 ].view (-1 , 28 *28 ).type (torch.FloatTensor )/255. encoded_data, _ = autoencoder (view_data) # 提取压缩的特征值 fig = plt.figure (2 ) ax = Axes3D (fig) # 3D 图 # x, y, z 的数据值 X = encoded_data.data [:, 0 ].numpy () Y = encoded_data.data [:, 1 ].numpy () Z = encoded_data.data [:, 2 ].numpy () values = train_data.train_labels [:200 ].numpy () # 标签值 for x, y, z, s in zip (X, Y, Z, values): c = cm.rainbow (int (255 *s/9 )) # 上色 ax.text (x, y, z, s, backgroundcolor=c) # 标位子 ax.set_xlim (X.min (), X.max ()) ax.set_ylim (Y.min (), Y.max ()) ax.set_zlim (Z.min (), Z.max ()) plt.show ()
作者声明