TensorFlow神经网络自定义连接与权重约束的实现报错求助
问题解决:自定义权重约束的形状错误修复
错误原因分析
你的代码报错核心是张量形状不匹配:
tf.zeros(4,1)写法错误,需传入元组tf.zeros((4,1)),否则生成的是1维张量而非2维- 权重矩阵索引逻辑有误,你取了第二列的前4个值,但实际应取第一列的前4个值来复用
- concat操作时,不同张量维度不统一,导致拼接失败
正确的自定义权重约束实现
根据你的需求:
- 前4个输入仅作用于第一个隐藏层神经元 → 第一个神经元的后4个权重设为0
- 后4个输入仅作用于第二个隐藏层神经元 → 第二个神经元的前4个权重设为0
- 满足
w₁=w₅、w₂=w₆、w₃=w₇、w₄=w₈→ 第二个神经元的后4个权重等于第一个神经元的前4个权重
修正后的代码如下:
import tensorflow as tf from tensorflow.keras import layers class EqualWeights(tf.keras.constraints.Constraint): def __call__(self, w): # w的形状是(8, 2):8个输入特征 × 2个神经元 # 提取第一个神经元的前4个有效权重 first_neuron_weights = w[:4, 0] # 构建第一个神经元的完整权重:前4个保留,后4个设为0 first_col = tf.concat([first_neuron_weights, tf.zeros(4)], axis=0) # 构建第二个神经元的完整权重:前4个设为0,后4个复用第一个神经元的前4个权重 second_col = tf.concat([tf.zeros(4), first_neuron_weights], axis=0) # 拼接成(8,2)的权重矩阵 return tf.stack([first_col, second_col], axis=1) model = tf.keras.Sequential([ layers.Dense(2, input_shape=(8,), activation='linear', kernel_constraint=EqualWeights()), layers.Dense(10, activation='relu'), # 按需求将原代码的20修正为10 layers.Dense(1) ]) model.compile(optimizer='adam', loss='mean_squared_error', metrics=['accuracy']) # 可运行以下代码验证权重约束效果 # model.build(input_shape=(None,8)) # print(model.layers[0].kernel.numpy())
关键修正点
- 用
tf.stack替代多次concat,更简洁地构建2维权重矩阵 - 修正
tf.zeros的参数格式,确保所有张量维度统一 - 调整权重索引逻辑,准确复用前4个输入的权重值到第二个神经元的后4个位置
内容的提问来源于stack exchange,提问作者baronett
相关产品推荐
相关产品推荐

