通过率 0% · 提交 0 · 通过 0
给定一个两层全连接网络:隐藏层有 h 个神经元,激活函数为 ReLU;输出层是 1 个线性神经元(不加激活)。对每个输入样本 x:先算每个隐藏神经元 z_i = b_i + Σ w_ij·x_j,取 a_i = max(z_i, 0);再算输出 y = c + Σ v_i·a_i。按输入顺序输出全部样本的前向结果。求和按下标从小到大进行。
这类题属于算法机考高频题型中「华为 AI 岗 / 神经网络」方向的高频题型,通常考察对「华为 AI 岗 / 神经网络」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
第一行输入 d h m,分别为输入维数、隐藏神经元数和样本数。接下来 h 行,每行 d+1 个实数:该神经元的 d 个权重和偏置。随后一行 h+1 个实数:输出层的 h 个权重和偏置。最后 m 行,每行 d 个实数,表示输入样本。
输出 m 行,每行一个保留四位小数的前向结果。绝对值小于 0.00005 时输出 0.0000。
示例 1
输入示例
2 2 2 1 -1 0.5 0.5 0.5 -2 2 1 -0.5 1 0.5 0 0
输出示例
1.5000 0.5000
第 14 天讲解的 2-2-1 网络:第一个样本里 z_2=-1.25 被 ReLU 拍成 0。
示例 2
输入示例
1 1 1 2 -1 3 0.5 1
输出示例
3.5000
最小网络:z=1,a=1,y=0.5+3×1。
时间限制 2000 ms · 内存限制 256 MB
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
这些是真正决定能不能 AC、但通用题解里常被略过的点。
两层全连接网络的前向传播:隐藏层 ReLU、输出层线性。没有训练、没有反向,纯计算模拟——考的是把网络结构逐项翻译成循环,以及三个格式细节。
对每个样本 x:
1. 隐藏层:第 i 个神经元 z_i = b_i + Σ_j w_ij·x_j,激活 a_i = max(z_i, 0)。求和按 j 从小到大累加(判题口径固定了顺序,浮点加法不满足结合律,顺序不同末位可能漂)。 2. 输出层:y = c + Σ_i v_i·a_i,线性输出,不加 ReLU。给输出也套一层 max(·, 0) 是最常见的手滑——负的预测值会被错误抹成 0。
ReLU 的边界:z = 0 时 max(0, 0) = 0,写成 z > 0 ? z : 0 与 z >= 0 ? z : 0 结果相同,但若写成「负数走一个分支、非负走另一个」时把 0 分错边,配合后续权重恰好能被专门用例抓住。
某个神经元 z_i < 0 时 a_i = 0,它对输出没有贡献——这是 ReLU 的正常行为,不需要任何特殊处理。全部神经元都死掉时输出恰好等于输出层偏置 c,这一档有专门用例:别在「全零」时慌张地输出 0,c 可能是负数,按值输出并做负零钳制。
逐样本双层循环即可,权重矩阵读入时注意每行是「d 个权重 + 1 个偏置」、输出层是「h 个权重 + 1 个偏置」的排布。
时间 O(m·h·d),空间 O(h·d)。规模上限 500×64×64 ≈ 2×10⁶ 次乘加,任何语言都轻松。
-0.0000 未钳制。样例 1 就是课程里那张 2-2-1 网络:隐藏神经元 1 权重 (1, −1)、偏置 0.5;神经元 2 权重 (0.5, 0.5)、偏置 −2;输出层权重 (2, 1)、偏置 −0.5。
样本 (1, 0.5):z_1 = 0.5 + 1 − 0.5 = 1.0 → a_1 = 1;z_2 = −2 + 0.5 + 0.25 = −1.25 → a_2 = 0(死神经元);y = −0.5 + 2×1 + 1×0 = 1.5。
样本 (0, 0):z_1 = 0.5 → a_1 = 0.5;z_2 = −2 → 0;y = −0.5 + 2×0.5 = 0.5。
死神经元没有任何特判——它就是 max 归零后不贡献输出。真正要盯的是别在输出层 −0.5 + … 之后再 max 一次。
前向传播手写题的口述框架:每层是「线性变换 + 非线性激活」,隐藏层过 ReLU、回归输出层保持线性。两个高频追问都在激活函数上。「输出层为什么不加 ReLU」:回归目标可以为负,输出层加 ReLU 等于宣布模型永不预测负值。「隐藏层没有激活会怎样」:两层线性变换复合还是线性变换,网络塌缩成一个线性模型,深度全部作废——可以现场用 2×2 的小矩阵乘给面试官看。死神经元话题也从这里自然引出:ReLU 输入恒为负的神经元梯度为零、永远学不动,这是 LeakyReLU 一类变体存在的理由。
先跑样例 1 的第一个样本:1.5 对说明主流程通,0.5 错查第二个样本的路径。输出全为非负值,几乎断定输出层多套了 ReLU;整体偏一个常数,查偏置是否漏加;个别样本末位差 0.0001,查求和顺序是否按下标从小到大。
# 逐样本两段循环:隐藏层 z=b+Σwx 过 ReLU,输出层线性不加激活;求和按下标从小到大。
# 全部神经元死掉时输出=输出层偏置;四位小数注意负零钳制。
import sys
def solve() -> None:
data = sys.stdin.buffer.read().split()
if not data:
return
it = iter(data)
d = int(next(it))
h = int(next(it))
m = int(next(it))
hidden = [[float(next(it)) for _ in range(d + 1)] for _ in range(h)]
output = [float(next(it)) for _ in range(h + 1)]
out = []
for _ in range(m):
x = [float(next(it)) for _ in range(d)]
value = output[h]
for i in range(h):
z = hidden[i][d]
for j in range(d):
z += hidden[i][j] * x[j]
if z > 0:
value += output[i] * z
if abs(value) < 0.00005:
value = 0.0
out.append(f"{value:.4f}")
print("\n".join(out))
if __name__ == "__main__":
solve()
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有