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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python rbf神经网络_RBF神经网络是什么?

發布時間:2023/12/14 python 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python rbf神经网络_RBF神经网络是什么? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

RBF是啥?

RBF全稱Radial Basis Function,中文名稱“徑向基函數”,辣么RBF神經網絡就是徑向基函數神經網絡了。

是不是想到了一種核函數就叫RBF?沒錯,就是這貨:

衡量某個點到中心的距離

RBF神經網絡是啥?

說白了就是以RBF作為激活函數的神經網絡,不過與傳統的BP神經網絡在前向傳播有所區別:拓撲結構:如何計算各單元值:

隱單元計算方法如下

輸出層的計算不用說了,和傳統方法一樣,WZ即可。如何更新參數(包含中心向量C,寬度向量D,權重W)

把大概流程走一波:

① 初始化權重

,網上很多方法,什么fan-in,fan-out, 或者caffe里面的一堆方法

②初始化中心

意義:使較弱的輸入信息在較小的中心附近產生較強的響應,這樣可以不失一般性。

③初始化寬度向量

意義:使每個隱含層神經元更容易實現對局部信息的感受能力,有利于提高RBF神經網絡的局部響應能力。《模式識別與智能計算》里面沒有平方,但是有平方更加合理。

計算隱單元輸出值:計算輸出層值

損失

梯度下降,更新參數

————————————————————————————————————

總結:所以發現其實就是在計算隱層單元的時候用了RBF激活函數,這個RBF涉及中心和寬度兩個參數,其它的和BP區別不是特別大。

意義?應該就是中心和寬度存在的意義吧,RBF函數的存在使得網絡結構具有局部響應的特性。

具體可移步個人博客看看,而且matlab中有例子可以跑一波看看,有興趣還能研究一波源碼:人工神經網絡--徑向基函數(RBF)神經網絡 - 風翼冰舟的博客 - CSDN博客?blog.csdn.net基于RBF簡單的matlab手寫識別 - 風翼冰舟的博客 - CSDN博客?blog.csdn.net

————————————————————————————————————

更新日志:2020-11-2

好像蠻多人看的,我找了一份`keras`代碼實現RBF層,并且測試了一波,源代碼戳這里,我的測試可以直接看下面:

引入包

from keras.initializers import Initializer

from sklearn.cluster import KMeans

from keras import backend as K

from keras.engine.topology import Layer

from keras.initializers import RandomUniform, Initializer, Constant

import numpy as np

from keras.models import Sequential

from keras.layers import Dense

from keras.losses import binary_crossentropy

from keras.optimizers import Adam

構建`kmeans`層:

# kmeans layer

class InitCentersKMeans(Initializer):

""" Initializer for initialization of centers of RBF network

by clustering the given data set.

# Arguments

X: matrix, dataset

"""

def __init__(self, X, max_iter=100):

self.X = X

self.max_iter = max_iter

def __call__(self, shape, dtype=None):

assert shape[1] == self.X.shape[1]

n_centers = shape[0]

km = KMeans(n_clusters=n_centers, max_iter=self.max_iter, verbose=0)

km.fit(self.X)

return km.cluster_centers_

構建RBF層:

## RBF layer

class RBFLayer(Layer):

def __init__(self, output_dim, initializer=None, betas=1.0, **kwargs):

self.output_dim = output_dim

self.init_betas = betas

if not initializer:

self.initializer = RandomUniform(0.0, 1.0)

else:

self.initializer = initializer

super(RBFLayer, self).__init__(**kwargs)

def build(self, input_shape):

self.centers = self.add_weight(name='centers',

shape=(self.output_dim, input_shape[1]),

initializer=self.initializer,

trainable=True)

self.betas = self.add_weight(name='betas',

shape=(self.output_dim,),

initializer=Constant(

value=self.init_betas),

trainable=True)

super(RBFLayer, self).build(input_shape)

def call(self, x):

C = K.expand_dims(self.centers)

H = K.transpose(C-K.transpose(x))

return K.exp(-self.betas * K.sum(H**2, axis=1))

def compute_output_shape(self, input_shape):

return (input_shape[0], self.output_dim)

def get_config(self):

# have to define get_config to be able to use model_from_json

config = {

'output_dim': self.output_dim

}

base_config = super(RBFLayer, self).get_config()

return dict(list(base_config.items()) + list(config.items()))

---------- 更新日志-------------

感覺按照理論來講,上面的代碼寬度向量好像沒有加進來的樣子,我自己改了一下:

def call(self, x):

C = K.expand_dims(self.centers)

XC = K.transpose(K.transpose(x)-C)

