【Pytorch神经网络实战案例】13 构建变分自编码神经网络模型生成Fashon-MNST模拟数据

1 变分自编码神经网络生成模拟数据案例说明

变分自编码里面真正的公式只有一个KL散度。

1.1 变分自编码神经网络模型介绍

主要由以下三个部分构成:

1.1.1 编码器

由两层全连接神经网络组成,第一层有784个维度的输入和256个维度的输出;第二层并列连接了两个全连接神经网络,每个网络都有两个维度的输出,输出的结果分别代表数据分布的均值与方差。

1.1.2 采样器

根据编码器得到的均值与方差计算出数据分布情况,从数据分布情况中采样取得数据特征z,并将z传递到两节点为开始的解码器部分。

1.1.3 解码器

由两个全连接神经网络构成,第一层有两个维度的输入和256个维度的输出;第二层有256个维度的输入和784哥维度的输出。

  1. 采样器的左侧是编码器。
  2. 圆角方框是采样器部分,其工作步骤如下。(1)用lg_var.exp()方法算出真正的方差值。(2)用方差值的sqrt0方法执行开平方运算得到标准差。(3)在符合标准正态分布的空间里随意采样,得到一个具体的数。(4)将该数乘以标准差,再加上均值,得到符合编码器输出的数据分布(均值为mean、方差为sigma)集合中的一个点(sigma是指网络生成的lg_var经过变换后的值)。
  3. 采样器的右侧是解码器。 经过采样器之后所合成的点可以输入解码器进行模拟样本的生成。

1.1.4 小总结

在神经网络中,可以为模型的输出值赋于任意一个意义,并通过训练得到对应的关系。具体做法是:将代表该意义的值代入相应的公式(要求该公式必须能够支持返向传播),计算公式的输出值与目标值的误差,并将误差放到优化器里,然后通过多次选代的方式进行训练。

2 变分自编码神经网络模型的反向传播与KL散度的应用

变分自编码神经网络模型是假设编码器输出的数据分布属于高斯分布,只有在编码器能够输出符合高斯分布数据集的前提上,才可以将一个符合标准高斯分布中的点x通过mean+sigma × x的方式进行转化(mean表示均值、sigma表示标准差),完成在解码器输出空间中的采样功能。

2.1 变分自编码神经网络的损失函数

变分自编码神经网络的损失函数不但需要计算输出结果与输入之间的个体差异,而且需要计算输出分布与高斯分布之间的差异。
输出与输入之间的损失函数可以使用MSE算法来计算,输出分布与标准高斯分布之损失函数可以使用KL散度距离进行计算。

2.2 KL散度

KL散度是相对熵的意思。KL散度在本例中的应用可以理解为在模型的训练过程中令输出的数据分布与标准高斯分布之间的差距不断缩小。

设P(x)、Q(x)是离散随机变量集合X中取值x的两个概率分布函数,它们的结果分别为p和q,则p对q的相对熵如下:

由式可知,当P(x)和Q(x)两个概率分布函数相同时,相对熵为0(因为log1=0)并且相对熵具有不对称性,“Ep”代表期望,期望是指每次可能结果的概率乘以结果的总和。

将高斯分布的密度函数代入上式中,可以得到:

为输出分布与标准高斯分布之间的KL散度距离。它与MSE算法一起构成变分自编码神经网络的损失函数。

3 实例代码编写

3.1 代码实战:引入模块并载入样本----Variational_selfcoding.py(第1部分)

