使用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
相关产品推荐
相关产品推荐

