You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TensorFlow中RBF网络实现问题:如何计算输入与质心的欧氏距离

解决TensorFlow中RBF网络的欧氏距离计算问题

嘿,我看你现在的代码还停留在全连接层的思路上,得调整下才能贴合RBF网络的核心逻辑——先计算输入与质心的欧氏距离,再通过径向基函数转换,最后做线性输出。我帮你一步步修改和补充代码:

1. 修正质心变量的定义

首先,RBF网络的第一层核心是质心,每个质心的维度要和输入x_data的维度一致(这里是3维),数量等于你设置的first_layer_nodes。所以把原来的A1换成质心变量:

import tensorflow as tf

# 假设你已经定义了第一层节点数,比如设为10
first_layer_nodes = 10

x_data = tf.placeholder(shape=[None, 3], dtype=tf.float32)
y_target = tf.placeholder(shape=[None, 1], dtype=tf.float32)

# 质心变量:[质心数量, 输入维度]
centroids = tf.Variable(tf.random_normal(shape=[first_layer_nodes, 3]))
# 径向基函数的gamma参数(可训练或设为超参数,这里设为可训练)
gamma = tf.Variable(tf.random_normal(shape=[first_layer_nodes]))
# 第二层线性权重:[质心数量, 输出维度]
A2 = tf.Variable(tf.random_normal(shape=[first_layer_nodes, 1]))

2. 计算输入与质心的欧氏距离

利用TensorFlow的广播机制,批量计算每个输入样本到所有质心的欧氏距离:

# 扩展维度,让x_data和centroids可以广播计算
# x_data扩展后形状:[样本数, 1, 输入维度]
x_expanded = tf.expand_dims(x_data, axis=1)
# centroids扩展后形状:[1, 质心数量, 输入维度]
centroids_expanded = tf.expand_dims(centroids, axis=0)

# 计算欧氏距离:先算差的平方和,再开根号
distances = tf.sqrt(tf.reduce_sum(tf.square(x_expanded - centroids_expanded), axis=2))

这里distances的形状是[样本数, 质心数量],对应每个样本到每个质心的距离。

3. 应用径向基函数(以高斯函数为例)

把距离转换成RBF的激活输出,常用的高斯RBF公式是:$\phi(d) = e^{-\gamma d^2}$,代码实现如下:

# 计算RBF输出:[样本数, 质心数量]
rbf_output = tf.exp(-gamma * tf.square(distances))

4. 构建最终输出层

把RBF的输出和第二层权重做线性组合,得到网络的预测值:

# 最终预测:[样本数, 1]
y_pred = tf.matmul(rbf_output, A2)

补充训练相关的代码(可选)

接下来你就可以定义损失函数和优化器来训练了,比如用均方误差:

loss = tf.reduce_mean(tf.square(y_pred - y_target))
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)
train_step = optimizer.minimize(loss)

这样整个RBF网络的核心逻辑就通了,关键是把原来的全连接权重换成质心,先计算距离再做RBF转换,而不是直接做矩阵乘法~

内容的提问来源于stack exchange,提问作者SzateX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:56:13