import torch
import torchvision
from cv2 import waitKey
from torch import nn
import torch.nn.functional as F
from torch.utils.data import DataLoader
from torchvision import transforms
import numpy as np
from scipy.stats import norm # 在模型可视化时使用该库的norm接口从标准的高斯分布中获取数值
import matplotlib.pylab as plt
import os
os.environ['KMP_DUPLICATE_LIB_OK'] = 'True'  # 可能是由于是MacOS系统的原因# 1.1 引入模块并载入样本:定义基础函数,并且加载FashionMNIST数据集
# 定义样本预处理接口
img_transform = transforms.Compose([transforms.ToTensor()])def to_img(x): # 将张量转化为图片x = 0.5 * (x + 1)x = x.clamp(0,1)x = x.reshape(x.size(0),1,28,28)return xdef imshow(img): # 显示图片npimg = img.numpy()plt.axis('off')plt.imshow(np.transpose(npimg,(1,2,0)))plt.show()data_dir = './fashion_mnist/' # 加载数据集
train_dataset = torchvision.datasets.FashionMNIST(data_dir,train=True,transform=img_transform,download=True)
# 获取训练数据集
train_loader = DataLoader(train_dataset,batch_size=128,shuffle=True)
# 获取测试数据集
val_dataset = torchvision.datasets.FashionMNIST(data_dir,train=False,transform=img_transform)
test_dataset = DataLoader(val_dataset,batch_size=10,shuffle=False)
# 指定设备
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print("所使用的设备为:",device)

3.2 代码实战:定义变分自编码神经网络的正向模型----Variational_selfcoding.py(第2部分)

# 1.2 定义变分自编码神经网络模型的正向结构
class VAE(nn.Module):def __init__(self,hidden_1=256,hidden_2=256,in_decode_dim=2,hidden_3=256):super(VAE, self).__init__()self.fc1 = nn.Linear(784, hidden_1)self.fc21 = nn.Linear(hidden_2, 2)self.fc22 = nn.Linear(hidden_2, 2)self.fc3 = nn.Linear(in_decode_dim, hidden_3)self.fc4 = nn.Linear(hidden_3, 784)def encode(self,x): # 编码器方法:使用两层全连接网络将输入的图片进行压缩,对第二层中两个神经网络的输出结果代表均值(mean)与取对数(log)以后的方差(lg_var)。h1 = F.relu(self.fc1(x))return self.fc21(h1),self.fc22(h1)def reparametrize(self,mean,lg_var): # 采样器方法:对方差(lg_var)进行还原,并从高斯分布中采样,将采样数值映射到编码器输出的数据分布中。std = lg_var.exp().sqrt()# torch.FloatTensor(std.size())的作用是,生成一个与std形状一样的张量。然后,调用该张量的normal_()方法,系统会对该张量中的每个元素在标准高斯空间(均值为0、方差为1)中进行采样。eps = torch.FloatTensor(std.size()).normal_().to(device) # 随机张量方法normal_(),完成高斯空间的采样过程。return eps.mul(std).add_(mean)# 在torch.FloatTensor()# 函数中,传入Tensor的size类型,返回的是一个同样为size的张量。假如std的size为[batch,dim],则返回形状为[batch,dim]的未初始化张量,等同于torch.FloatTensor(#     batch,dim),但不等同于torchFloatTensor([batch,dim),这是值得注意的地方。def decode(self,z): # 解码器方法:输入映射后的采样值,用两层神经网络还原出原始图片。h3 = F.relu(self.fc3(z))return self.fc4(h3)def forward(self,x,*arg): # 正向传播方法:将编码器,采样器,解码器串联起来,根据输入的原始图片生成模拟图片mean,lg_var = self.encode(x)z = self.reparametrize(mean=mean,lg_var=lg_var)return self.decode(z),mean,lg_var

3.3 代码实战:损失函数与训练函数的完善----Variational_selfcoding.py(第3部分)

# 1.3 完成损失函数和训练函数
reconstruction_function = nn.MSELoss(size_average=False)def loss_function(recon_x,x,mean,lg_var): # 损失函数:将MSE的损失缩小到一半,再与KL散度相加,目的在于使得输出的模拟样本可以有更灵活的变化空间。MSEloss = reconstruction_function(recon_x,x) # MSE损失KLD = -0.5 * torch.sum(1 + lg_var -  mean.pow(2) - lg_var.exp())return 0.5 * MSEloss + KLDdef train(model,num_epochs = 50): # 训练函数optimizer = torch.optim.Adam(model.parameters(),lr=1e-3)display_step = 5for epoch in range(num_epochs):model.train()train_loss = 0for batch_idx, data in enumerate(train_loader):img,label = dataimg = img.view(img.size(0),-1).to(device)y_one_hot = torch.zeros(label.shape[0],10).scatter_(1,label.view(label.shape[0],1),1).to(device)optimizer.zero_grad()recon_batch, mean, lg_var = model(img, y_one_hot)loss = loss_function(recon_batch, img, mean, lg_var)loss.backward()train_loss += loss.dataoptimizer.step()if epoch % display_step == 0:print("Epoch:", '%04d' % (epoch + 1), "cost=", "{:.9f}".format(loss.data))print("完成训练 cost=",loss.data)

