逐层进行线性变换
对第 i 层,输入为上一层输出 H_{i-1},权重为 W_i,偏置为 b_i。
线性变换为:
给定一个 batch 的输入矩阵 X,以及一个多层全连接神经网络 DNN 的权重和偏置,请你实现 DNN 的前向传播,并计算多分类交叉熵损失。
DNN 由若干个线性层组成。除最后一层外,每一层线性变换后都需要经过 ReLU 激活函数;最后一层输出 logits,不经过 ReLU。
计算过程如下:
对第 i 层进行线性变换:
Z_i = H_(i-1) · W_i + b_i对隐藏层使用 ReLU:
H_i = max(0, Z_i)最后一层输出 logits:
logits = Z_L根据 labels 计算 softmax 交叉熵损失:
loss = -mean(log(softmax(logits)[i][labels[i]]))请返回 batch 上的平均交叉熵损失。
你的答案与标准答案误差不超过 1e-5 即视为正确。
X:输入矩阵,形状为 B × input_dimweights:权重矩阵列表,包含 L 个矩阵biases:偏置向量列表,包含 L 个向量labels:每个样本的类别标签,形状为 (B,)其中:
B 表示 batch 大小L 表示 DNN 的层数weights[i] 的形状为 dims[i] × dims[i + 1]biases[i] 的形状为 (dims[i + 1],)dims[L] 表示类别数量 num_classes1 <= B <= 641 <= L <= 101 <= input_dim <= 5122 <= num_classes <= 10001 <= dims[i] <= 512-10 <= X[i][j] <= 10-10 <= weights[k][i][j] <= 10-10 <= biases[k][j] <= 100 <= labels[i] < num_classesF.cross_entropyX = [[1.0, 2.0],
[-1.0, 1.0]]
weights = [
[[0.5, -1.0, 1.0],
[1.0, 0.5, -0.5]],
[[1.0, -1.0],
[0.5, 0.5],
[-0.5, 1.0]]
]
biases = [
[0.0, 0.5, 1.0],
[0.1, -0.2]
]
labels = [0, 1]
0.781566
该网络共有 2 层。
第一层为隐藏层,需要经过 ReLU;第二层为输出层,直接得到 logits。
对于第一个样本,前向传播后得到 logits:
[2.35, -1.45]正确类别为 0,交叉熵损失较小。
对于第二个样本,前向传播后得到 logits:
[1.60, 0.30]正确类别为 1,但类别 0 的 logit 更大,因此损失较大。
两个样本的交叉熵损失取平均,最终得到:
0.781566
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册