基于tensorflow的RBF神经网络案例
1 前言
在使用RBF神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)函數(shù)逼近中,筆者介紹了使用 Matlab 訓(xùn)練RBF神經(jīng)網(wǎng)絡(luò)。本博客將介紹使用 tensorflow 訓(xùn)練RBF神經(jīng)網(wǎng)絡(luò)。代碼資源見(jiàn):RBF案例(更新版)
這幾天,筆者在尋找 tensorflow 中 RBF 官方案例,沒(méi)找到,又看了一些博客,發(fā)現(xiàn)這些博客或不能逼近多元函數(shù),或不能批量訓(xùn)練。于是,自己手撕了一下代碼。
RBF神經(jīng)網(wǎng)絡(luò)中需要求解的參數(shù)有4個(gè):基函數(shù)的中心和方差、隱含層到輸出層的權(quán)值和偏值。
RBF 神經(jīng)網(wǎng)絡(luò)的關(guān)鍵在于中心的選取,一般有如下三種方法:
- 直接計(jì)算法:直接通過(guò)先驗(yàn)經(jīng)驗(yàn)固定中心,并計(jì)算方差,再通過(guò)有監(jiān)督學(xué)習(xí)得到其他參數(shù)
- 自組織學(xué)習(xí)法:先通過(guò)k-means等聚類(lèi)算法求出中心(無(wú)監(jiān)督學(xué)習(xí)),并計(jì)算方差,再通過(guò)有監(jiān)督學(xué)習(xí)得到其他參數(shù)
- 有監(jiān)督學(xué)習(xí)法:直接通過(guò)有監(jiān)督學(xué)習(xí)求出所有參數(shù)
在直接計(jì)算法和自組織學(xué)習(xí)法中,方差的計(jì)算公式如下:
其中 Cmax 表示 h?個(gè)中心間的最大距離。
本博客主要介紹后兩種中心計(jì)算方法實(shí)現(xiàn) RBF 神經(jīng)網(wǎng)絡(luò)。?
筆者工作空間如下:
2? RBF神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)
2.1 自組織學(xué)習(xí)選取RBF中心
RBF_kmeans.py
import tensorflow as tf import numpy as np from sklearn.cluster import KMeansclass RBF:#初始化學(xué)習(xí)率、學(xué)習(xí)步數(shù)def __init__(self,learning_rate=0.002,step_num=10001,hidden_size=10):self.learning_rate=learning_rateself.step_num=step_numself.hidden_size=hidden_size#使用 k-means 獲取聚類(lèi)中心、標(biāo)準(zhǔn)差def getC_S(self,x,class_num):estimator=KMeans(n_clusters=class_num,max_iter=10000) #構(gòu)造聚類(lèi)器estimator.fit(x) #聚類(lèi)c=estimator.cluster_centers_n=len(c)s=0;for i in range(n):j=i+1while j<n:t=np.sum((c[i]-c[j])**2)s=max(s,t)j=j+1s=np.sqrt(s)/np.sqrt(2*n)return c,s#高斯核函數(shù)(c為中心,s為標(biāo)準(zhǔn)差)def kernel(self,x,c,s):x1=tf.tile(x,[1,self.hidden_size]) #將x水平復(fù)制 hidden次x2=tf.reshape(x1,[-1,self.hidden_size,self.feature])dist=tf.reduce_sum((x2-c)**2,2)return tf.exp(-dist/(2*s**2))#訓(xùn)練RBF神經(jīng)網(wǎng)絡(luò)def train(self,x,y):self.feature=np.shape(x)[1] #輸入值的特征數(shù)self.c,self.s=self.getC_S(x,self.hidden_size) #獲取聚類(lèi)中心、標(biāo)準(zhǔn)差x_=tf.placeholder(tf.float32,[None,self.feature]) #定義placeholdery_=tf.placeholder(tf.float32,[None,1]) #定義placeholder#定義徑向基層z=self.kernel(x_,self.c,self.s) #定義輸出層w=tf.Variable(tf.random_normal([self.hidden_size,1]))b=tf.Variable(tf.zeros([1]))yf=tf.matmul(z,w)+bloss=tf.reduce_mean(tf.square(y_-yf))#二次代價(jià)函數(shù)optimizer=tf.train.AdamOptimizer(self.learning_rate) #Adam優(yōu)化器 train=optimizer.minimize(loss) #最小化代價(jià)函數(shù)init=tf.global_variables_initializer() #變量初始化with tf.Session() as sess:sess.run(init)for epoch in range(self.step_num):sess.run(train,feed_dict={x_:x,y_:y})if epoch>0 and epoch%500==0:mse=sess.run(loss,feed_dict={x_:x,y_:y})print(epoch,mse)self.w,self.b=sess.run([w,b],feed_dict={x_:x,y_:y})def kernel2(self,x,c,s): #預(yù)測(cè)時(shí)使用x1=np.tile(x,[1,self.hidden_size]) #將x水平復(fù)制 hidden次x2=np.reshape(x1,[-1,self.hidden_size,self.feature])dist=np.sum((x2-c)**2,2)return np.exp(-dist/(2*s**2))def predict(self,x):z=self.kernel2(x,self.c,self.s)pre=np.matmul(z,self.w)+self.breturn pre2.2 有監(jiān)督學(xué)習(xí)選取RBF中心
RBF_Supervised.py
import numpy as np import tensorflow as tfclass RBF:#初始化學(xué)習(xí)率、學(xué)習(xí)步數(shù)def __init__(self,learning_rate=0.002,step_num=10001,hidden_size=10):self.learning_rate=learning_rateself.step_num=step_numself.hidden_size=hidden_size#高斯核函數(shù)(c為中心,s為標(biāo)準(zhǔn)差)def kernel(self,x,c,s): #訓(xùn)練時(shí)使用x1=tf.tile(x,[1,self.hidden_size]) #將x水平復(fù)制 hidden次x2=tf.reshape(x1,[-1,self.hidden_size,self.feature])dist=tf.reduce_sum((x2-c)**2,2)return tf.exp(-dist/(2*s**2))#訓(xùn)練RBF神經(jīng)網(wǎng)絡(luò)def train(self,x,y):self.feature=np.shape(x)[1] #輸入值的特征數(shù)x_=tf.placeholder(tf.float32,[None,self.feature]) #定義placeholdery_=tf.placeholder(tf.float32,[None,1]) #定義placeholder#定義徑向基層c=tf.Variable(tf.random_normal([self.hidden_size,self.feature]))s=tf.Variable(tf.random_normal([self.hidden_size]))z=self.kernel(x_,c,s)#定義輸出層w=tf.Variable(tf.random_normal([self.hidden_size,1]))b=tf.Variable(tf.zeros([1]))yf=tf.matmul(z,w)+bloss=tf.reduce_mean(tf.square(y_-yf))#二次代價(jià)函數(shù)optimizer=tf.train.AdamOptimizer(self.learning_rate) #Adam優(yōu)化器train=optimizer.minimize(loss) #最小化代價(jià)函數(shù)init=tf.global_variables_initializer() #變量初始化with tf.Session() as sess:sess.run(init)for epoch in range(self.step_num):sess.run(train,feed_dict={x_:x,y_:y})if epoch>0 and epoch%500==0:mse=sess.run(loss,feed_dict={x_:x,y_:y})print(epoch,mse)self.c,self.s,self.w,self.b=sess.run([c,s,w,b],feed_dict={x_:x,y_:y})def kernel2(self,x,c,s): #預(yù)測(cè)時(shí)使用x1=np.tile(x,[1,self.hidden_size]) #將x水平復(fù)制 hidden次x2=np.reshape(x1,[-1,self.hidden_size,self.feature])dist=np.sum((x2-c)**2,2)return np.exp(-dist/(2*s**2))def predict(self,x):z=self.kernel2(x,self.c,self.s)pre=np.matmul(z,self.w)+self.breturn pre3 案例
3.1 一元函數(shù)逼近
待逼近函數(shù):
(1)自組織學(xué)習(xí)選取RBF中心
test_kmeans.py
import numpy as np import matplotlib.pyplot as plt from RBF_kmeans import RBF#待逼近的函數(shù) def fun(x):return x*x+2*x*np.sin(x)-np.exp(-x)/10#生成樣本 def generate_samples():n=150 #樣本點(diǎn)個(gè)數(shù)wideX=0.03 #橫軸噪聲的寬度wideY=0.5 #縱軸噪聲寬度t=np.linspace(-5,5,n).reshape(-1,1) #橫軸理想值u=fun(t) #縱軸理想值noisyX=np.random.uniform(-wideX,wideX,n).reshape(n,-1) #橫軸噪聲noisyY=np.random.uniform(-wideY,wideY,n).reshape(n,-1) #縱軸噪聲x=t+noisyX #橫軸實(shí)際值y=u+noisyY #縱軸實(shí)際值 return t,u,x,yt,u,x,y=generate_samples() rbf=RBF(0.003,20001,4) #學(xué)習(xí)率 rbf.train(x,y) pre=rbf.predict(t) plt.plot(x,y,'+') plt.plot(t,u) plt.plot(t,pre) plt.legend(['dot','real','pre'],loc='upper left') 自組織學(xué)習(xí)選取RBF中心?(2)有監(jiān)督學(xué)習(xí)選取RBF中心
test_Supervised.py
import numpy as np import matplotlib.pyplot as plt from RBF_Supervised import RBF#待逼近的函數(shù) def fun(x):return x*x+2*x*np.sin(x)-np.exp(-x)/10#生成樣本 def generate_samples():n=150 #樣本點(diǎn)個(gè)數(shù)wideX=0.03 #橫軸噪聲的寬度wideY=0.5 #縱軸噪聲寬度t=np.linspace(-5,5,n).reshape(-1,1) #橫軸理想值u=fun(t) #縱軸理想值noisyX=np.random.uniform(-wideX,wideX,n).reshape(n,-1) #橫軸噪聲noisyY=np.random.uniform(-wideY,wideY,n).reshape(n,-1) #縱軸噪聲x=t+noisyX #橫軸實(shí)際值y=u+noisyY #縱軸實(shí)際值return t,u,x,yt,u,x,y=generate_samples() rbf=RBF(0.003,20001,4) #學(xué)習(xí)率 rbf.train(x,y) pre=rbf.predict(t) plt.plot(x,y,'+') plt.plot(t,u) plt.plot(t,pre) plt.legend(['dot','real','pre'],loc='upper left') 有監(jiān)督學(xué)習(xí)選取RBF中心3.2 二元函數(shù)逼近
待逼近函數(shù):
(1)自組織學(xué)習(xí)選取RBF中心
test_kmeans2.py
import numpy as np from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt from RBF_kmeans import RBF#待逼近的函數(shù) def fun(t):x1=(t+0.5*np.pi)*np.sin(t+0.5*np.pi)x2=(t+0.5*np.pi)*np.cos(t+0.5*np.pi)y=1.5*tx=np.append(x1,x2,1)return x,y#生成樣本 def generate_samples():n=200 #樣本點(diǎn)個(gè)數(shù)wideX=0.6 #水平方向噪聲的寬度wideY=1 #縱軸噪聲寬度t=np.linspace(0,10*np.pi,n).reshape(-1,1) #橫軸理想值u,v=fun(t) #縱軸理想值noisyX=np.random.uniform(-wideX,wideX,u.shape).reshape(n,-1) #水平方向噪聲noisyY=np.random.uniform(-wideY,wideY,n).reshape(n,-1) #縱軸噪聲x=u+noisyX #橫軸實(shí)際值y=v+noisyY #縱軸實(shí)際值return u,v,x,yu,v,x,y=generate_samples() rbf=RBF(0.02,20001,10) #學(xué)習(xí)率 rbf.train(x,y) pre=rbf.predict(u)ax=plt.figure().gca(projection='3d') ax.plot(x[:,0],x[:,1],y[:,0],'+') ax.plot(u[:,0],u[:,1],v[:,0]) ax.plot(u[:,0],u[:,1],pre[:,0]) plt.legend(['dot','real','pre'],loc='upper left') plt.show() 自組織學(xué)習(xí)選取RBF中心?
(2)有監(jiān)督學(xué)習(xí)選取RBF中心
test_Supervised2.py
import numpy as np from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt from RBF_Supervised import RBF#待逼近的函數(shù) def fun(t):x1=(t+0.5*np.pi)*np.sin(t+0.5*np.pi)x2=(t+0.5*np.pi)*np.cos(t+0.5*np.pi)y=1.5*tx=np.append(x1,x2,1)return x,y#生成樣本 def generate_samples():n=200 #樣本點(diǎn)個(gè)數(shù)wideX=0.6 #水平方向噪聲的寬度wideY=1 #縱軸噪聲寬度t=np.linspace(0,10*np.pi,n).reshape(-1,1) #橫軸理想值u,v=fun(t) #縱軸理想值noisyX=np.random.uniform(-wideX,wideX,u.shape).reshape(n,-1) #水平方向噪聲noisyY=np.random.uniform(-wideY,wideY,n).reshape(n,-1) #縱軸噪聲x=u+noisyX #橫軸實(shí)際值y=v+noisyY #縱軸實(shí)際值return u,v,x,yu,v,x,y=generate_samples() rbf=RBF(0.02,20001,10) #學(xué)習(xí)率 rbf.train(x,y) pre=rbf.predict(u)ax=plt.figure().gca(projection='3d') ax.plot(x[:,0],x[:,1],y[:,0],'+') ax.plot(u[:,0],u[:,1],v[:,0]) ax.plot(u[:,0],u[:,1],pre[:,0]) plt.legend(['dot','real','pre'],loc='upper left') plt.show()?
有監(jiān)督學(xué)習(xí)選取RBF中心?通過(guò)實(shí)驗(yàn)可以看到:無(wú)論是一元函數(shù)逼近還是二元函數(shù)逼近,在隱藏層神經(jīng)元個(gè)數(shù)、學(xué)習(xí)率、學(xué)習(xí)步數(shù)相同的情況下,有監(jiān)督學(xué)習(xí)法都比自組織學(xué)習(xí)法效果好。
總結(jié)
以上是生活随笔為你收集整理的基于tensorflow的RBF神经网络案例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: matlab无法显示图片
- 下一篇: [绍棠] SwiftyJSON的使用详解