3.4 代码实战:训练模型并输出可视化结果----Variational_selfcoding.py(第4部分)

# 1.4 训练模型并输出可视化结果
if __name__ == '__main__':model = VAE().to(device) # 实例化模型train(model, 50)    # 训练模型test_loader = DataLoader(val_dataset, batch_size=len(val_dataset), shuffle=False) # 获取全部测试数据# 可视化结果sample = iter(test_loader)images, labels = sample.next()images2 = images.view(images.size(0), -1)with torch.no_grad():pred, mean, lg_var = model(images2.to(device))pred = to_img(pred.cpu().detach())rel = torch.cat([images, pred], axis=0)imshow(torchvision.utils.make_grid(rel, nrow=10))# 上一语句的生成结果中,第1行是原始的样本图片,第2行是使用变分自编码重建后生成的图片可以看到,生成的样本并不会与原始的输入样本完全一致。这表明模型不是一味地学习样本个体,而是通过数据分布的方式学习样本的分布规则。waitKey(30)

3.5 代码实战:提取样本的低维数据并可视化----Variational_selfcoding.py(第5部分)

    # 1.5 提取样本的低维特征并可视化: 编写代码实现对原始数据的维度进行压缩,利用解码器输出的均值和方差从解码器输出的分布空间中取样,并将其映到直角坐标系中展现出来,具体代码如下。sample = iter(test_loader)images, labels = sample.next()with torch.no_grad(): # 将数据输入模型获得低维度特征:mean, lg_var = model.encode(images.view(images.size(0), -1).to(device))# 将数据输入模型获得低维度特征:z = model.reparametrize(mean, lg_var)# 将数据输入模型获得低维度特征:在输出样本空间中采样z =z.cpu().detach().numpy()plt.figure(figsize=(6, 6))plt.scatter(z[:, 0], z[:, 1], c=labels) # 在坐标轴中显示plt.colorbar()plt.show() # 根据结果显示,数据集中同一类样本的特征分布还是比较集中的。这说明变分自编码神经网络具有降维功能,也可以用于进行分类任务的数据降维预处理。

3.6 代码实战:可视化模型的输出空间----Variational_selfcoding.py(第6部分)

#1.6 可视化模型的输出空间n = 15  # 生成15个图片digit_size = 28figure = np.zeros((digit_size * n, digit_size * n))# norm代表标准高斯分布,ppf代表累积分布函数的反函数。累积积分布的意思是,在一个集合里所有小于指定值出现的概率的和。举例,x=ppf(0.05)就代表每个小于x的数在集合里出现的概率的总和等于0.05。# norm.ppf()函数的作用是使用百分比从按照大小排列后的标准高斯分布中取值# p.linspace(0.05,0.95,n)的作用是将整个高斯分布数据集从大到小排列,并将其分成100份,再将第5份到第95份之间的数据取出、最后,将取出的数据分成n份,返回每一份最后一个数据的具体数值。grid_x = norm.ppf(np.linspace(0.05, 0.95, n))grid_y = norm.ppf(np.linspace(0.05, 0.95, n))for i, yi in enumerate(grid_x):for j, xi in enumerate(grid_y):z_sample = torch.FloatTensor([[xi, yi]]).reshape([1, 2]).to(device)x_decoded = model.decode(z_sample).cpu().detach().numpy()digit = x_decoded[0].reshape(digit_size, digit_size)figure[i * digit_size: (i + 1) * digit_size,j * digit_size: (j + 1) * digit_size] = digitplt.figure(figsize=(10, 10))plt.imshow(figure, cmap='Greys_r')plt.show()#从上一语句的生成结果中可以清楚地看到鞋子、手提包和服装商品之间的过渡。变分自编码神经网络生成的分布样本很有规律性,左下方侧重的图像较宽和较高,右上方侧重的图像较宽和较矮,左上方侧重的图像下方较宽、上方较窄,右下方侧重的图像较窄和较高。

