1 案例说明(实现MINE正方法的功能)

定义两组具有不同分布的模拟数据,使用神经网络的MINE的方法计算两个数据分布之间的互信息

2 代码编写

2.1 代码实战:准备样本数据

import torch
import torch.nn as nn
import torch.nn.functional as F
import numpy as np
from tqdm import tqdm
import matplotlib.pyplot as plt
import os
os.environ['KMP_DUPLICATE_LIB_OK'] = 'True'  # 可能是由于是MacOS系统的原因### 本例实现了用神经网络计算互信息的功能。这是一个简单的例子,目的在于帮助读者更好地理MNE方法。# 1.1 准备样本数据:定义两个数据生成函数gen_x()、gen_y()。函数gen_x()用于生成1或-1,函数gen_y()在此基础上为其再加上一个符合高斯分布的随机值。
# 生成模拟数据
data_size = 1000
def gen_x():return np.sign(np.random.normal(0.0,1.0,[data_size,1]))def gen_y(x):return x + np.random.normal(0.0,0.5,[data_size,1])def show_data():x_sample = gen_x()y_sample = gen_y(x_sample)plt.scatter(np.arange(len(x_sample)), x_sample, s=10,c='b',marker='o')plt.scatter(np.arange(len(y_sample)), y_sample, s=10,c='y',marker='o')plt.show() # 两条横线部分是样本数据x中的点,其他部分是样本数据y。

2.2 代码实战:定义神经网络模型

# 1.2 定义神经网络模型
class Net(nn.Module):def __init__(self):super(Net, self).__init__()self.fc1 = nn.Linear(1,10)self.fc2 = nn.Linear(1,10)self.fc3 = nn.Linear(10,1)def forward(self,x,y):h1 = F.relu(self.fc1(x) + self.fc2(y))h2 = self.fc3(h1)return h2

2.3 代码实战:利用MINE方法训练模型并输出结果

# 1.3 利用MINE方法训练模型并输出结果
if __name__ == '__main__':show_data()# 显示数据model = Net() # 实例化模型optimizer = torch.optim.Adam(model.parameters(), lr=0.01) # 使用Adam优化器并设置学习率为0.01n_epoch = 500plot_loss = []# MiNE方法主要用于模型的训练阶段for epoch in tqdm(range(n_epoch)):x_sample = gen_x() # 调用gen_x()函数生成样本x_Sample。X_sample代表X的边缘分布P(X)y_sample = gen_y(x_sample) # 将生成的×_sample样本放到gen_x()函数中,生成样本y_sample。y_sample代表条件分布P(Y|X)。y_shuffle = np.random.permutation(y_sample) # )将 y_sample按照批次维度打乱顺序得到y_shuffle,y_shuffle是Y的经验分布,近似于Y的边缘分布P(Y)。# 转化为张量x_sample = torch.from_numpy(x_sample).type(torch.FloatTensor)y_sample = torch.from_numpy(y_sample).type(torch.FloatTensor)y_shuffle = torch.from_numpy(y_shuffle).type(torch.FloatTensor)model.zero_grad()pred_xy = model(x_sample, y_sample)  # 式(8-49)中的第一项联合分布的期望:将x_sample和y_sample放到模型中,得到联合概率(P(X,Y)=P(Y|X)P(X))关于神经网络的期望值pred_xy。pred_x_y = model(x_sample, y_shuffle)  # 式(8-49)中的第二项边缘分布的期望:将x_sample和y_shuffle放到模型中,得到边缘概率关于神经网络的期望值pred_x_y 。ret = torch.mean(pred_xy) - torch.log(torch.mean(torch.exp(pred_x_y))) # 将pred_xy和pred_x_y代入式(8-49)中,得到互信息ret。loss = - ret  # 最大化互信息:在训练过程中,因为需要将模型权重向着互信息最大的方向优化,所以对互信息取反,得到最终的loss值。plot_loss.append(loss.data)  # 收集损失值loss.backward()  # 反向传播:在得到loss值之后,便可以进行反向传播并调用优化器进行模型优化。optimizer.step()  # 调用优化器plot_y = np.array(plot_loss).reshape(-1, )  # 可视化plt.plot(np.arange(len(plot_loss)), -plot_y, 'r') # 直接将|oss值取反,得到最大化互信息的值。plt.show()

