日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/7/5 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Pytorch神经网络实战案例】19 神经网络实现估计互信息的功能 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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 神经网络实现估计互信息的功能的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。