import torch
lin = torch.nn.Linear(800,1600)
torch.nn.init.xavier_uniform_(lin.weight)
print(lin.weight.min()) # ได้ tensor(-0.0500, grad_fn<=MinBackward1>)
lin = torch.nn.Linear(577,100)
torch.nn.init.kaiming_uniform_(lin.weight,a=0.2)
print(lin.weight.max()) # ได้ tensor(0.1000, grad_fn<=MaxBackward1>)
ha_entropy = torch.nn.CrossEntropyLoss()
class Prasat(torch.nn.Sequential):
def __init__(self,m,eta=0.01,a=0):
super(Prasat,self).__init__()
nm = len(m)
for i in range(1,nm):
lin = torch.nn.Linear(m[i-1],m[i])
torch.nn.init.kaiming_normal_(lin.weight,a) # ค่าตั้งต้นน้ำหนัแจกแจงปกติแบบเหอ ไข่หมิง
lin.bias.data.fill_(0) # ไบแอสให้ตั้งต้นเป็น 0
self.add_module('lin%d'%i,lin)
if(i<nm-1): # ใส่ฟังก์ชันกระตุ้นยกเว้นชั้นสุดท้าย
if(a): # ถ้า a>0 ใช้ LReLU
self.add_module('lrelu%d'%i,torch.nn.LeakyReLU(a))
else: # ถ้า a เป็น 0 ใช้ ReLU ธรรมดา
self.add_module('relu%d'%i,torch.nn.ReLU())
self.opt = torch.optim.Adam(self.parameters(),lr=eta)
def rianru(self,X,z,n_thamsam):
X = torch.Tensor(X)
z = torch.LongTensor(z)
for o in range(n_thamsam):
a = self(X)
J = ha_entropy(a,z)
J.backward()
self.opt.step()
self.opt.zero_grad()
def thamnai(self,X):
X = torch.Tensor(X)
return self(X).argmax(1).numpy()
import numpy as np
import matplotlib.pyplot as plt
z = np.arange(5).repeat(50)
r = np.random.normal(z+1,0.28)
t = np.random.uniform(-np.pi,0,250)
x = r*np.cos(t)
y = r*np.sin(t)
X = np.array([x,y]).T
prasat = Prasat([2,32,32,32,5],eta=0.1,a=0.2) # โครงข่าย 4 ชั้น โดยใช้ LReLU ที่มีความชันส่วนลบเป็น 0.2
prasat.rianru(X,z,100)
mx,my = np.meshgrid(np.linspace(x.min(),x.max(),200),np.linspace(y.min(),y.max(),200))
mX = np.array([mx.ravel(),my.ravel()]).T
mz = prasat.thamnai(mX)
mz = mz.reshape(200,200)
plt.xlim(x.min(),x.max())
plt.ylim(y.min(),y.max())
plt.scatter(x,y,100,c=z,marker='*',edgecolor='k',cmap='Spectral')
plt.contourf(mx,my,mz,alpha=0.2,cmap='Spectral')
plt.show()
ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