nnfs教程神经网络可视化:结构辨析与权重维度疑问
问题背景
我正在学习nnfs教程,尝试对实现的神经网络进行可视化,目前对以下代码的对应结构存在疑问:
import numpy as np import nnfs from nnfs.datasets import spiral_data nnfs.init() class Layer_Dense: # Layer initialization def __init__(self, n_inputs, n_neurons): # Initialize weights and biases self.weights = 0.01 * np.random.randn(n_inputs, n_neurons) self.biases = np.zeros((1, n_neurons)) # Forward pass def forward(self, inputs): # Calculate output values from inputs, weights and biases self.output = np.dot(inputs, self.weights) + self.biases # ReLU activation class Activation_Relu(): # forward pass def forward(self, inputs): # calculate output values from inputs self.output = np.maximum(0,inputs)
# create dense layer with 2 input features and 3 output values dense1 = Layer_Dense(2, 3) # create ReLU activation which will be used with Dense layer activation1 = Activation_Relu() # create second dense layer with 3 input features from the previous layer and 3 output values dense2 = Layer_Dense(3,3)
# create dataset X, y = spiral_data(samples = 100, classes = 3) dense1.forward(X) activation1.forward(dense1.output) dense2.forward(activation1.output)
本次使用的输入数据X为300行2列的数组,即300条样本,每条样本包含2个特征。Layer_Dense初始化参数为(2,3),代表输入特征数为2,神经元数量为3。
相关变量参数如下:
X.shape # (300, 2) x[:5] # [[ 0. , 0. ], # [ 0.00279763, 0.00970586], # [-0.01122664, 0.01679536], # [ 0.02998079, 0.0044075 ], # [-0.01222386, 0.03851056]]
dense1.weights.shape # (2, 3) dense1.weights # [[0.00862166, 0.00508044, 0.00461094], # [0.00965116, 0.00796512, 0.00558731]]) dense1.biases # [[0., 0., 0.]]
dense1.output.shape (300, 3) print(dense1.output[:5]) # [[0.0000000e+00 0.0000000e+00 0.0000000e+00] # [8.0659374e-05 4.3710388e-05 6.5012209e-05] # [1.5923499e-04 6.9124777e-05 1.0470775e-04] # [2.3033096e-04 1.9152602e-04 2.7749798e-04] # [1.9318146e-04 3.1980115e-04 4.5189835e-04]]
现有两张神经网络结构参考示意图,300条输入每条含2个特征,请问上述代码对应哪一张?
另外还有两个疑问:
- 我的理解是否正确:共有300条输入样本,每条含2个特征;每条输入连接到第一层的3个神经元,对应3个权重?
- 为什么dense1的weights形状是(2,3)而非(300,3)?
我使用NN-SVG工具绘制网络结构图。
解答
结构匹配结果
对应第二张网络结构示意图。
神经网络的输入层节点数仅和单条样本的特征数挂钩,和样本总数无关。你这里单条样本有2个特征,所以输入层是2个节点,第一层全连接层有3个神经元,第二层全连接层有3个神经元,和第二张图结构完全匹配。第一张示意图误将300个样本数作为输入层节点数,不符合神经网络的结构逻辑。
疑问1解答
你的理解部分正确:
- 300条输入样本、每条含2个特征的描述完全正确
- 后半部分描述有误:每条输入的2个特征,每个特征都会和第一层的每个神经元各连接1个权重,也就是说第一层的每个神经元对应2个权重(分别匹配2个输入特征),3个神经元总共6个权重,正好对应
dense1.weights的(2,3)形状。
疑问2解答
权重矩阵的形状仅和「上一层的特征数/神经元数」、「当前层的神经元数」有关,和批量输入的样本数量完全无关。
神经网络的权重是所有样本共享的,你一次性输入300个样本做批量计算,本质是300个样本各自用同一套权重做计算,再把结果堆叠输出。所以X的第一维300是批量维度,在矩阵运算中np.dot((300,2), (2,3))会得到(300,3)的输出,正好对应300个样本每个经过第一层后的3个输出值,逻辑完全自洽。
内容的提问来源于stack exchange,提问作者Jonas Palačionis
相关产品推荐
相关产品推荐

