TensorFlow中首个Dense层未全连接的原因及文档位置咨询
问题根源:输入层的维度理解偏差
这事儿其实是因为你对tensorflow.feature_column.input_layer的输出维度理解错了,咱们一步步拆解:
核心问题:特征列的shape设置与输入张量的维度不匹配
你用了tensorflow.feature_column.numeric_column("test_input")但没指定shape参数,这个参数默认是()——也就是把输入当成单个标量特征。而你的输入test_input是tensorflow.range(10),形状是(10,),这时候input_layer会把它解析成10个样本,每个样本只有1个标量特征,输出的形状是(10, 1)。
这就导致第一个全连接层hidden_layer_1的输入特征维度是1,所以权重矩阵的形状自然是(1, 10)(输入特征数×输出神经元数),而不是你预期的(10,10)。
如何修正到你预期的拓扑
要实现“1个样本有10个特征,每个隐藏层10个神经元,全连接”的结构,你需要做两处调整:
- 给
numeric_column指定shape=(10,),告诉它这是一个包含10个元素的特征; - 调整输入张量的维度,加上batch维度(即使batch_size=1),因为
input_layer要求输入的第一个维度是batch。
修正后的代码如下:
import tensorflow as tf # 输入改成带batch维度:shape=(1,10),代表1个样本,10个特征 features = {"test_input": tf.range(10)[tf.newaxis, :]} # 指定特征列的shape为(10,) feature_columns = [tf.feature_column.numeric_column("test_input", shape=(10,))] input_layer = tf.feature_column.input_layer(features=features, feature_columns=feature_columns) hidden_layer_1 = tf.layers.dense(input_layer, units=10, activation=tf.nn.relu, name="hidden_layer_1") hidden_layer_2 = tf.layers.dense(hidden_layer_1, units=10, activation=tf.nn.relu, name="hidden_layer_2") vars = tf.trainable_variables() for var in vars: print(f"{var.name}: {var.shape}")
运行后你会看到:
hidden_layer_1/kernel:0的形状是(10,10),完全符合你的预期;hidden_layer_2/kernel:0的形状是(10,10)。
相关行为的文档说明
关于这个逻辑的官方说明,你可以参考这几部分:
numeric_column的shape参数:定义单个样本中该特征的维度,默认是()(标量),只有指定正确的形状,input_layer才会正确解析输入的特征维度;input_layer的输出规则:会根据特征列的定义,将输入张量转换成(batch_size, total_feature_dimensions)的形状,其中total_feature_dimensions是所有特征列的维度之和;tf.layers.dense的权重规则:如果输入是(batch_size, input_dim),那么权重矩阵的形状是(input_dim, units),这是全连接层的标准权重构造逻辑。
内容的提问来源于stack exchange,提问作者quant
相关产品推荐
相关产品推荐