3 代码总览

import torch
import torch.nn as nn
import torch.nn.functional as F
import numpy as np
from tqdm import tqdm
import matplotlib.pyplot as plt
import os
os.environ['KMP_DUPLICATE_LIB_OK'] = 'True'  # 可能是由于是MacOS系统的原因### 本例实现了用神经网络计算互信息的功能。这是一个简单的例子,目的在于帮助读者更好地理MNE方法。# 1.1 准备样本数据:定义两个数据生成函数gen_x()、gen_y()。函数gen_x()用于生成1或-1,函数gen_y()在此基础上为其再加上一个符合高斯分布的随机值。
# 生成模拟数据
data_size = 1000
def gen_x():return np.sign(np.random.normal(0.0,1.0,[data_size,1]))def gen_y(x):return x + np.random.normal(0.0,0.5,[data_size,1])def show_data():x_sample = gen_x()y_sample = gen_y(x_sample)plt.scatter(np.arange(len(x_sample)), x_sample, s=10,c='b',marker='o')plt.scatter(np.arange(len(y_sample)), y_sample, s=10,c='y',marker='o')plt.show() # 两条横线部分是样本数据x中的点,其他部分是样本数据y。# 1.2 定义神经网络模型
class Net(nn.Module):def __init__(self):super(Net, self).__init__()self.fc1 = nn.Linear(1,10)self.fc2 = nn.Linear(1,10)self.fc3 = nn.Linear(10,1)def forward(self,x,y):h1 = F.relu(self.fc1(x) + self.fc2(y))h2 = self.fc3(h1)return h2# 1.3 利用MINE方法训练模型并输出结果
if __name__ == '__main__':show_data()# 显示数据model = Net() # 实例化模型optimizer = torch.optim.Adam(model.parameters(), lr=0.01) # 使用Adam优化器并设置学习率为0.01n_epoch = 500plot_loss = []# MiNE方法主要用于模型的训练阶段for epoch in tqdm(range(n_epoch)):x_sample = gen_x() # 调用gen_x()函数生成样本x_Sample。X_sample代表X的边缘分布P(X)y_sample = gen_y(x_sample) # 将生成的×_sample样本放到gen_x()函数中,生成样本y_sample。y_sample代表条件分布P(Y|X)。y_shuffle = np.random.permutation(y_sample) # )将 y_sample按照批次维度打乱顺序得到y_shuffle,y_shuffle是Y的经验分布,近似于Y的边缘分布P(Y)。# 转化为张量x_sample = torch.from_numpy(x_sample).type(torch.FloatTensor)y_sample = torch.from_numpy(y_sample).type(torch.FloatTensor)y_shuffle = torch.from_numpy(y_shuffle).type(torch.FloatTensor)model.zero_grad()pred_xy = model(x_sample, y_sample)  # 式(8-49)中的第一项联合分布的期望:将x_sample和y_sample放到模型中,得到联合概率(P(X,Y)=P(Y|X)P(X))关于神经网络的期望值pred_xy。pred_x_y = model(x_sample, y_shuffle)  # 式(8-49)中的第二项边缘分布的期望:将x_sample和y_shuffle放到模型中,得到边缘概率关于神经网络的期望值pred_x_y 。ret = torch.mean(pred_xy) - torch.log(torch.mean(torch.exp(pred_x_y))) # 将pred_xy和pred_x_y代入式(8-49)中,得到互信息ret。loss = - ret  # 最大化互信息:在训练过程中,因为需要将模型权重向着互信息最大的方向优化,所以对互信息取反,得到最终的loss值。plot_loss.append(loss.data)  # 收集损失值loss.backward()  # 反向传播:在得到loss值之后,便可以进行反向传播并调用优化器进行模型优化。optimizer.step()  # 调用优化器plot_y = np.array(plot_loss).reshape(-1, )  # 可视化plt.plot(np.arange(len(plot_loss)), -plot_y, 'r') # 直接将|oss值取反,得到最大化互信息的值。plt.show()

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

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

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

  2. 【Pytorch神经网络实战案例】21 基于Cora数据集实现Multi_Sample Dropout图卷积网络模型的论文分类

    Multi-sample Dropout是Dropout的一个变种方法,该方法比普通Dropout的泛化能力更好,同时又可以缩短模型的训练时间.XMuli-sampleDropout还可以降低训练集和 ...

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

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

  4. 【Pytorch神经网络实战案例】40 TextCNN模型分析IMDB数据集评论的积极与消极

    卷积神经网络不仅在图像视觉领域有很好的效果,而且在基于文本的NLP领域也有很好的效果.TextCN如模型是卷积神经网络用于文本处理方面的一个模型. 在TextCNN模型中,通过多分支卷积技术实现对文本 ...

  5. 【Pytorch神经网络实战案例】24 基于迁移学习识别多种鸟类(CUB-200数据集)

    1 迁移学习 在实际开发中,常会使用迁移学习将预训练模型中的特征提取能力转移到自己的模型中. 1.1 迁移学习定义 迁移学习指将在一个任务上训练完成的模型进行简单的修改,再用另一个任务的数据继续训练, ...

  6. 【Pytorch神经网络实战案例】22 基于Cora数据集实现图注意力神经网络GAT的论文分类

    注意力机制的特点是,它的输入向量长度可变,通过将注意力集中在最相关的部分来做出决定.注意力机制结合RNN或者CNN的方法. 1 实战描述 [主要目的:将注意力机制用在图神经网络中,完成图注意力神经网络 ...

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

    1 WGAN-gp模型生成模拟数据案例说明 使用WGAN-gp模型模拟Fashion-MNIST数据的生成,会使用到WGAN-gp模型.深度卷积GAN(DeepConvolutional GAN,DC ...

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

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

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

    1 变分自编码神经网络生成模拟数据案例说明 变分自编码里面真正的公式只有一个KL散度. 1.1 变分自编码神经网络模型介绍 主要由以下三个部分构成: 1.1.1 编码器 由两层全连接神经网络组成,第一 ...

最新文章

  1. python3 pyinstaller 打包后 程序会显示两个进程 解决方法
  2. Py之huaweicloud-sdk-python:huaweicloud-sdk-python的简介、安装、使用方法之详细攻略
  3. 初学者必看的文章:在VM12中安装 RedHat RHEL7.2  系统的详细步骤:看我如何操纵RHEL系统...
  4. azkaban mysql参数_azkaban参数详解
  5. JS开发引用HTML DOM的location和document对象
  6. python处理地震sac数据_地震数据SAC格式
  7. 正确安装vray5 for 3dsMax步骤
  8. html表格的行合并代码,HTML代码制作的表格合并单元格教程
  9. vxlan报文 wireshark_VXLAN原理_ISIS、BGP、MPLS v隧道、QOS 技术精讲(肖哥)_华为认证视频-51CTO学院...
  10. 社区购物、社区买菜小程序源码
  11. c++中“箭头(-)”和“点号(.)”操作符的区别
  12. (王道考研计算机网络)第一章计算机网络体系结构-第一节计算机网络概述1:计网的概念、组成、功能和分类
  13. 手机安装ubuntu
  14. 第二十八篇 网页实战之静态网页爬取,四大案例,小说,书,图片等抓取操作
  15. 字节码插桩框架ASM(一)
  16. 分布式系统设计理论之一致性哈希
  17. python识别发票二维码_Python 实现二维码生成和识别
  18. 【魔数 bug + 求助】挖槽,MP4 魔数变了?如何解决无法通过魔数判断 MP4 文件类型?
  19. cesium实现正多边形动态扩散墙效果
  20. STM32笔记之 NVIC(嵌套向量中断控制器)

热门文章

  1. 两个class写在同一个java文件中
  2. 如何使用log.debug()
  3. redis服务器端和客户端启动
  4. mysql php7安装配置_centos7无网络下安装部署php7.1.33+mysql5.7.28+apache2.4.6-Go语言中文社区...
  5. c语言中- gt he,C语言中deta,fabs,lt;stdlib.hgt;,lt;stdio.hgt;分别是什么意思
  6. CentOS7 安装或迁移 wordpress(完整迁移)
  7. 面向对象:实例化的对象调用类方法 db.Column()
  8. 解决:Please specify a different SDK name--PyCharm报错
  9. pvrect r语言 聚类_R语言实现KEGG通路富集可视化
  10. 数字图像处理:各种变换滤波和噪声的类型和用途总结