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

使用TensorFlow构建三层DNN时遇'VarianceScaling'不可下标错误求助

解决TensorFlow中VarianceScaling对象不可下标访问的错误

嘿,这个错误其实很好理解——你把初始化器对象当成了现成的权重矩阵来用啦!

错误原因拆解

你写的weight_initializer = tf.variance_scaling_initializer(mode="fan_avg", ...)这行代码,返回的是一个权重初始化器对象,它的作用是按照你指定的规则生成权重张量,但它本身并不是可以直接用下标[]访问的数组/矩阵。你直接用weight_initializer[n_input, n_hl1]去访问,就像试图对一个函数做下标操作,自然会抛出TypeError。

修正后的代码示例

下面是补全并修正后的完整代码,我帮你调整了权重变量的创建方式,同时规范了占位符的形状定义:

import tensorflow as tf

n_input = 18
n_target = 1
n_hl1 = 10
n_hl2 = 10
n_hl3 = 10
learning_rate = 0.1
batch_size = 100

# 建议给占位符加上形状,让代码更规范易维护
X = tf.placeholder('float', shape=[None, n_input])
Y = tf.placeholder('float', shape=[None, n_target])

# 补全初始化器的完整定义
sigma = 1
weight_initializer = tf.variance_scaling_initializer(
    mode="fan_avg",
    scale=sigma,
    distribution="normal"  # 可根据需求选择uniform或normal分布
)
bias_initializer = tf.zeros_initializer()  # 偏置通常用全0初始化

# 正确创建各层权重与偏置:调用初始化器并传入形状参数
W_hidden_1 = tf.Variable(weight_initializer(shape=[n_input, n_hl1]))
b_hidden_1 = tf.Variable(bias_initializer(shape=[n_hl1]))

W_hidden_2 = tf.Variable(weight_initializer(shape=[n_hl1, n_hl2]))
b_hidden_2 = tf.Variable(bias_initializer(shape=[n_hl2]))

W_hidden_3 = tf.Variable(weight_initializer(shape=[n_hl2, n_hl3]))
b_hidden_3 = tf.Variable(bias_initializer(shape=[n_hl3]))

# 输出层权重
W_output = tf.Variable(weight_initializer(shape=[n_hl3, n_target]))
b_output = tf.Variable(bias_initializer(shape=[n_target]))

# 构建网络前向传播逻辑
hl1 = tf.nn.relu(tf.add(tf.matmul(X, W_hidden_1), b_hidden_1))
hl2 = tf.nn.relu(tf.add(tf.matmul(hl1, W_hidden_2), b_hidden_2))
hl3 = tf.nn.relu(tf.add(tf.matmul(hl2, W_hidden_3), b_hidden_3))
output = tf.add(tf.matmul(hl3, W_output), b_output)

额外小建议

如果你用的是TensorFlow 2.x版本,更推荐用Keras API来构建网络,代码会简洁很多,还不用手动管理权重变量:

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

model = Sequential([
    Dense(n_hl1, activation='relu', input_shape=(n_input,), kernel_initializer='variance_scaling'),
    Dense(n_hl2, activation='relu', kernel_initializer='variance_scaling'),
    Dense(n_hl3, activation='relu', kernel_initializer='variance_scaling'),
    Dense(n_target)
])

model.compile(optimizer=tf.keras.optimizers.SGD(learning_rate=learning_rate), loss='mse')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:25:27