4 代码汇总(Variational_selfcoding.py)

import torch
import torchvision
from cv2 import waitKey
from torch import nn
import torch.nn.functional as F
from torch.utils.data import DataLoader
from torchvision import transforms
import numpy as np
from scipy.stats import norm # 在模型可视化时使用该库的norm接口从标准的高斯分布中获取数值
import matplotlib.pylab as plt
import os
os.environ['KMP_DUPLICATE_LIB_OK'] = 'True'  # 可能是由于是MacOS系统的原因# 1.1 引入模块并载入样本:定义基础函数,并且加载FashionMNIST数据集
# 定义样本预处理接口
img_transform = transforms.Compose([transforms.ToTensor()])def to_img(x): # 将张量转化为图片x = 0.5 * (x + 1)x = x.clamp(0,1)x = x.reshape(x.size(0),1,28,28)return xdef imshow(img): # 显示图片npimg = img.numpy()plt.axis('off')plt.imshow(np.transpose(npimg,(1,2,0)))plt.show()data_dir = './fashion_mnist/' # 加载数据集
train_dataset = torchvision.datasets.FashionMNIST(data_dir,train=True,transform=img_transform,download=True)
# 获取训练数据集
train_loader = DataLoader(train_dataset,batch_size=128,shuffle=True)
# 获取测试数据集
val_dataset = torchvision.datasets.FashionMNIST(data_dir,train=False,transform=img_transform)
test_dataset = DataLoader(val_dataset,batch_size=10,shuffle=False)
# 指定设备
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print("所使用的设备为:",device)# 1.2 定义变分自编码神经网络模型的正向结构
class VAE(nn.Module):def __init__(self,hidden_1=256,hidden_2=256,in_decode_dim=2,hidden_3=256):super(VAE, self).__init__()self.fc1 = nn.Linear(784, hidden_1)self.fc21 = nn.Linear(hidden_2, 2)self.fc22 = nn.Linear(hidden_2, 2)self.fc3 = nn.Linear(in_decode_dim, hidden_3)self.fc4 = nn.Linear(hidden_3, 784)def encode(self,x): # 编码器方法:使用两层全连接网络将输入的图片进行压缩,对第二层中两个神经网络的输出结果代表均值(mean)与取对数(log)以后的方差(lg_var)。h1 = F.relu(self.fc1(x))return self.fc21(h1),self.fc22(h1)def reparametrize(self,mean,lg_var): # 采样器方法:对方差(lg_var)进行还原,并从高斯分布中采样,将采样数值映射到编码器输出的数据分布中。std = lg_var.exp().sqrt()# torch.FloatTensor(std.size())的作用是,生成一个与std形状一样的张量。然后,调用该张量的normal_()方法,系统会对该张量中的每个元素在标准高斯空间(均值为0、方差为1)中进行采样。eps = torch.FloatTensor(std.size()).normal_().to(device) # 随机张量方法normal_(),完成高斯空间的采样过程。return eps.mul(std).add_(mean)# 在torch.FloatTensor()# 函数中,传入Tensor的size类型,返回的是一个同样为size的张量。假如std的size为[batch,dim],则返回形状为[batch,dim]的未初始化张量,等同于torch.FloatTensor(#     batch,dim),但不等同于torchFloatTensor([batch,dim),这是值得注意的地方。def decode(self,z): # 解码器方法:输入映射后的采样值,用两层神经网络还原出原始图片。h3 = F.relu(self.fc3(z))return self.fc4(h3)def forward(self,x,*arg): # 正向传播方法:将编码器,采样器,解码器串联起来,根据输入的原始图片生成模拟图片mean,lg_var = self.encode(x)z = self.reparametrize(mean=mean,lg_var=lg_var)return self.decode(z),mean,lg_var# 1.3 完成损失函数和训练函数
reconstruction_function = nn.MSELoss(size_average=False)def loss_function(recon_x,x,mean,lg_var): # 损失函数:将MSE的损失缩小到一半,再与KL散度相加,目的在于使得输出的模拟样本可以有更灵活的变化空间。MSEloss = reconstruction_function(recon_x,x) # MSE损失KLD = -0.5 * torch.sum(1 + lg_var -  mean.pow(2) - lg_var.exp())return 0.5 * MSEloss + KLDdef train(model,num_epochs = 50): # 训练函数optimizer = torch.optim.Adam(model.parameters(),lr=1e-3)display_step = 5for epoch in range(num_epochs):model.train()train_loss = 0for batch_idx, data in enumerate(train_loader):img,label = dataimg = img.view(img.size(0),-1).to(device)y_one_hot = torch.zeros(label.shape[0],10).scatter_(1,label.view(label.shape[0],1),1).to(device)optimizer.zero_grad()recon_batch, mean, lg_var = model(img, y_one_hot)loss = loss_function(recon_batch, img, mean, lg_var)loss.backward()train_loss += loss.dataoptimizer.step()if epoch % display_step == 0:print("Epoch:", '%04d' % (epoch + 1), "cost=", "{:.9f}".format(loss.data))print("完成训练 cost=",loss.data)# 1.4 训练模型并输出可视化结果
if __name__ == '__main__':model = VAE().to(device) # 实例化模型train(model, 50)    # 训练模型test_loader = DataLoader(val_dataset, batch_size=len(val_dataset), shuffle=False) # 获取全部测试数据# 可视化结果sample = iter(test_loader)images, labels = sample.next()images2 = images.view(images.size(0), -1)with torch.no_grad():pred, mean, lg_var = model(images2.to(device))pred = to_img(pred.cpu().detach())rel = torch.cat([images, pred], axis=0)imshow(torchvision.utils.make_grid(rel, nrow=10))# 上一语句的生成结果中,第1行是原始的样本图片,第2行是使用变分自编码重建后生成的图片可以看到,生成的样本并不会与原始的输入样本完全一致。这表明模型不是一味地学习样本个体,而是通过数据分布的方式学习样本的分布规则。waitKey(30)# 1.5 提取样本的低维特征并可视化: 编写代码实现对原始数据的维度进行压缩,利用解码器输出的均值和方差从解码器输出的分布空间中取样,并将其映到直角坐标系中展现出来,具体代码如下。sample = iter(test_loader)images, labels = sample.next()with torch.no_grad(): # 将数据输入模型获得低维度特征:mean, lg_var = model.encode(images.view(images.size(0), -1).to(device))# 将数据输入模型获得低维度特征:z = model.reparametrize(mean, lg_var)# 将数据输入模型获得低维度特征:在输出样本空间中采样z =z.cpu().detach().numpy()plt.figure(figsize=(6, 6))plt.scatter(z[:, 0], z[:, 1], c=labels) # 在坐标轴中显示plt.colorbar()plt.show()# 根据结果显示,数据集中同一类样本的特征分布还是比较集中的。这说明变分自编码神经网络具有降维功能,也可以用于进行分类任务的数据降维预处理。#1.6 可视化模型的输出空间n = 15  # 生成15个图片digit_size = 28figure = np.zeros((digit_size * n, digit_size * n))# norm代表标准高斯分布,ppf代表累积分布函数的反函数。累积积分布的意思是,在一个集合里所有小于指定值出现的概率的和。举例,x=ppf(0.05)就代表每个小于x的数在集合里出现的概率的总和等于0.05。# norm.ppf()函数的作用是使用百分比从按照大小排列后的标准高斯分布中取值# p.linspace(0.05,0.95,n)的作用是将整个高斯分布数据集从大到小排列,并将其分成100份,再将第5份到第95份之间的数据取出、最后,将取出的数据分成n份,返回每一份最后一个数据的具体数值。grid_x = norm.ppf(np.linspace(0.05, 0.95, n))grid_y = norm.ppf(np.linspace(0.05, 0.95, n))for i, yi in enumerate(grid_x):for j, xi in enumerate(grid_y):z_sample = torch.FloatTensor([[xi, yi]]).reshape([1, 2]).to(device)x_decoded = model.decode(z_sample).cpu().detach().numpy()digit = x_decoded[0].reshape(digit_size, digit_size)figure[i * digit_size: (i + 1) * digit_size,j * digit_size: (j + 1) * digit_size] = digitplt.figure(figsize=(10, 10))plt.imshow(figure, cmap='Greys_r')plt.show()#从上一语句的生成结果中可以清楚地看到鞋子、手提包和服装商品之间的过渡。变分自编码神经网络生成的分布样本很有规律性,左下方侧重的图像较宽和较高,右上方侧重的图像较宽和较矮,左上方侧重的图像下方较宽、上方较窄,右下方侧重的图像较窄和较高。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/469331.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Pytorch神经网络实战案例】14 构建条件变分自编码神经网络模型生成可控Fashon-MNST模拟数据

