通过率 0% · 提交 0 · 通过 0
这道 OJ 的配套动画
两层网络前向传播 · 对应本题的思路、过程和代码
给定一个两层全连接网络:隐藏层有 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 <= d <= 64;1 <= h <= 64;1 <= m <= 500;权重与偏置为绝对值不超过 100 的实数,最多四位小数;输入为绝对值不超过 1000 的实数。
示例 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
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
训练营动画视频讲解
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
输出示例
3.5000
最小网络:z=1,a=1,y=0.5+3×1。
时间限制 2000 ms · 内存限制 256 MB
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有
这些是真正决定能不能 AC、但通用题解里常被略过的点。
对每个样本依次计算隐藏层和输出层。隐藏神经元 i 的线性结果为 b_i+Σw_ijx_j,经过 ReLU 得到 max(z_i,0);输出层计算 c+Σv_ia_i,不再添加激活函数。所有求和按下标从小到大进行。
隐藏层循环逐项实现每个神经元的仿射变换与 ReLU,得到题目定义的完整隐藏向量。输出层再用该向量执行一次线性组合,因此得到指定两层网络的前向结果。每个样本独立处理,不会相互影响。
每个样本计算 h 个长度为 d 的点积,时间复杂度为 O(mhd);权重占 O(hd),单个样本的隐藏状态占 O(h)。
输出层是线性层,不能再应用 ReLU。全部隐藏神经元输出 0 时,最终结果仍等于输出层偏置 c。输出保留四位小数,并把对应精度下的负零规范为正零。
# 逐样本两段循环:隐藏层 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()