python rbf神经网络_RBF神经网络是什么?
RBF是啥?
RBF其英文缩写为Radial Basis Function(RBF),亦称为径向基函数(RBF),因此RBF神经网络即为径向基函数神经网络的一种形式。
是不是想到了一种核函数就叫RBF?没错,就是这货:
衡量某个点到中心的距离
RBF神经网络是啥?
说白了就是以RBF作为激活函数的神经网络,并非传统BP神经网络那样在前向传播上采用统一的拓扑结构。其核心区别在于采用了分层递进的学习机制以优化整体性能。
如何计算各单元值:
隐单元计算方法如下
无需赘述的是输出层的计算过程与传统方案一致,并可直接采用WZ方法即可完成。具体而言,在参数更新环节中涉及的因素包括中心向量C、宽度向量D以及权重系数W等要素。
把大概流程走一波:
① 初始化权重
,网上很多方法,什么fan-in,fan-out, 或者caffe里面的一堆方法
②初始化中心
意义:通过这种方式,在焦点位置上增强输入信息的低效程度会产生显著的效果。
③初始化宽度向量
意义:便于让每个隐藏层神经元更易感知局部信息,并能有效提升该网络在处理局部特征时的表现。《模式识别与智能计算》一书中未提及平方项,但采用平方形式更具合理性。
计算隐单元输出值:
计算输出层值
损失
梯度下降,更新参数
————————————————————————————————————
在分析隐层单元时,我们采用的是基于径向基函数(RBF)的激活函数。该激活函数主要由中心点和宽度参数两个关键要素构成。相较于传统的BP网络方法,在性能上并没有显著差异。
在分析隐层单元时,我们采用的是基于径向基函数(RBF)的激活函数。该激活函数主要由中心点和宽度参数两个关键要素构成。相较于传统的BP网络方法,在性能上并没有显著差异。
作用?其实也就是核心参数的作用吧,在RBF网络中存在这样的特性。
如需进一步了解,请访问我的个人博客网站查看相关内容。此外,在Matlab环境中提供示例代码供读者运行并探索其应用。如对源码实现感兴趣,则可深入研究径向基函数(RBF)神经网络的相关代码实现,并参考风翼冰舟老师的详细解析文章。
基于RBF简单的matlab手写识别 - 风翼冰舟的博客 - 博客blog..net
————————————————————————————————————
更新日志:2020-11-2
好像蛮多人在关注某个项目或技术点吧?我最近找到了一份Keras代码用于实现Radial Basis Function(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)
选择 train_data 中 label 为 0 的样本点的第一和第二特征用于绘制散点图标记颜色为蓝色大小为5
plt.scatter(training_data[np.where((train_label == 1).ravel(), 0)], training_data[np.where((train_label == 1).ravel(), 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'))
模型配置使用二元交叉熵损失函数和Adam优化器完成,并追踪准确率作为指标。
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 of samples where label is 0 in the first dimension and label is 1 in the second dimension,
s=5,
color='blue',
markersize=5,
markerstyle='x'
)
plt.scatter(
train_data of samples where label is 0 in the first dimension and label is 1 in the second dimension,
s=5,
color='blue',
markersize=5,
markerstyle='x'
)
使用plt.scatter函数绘制数据点,并对满足条件train_label等于1的数据点进行标记。
其中大小设为5、颜色设为绿色,并使用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')
结果图:
图中小点是训练集,大圆点是测试集,对应颜色为类别。
有兴趣可以关注公众号哦,和公众号都有这个理论,同时挖个坑
其主要用途之一是用于顶点修正。这篇文章来自骨骼动画领域的研究论文《Phase-Functioned Neural Networks for Character Control》,其作用是从地形图中提取特定区域并将其与模型人物结合放置在该区域内。然而,在实际应用中发现一个问题:人体足部可能会悬空于地面之上,在这种情况下我们采用了RBF方法实现了地形细节的精确校正。以后有机会深入研究这一技术细节及其在角色控制中的潜在应用价值