1 条件变分自编码神经网络生成模拟数据案例说明 在实际应用中,条件变分自编码神经网络的应用会更为广泛一些,因为它使得模型输出的模拟数据可控,即可以指定模型输出鞋子或者上衣。 1.1 案例描述 在变分自编码神经网络模型的技术上构建条件…

hibernate持久化对象

转载于:https://www.cnblogs.com/jianxin-lilang/p/6440101.html

【Pytorch神经网络理论篇】 23 对抗神经网络:概述流程 + WGAN模型 + WGAN-gp模型 + 条件GAN + WGAN-div + W散度

同学你好!本文章于2021年末编写,获得广泛的好评! 故在2022年末对本系列进行填充与更新,欢迎大家订阅最新的专栏,获取基于Pytorch1.10版本的理论代码(2023版)实现, Pytorch深度学习理论篇(2023版)目录地址…

【Pytorch神经网络实战案例】15 WGAN-gp模型生成Fashon-MNST模拟数据

1 WGAN-gp模型生成模拟数据案例说明 使用WGAN-gp模型模拟Fashion-MNIST数据的生成,会使用到WGAN-gp模型、深度卷积GAN(DeepConvolutional GAN,DCGAN)模型、实例归一化技术。 1.1 DCGAN中的全卷积 WGAN-gp模型侧重于GAN模型的训练部分,而DCG…