D = K.expand_dims(K.sqrt(K.mean(XC**2,axis=0)),0)

H = XC/D

return K.exp(-self.betas * K.sum(H**2, axis=1))

構建測試數據:

歸一化函數:

def maxminnorm(array):

maxcols=array.max(axis=0)

mincols=array.min(axis=0)

data_shape = array.shape

data_rows = data_shape[0]

data_cols = data_shape[1]

t=np.empty((data_rows,data_cols))

for i in range(data_cols):

t[:,i]=(array[:,i]-mincols[i])/(maxcols[i]-mincols[i])

return t

訓練集:

## create dataset

# reference https://zhuanlan.zhihu.com/p/36982945

def test_data1(sample_number = 1000):

#隨機從高斯分布中生成兩個數據集

mean0=[2,7]

cov=np.mat([[1,0],[0,2]])

data1=np.random.multivariate_normal(mean0,cov,sample_number)

mean1=[8,3]

cov=np.mat([[1,0],[0,2]])

data2=np.random.multivariate_normal(mean1,cov,sample_number)

y1 = np.zeros((sample_number,1))#第一類,標簽為0

y2 = np.ones((sample_number,1))#第二類類,標簽為1

train_data = np.vstack((data1,data2))

train_label = np.vstack((y1,y2))

shuffle_idx = np.arange(sample_number*2)

np.random.shuffle(shuffle_idx)

train_data = train_data[shuffle_idx]

train_label = train_label[shuffle_idx]

return train_data,train_label

samples_num = 3000

train_data,train_label = test_data2(samples_num)

plt.scatter(train_data[np.argwhere(train_label==0),0],train_data[np.argwhere(train_label==0),1],s=5,c='b')

plt.scatter(train_data[np.argwhere(train_label==1),0],train_data[np.argwhere(train_label==1),1],s=5,c='g')

測試集

## create dataset

# reference https://zhuanlan.zhihu.com/p/36982945

def test_data2(sample_number = 1000):

#隨機均勻分布中生成數據

all_data = np.random.rand(sample_number*2,2)

data1 = all_data[all_data[...,0]>all_data[...,1]]

data2 = all_data[all_data[...,0]<=all_data[...,1]]

y1 = np.zeros((sample_number,1))#第一類,標簽為0

y2 = np.ones((sample_number,1))#第二類類,標簽為1

train_data = np.vstack((data1,data2))

train_label = np.vstack((y1,y2))

shuffle_idx = np.arange(sample_number*2)

np.random.shuffle(shuffle_idx)

train_data = train_data[shuffle_idx]

train_label = train_label[shuffle_idx]

return train_data,train_label

創建模型并訓練

model = Sequential()

rbflayer = RBFLayer(10,

initializer=InitCentersKMeans(train_data),

betas=2.0,

input_shape=(2,))

model.add(rbflayer)

model.add(Dense(1,activation='sigmoid'))

model.compile(loss=binary_crossentropy,optimizer=Adam(),metrics=['accuracy'])

model.fit(train_data,train_label,epochs=1000)

測試模型:

# x1 = np.linspace(-2,12,1000)

# x2 = np.linspace(-2,12,1000)

# test_x = np.vstack((x1,x2)).T

test_x,_ = test_data1()

test_x = maxminnorm(test_x)

test_y = model.predict(test_x)

plt.figure(figsize=(16,16))

# plot the train data

plt.scatter(train_data[np.argwhere(train_label==0),0],train_data[np.argwhere(train_label==0),1],s=5,c='b',marker='x')

plt.scatter(train_data[np.argwhere(train_label==1),0],train_data[np.argwhere(train_label==1),1],s=5,c='g',marker='x')

#plot the test data

plt.scatter(test_x[np.argwhere(test_y<0.5),0],test_x[np.argwhere(test_y<0.5),1],s=20,c='b',marker='o')

plt.scatter(test_x[np.argwhere(test_y>=0.5),0],test_x[np.argwhere(test_y>=0.5),1],s=20,c='g',marker='o')

結果圖:

圖中小點是訓練集,大圓點是測試集,對應顏色為類別。

有興趣可以關注公眾號哦,csdn和公眾號都有這個理論,同時挖個坑

意思是這個RBF還能用來做頂點修正;這個是骨骼動畫的一篇文章《Phase-Functioned Neural Networks for Character Control 》里面描述的,作用是從地形圖里面取一塊地形,然后把人放上去,但是由于腳可能踩不到地面上,所以用RBF把地形校正上來,以后有時間研究一波。

總結

以上是生活随笔為你收集整理的python rbf神经网络_RBF神经网络是什么?的全部內容,希望文章能夠幫你解決所遇到的問題。

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