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

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个特征,请问上述代码对应哪一张?
另外还有两个疑问:

  1. 我的理解是否正确:共有300条输入样本,每条含2个特征;每条输入连接到第一层的3个神经元,对应3个权重?
  2. 为什么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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 09:15:03