Android启动过程深入解析

转载自:http://blog.jobbole.com/67931/ 当按下Android设备电源键时究竟发生了什么?Android的启动过程是怎么样的?什么是Linux内核?桌面系统linux内核与Android系统linux内核有什么区别?什么是引导装载程序&#xff1…

【Pytorch神经网络实战案例】16 条件WGAN模型生成可控Fashon-MNST模拟数据

1 条件GAN前置知识 条件GAN也可以使GAN所生成的数据可控,使模型变得实用, 1.1 实验描述 搭建条件GAN模型,实现向模型中输入标签,并使其生成与标签类别对应的模拟数据的功能,基于WGAN-gp模型改造实现带有条件的wGAN-…

Android bootchart(二)

这篇文章讲一下MTK8127开机启动的时间 MTK8127发布版本开机时间大约在20秒左右,如果发现开机时间变长,大部分是因为加上了客户订制的东西,代码累赘太多了。 1、下面看一下MT&#…

Android Camera框架

总体介绍 Android Camera 框架从整体上看是一个 client/service 的架构, 有两个进程: client 进程,可以看成是 AP 端,主要包括 JAVA 代码与一些 native c/c++代码; service 进 程,属于服务端,是 native c/c++代码,主要负责和 linux kernel 中的 camera driver 交互,搜集 li…

【Pytorch神经网络实战案例】17 带W散度的WGAN-div模型生成Fashon-MNST模拟数据

1 WGAN-div 简介 W散度的损失函数GAN-dv模型使用了W散度来替换W距离的计算方式,将原有的真假样本采样操作换为基于分布层面的计算。 2 代码实现 在WGAN-gp的基础上稍加改动来实现,重写损失函数的实现。 2.1 代码实战:引入模块并载入样本-…

【Pytorch神经网络理论篇】 24 神经网络中散度的应用:F散度+f-GAN的实现+互信息神经估计+GAN模型训练技巧

同学你好!本文章于2021年末编写,获得广泛的好评! 故在2022年末对本系列进行填充与更新,欢迎大家订阅最新的专栏,获取基于Pytorch1.10版本的理论代码(2023版)实现, Pytorch深度学习理论篇(2023版)目录地址…

【Pytorch神经网络实战案例】18 最大化深度互信信息模型DIM实现搜索最相关与最不相关的图片

图片搜索器分为图片的特征提取和匹配两部分,其中图片的特征提取是关键。将使用一种基于无监督模型的提取特征的方法实现特征提取,即最大化深度互信息(DeepInfoMax,DIM)方法。 1 最大深度互信信息模型DIM简介 在DIM模型…

【Pytorch神经网络实战案例】19 神经网络实现估计互信息的功能

1 案例说明(实现MINE正方法的功能) 定义两组具有不同分布的模拟数据,使用神经网络的MINE的方法计算两个数据分布之间的互信息 2 代码编写 2.1 代码实战:准备样本数据 import torch import torch.nn as nn import torch.nn.fun…

爬虫实战学习笔记_6 网络请求request模块:基本请求方式+设置请求头+获取cookies+模拟登陆+会话请求+验证请求+上传文件+超时异常

1 requests requests是Python中实现HTTP请求的一种方式,requests是第三方模块,该模块在实现HTTP请求时要比urlib、urllib3模块简化很多,操作更加人性化。 2 基本请求方式 由于requests模块为第三方模块,所以在使用requests模块时…

201521123044 《Java程序设计》第01周学习总结

1.本章学习总结 你对于本章知识的学习总结 1.了解了Java的发展史。 2.学习了什么是JVM,区分JRE与JDK,下载JDK。 3.从C语言的.c 到C的 .cpp再到Java的.java,每种语言编译程序各有不同,却有相似之处。 2. 书面作业 **Q1.为什么java程序可以跨平台运行&…

将一个java工程导入到myeclipse应该注意的地方

[原文]http://www.cnblogs.com/ht2411/articles/5471130.html 1. 最好新建一个myeclipse工程,然后从从文件系统导入该工程文件。 原因:很多项目可能是eclipse创建的,或者myeclipse的版本不一致,这样可能导致很多奇怪的现象&#x…

【Pytorch神经网络理论篇】 25 基于谱域图神经网络GNN:基础知识+GNN功能+矩阵基础+图卷积神经网络+拉普拉斯矩阵

同学你好!本文章于2021年末编写,获得广泛的好评! 故在2022年末对本系列进行填充与更新,欢迎大家订阅最新的专栏,获取基于Pytorch1.10版本的理论代码(2023版)实现, Pytorch深度学习理论篇(2023版)目录地址…

【Pytorch神经网络基础理论篇】 07 线性回归 + 基础优化算法

同学你好!本文章于2021年末编写,获得广泛的好评! 故在2022年末对本系列进行填充与更新,欢迎大家订阅最新的专栏,获取基于Pytorch1.10版本的理论代码(2023版)实现, Pytorch深度学习理论篇(2023版)目录地址…

浅谈命令查询职责分离(CQRS)模式

在常用的三层架构中,通常都是通过数据访问层来修改或者查询数据,一般修改和查询使用的是相同的实体。在一些业务逻辑简单的系统中可能没有什么问题,但是随着系统逻辑变得复杂,用户增多,这种设计就会出现一些性能问题。…

【Pytorch神经网络实战案例】20 基于Cora数据集实现图卷积神经网络论文分类

1 案例说明(图卷积神经网络) CORA数据集里面含有每一篇论文的关键词以及分类信息,同时还有论文间互相引用的信息。搭建AI模型,对数据集中的论文信息进行分析,根据已有论文的分类特征,从而预测出未知分类的…

mybatis基础学习3---特殊sql语句(备忘)

1: 2: 3:resultMap的用法 转载于:https://www.cnblogs.com/kaiwen/p/6486283.html