# coding: utf-8
import sys, os
sys.path.append(os.pardir)  # 为了导入父目录的文件而进行的设定
import numpy as np
import pickle
from dataset.mnist import load_mnist
from common.functions import sigmoid, softmax


def get_data():
    (x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, flatten=True, one_hot_label=False)
    return x_test, t_test


def init_network():
    with open("sample_weight.pkl", 'rb') as f:
        network = pickle.load(f)
    return network


def predict(network, x):
    W1, W2, W3 = network['W1'], network['W2'], network['W3']
    b1, b2, b3 = network['b1'], network['b2'], network['b3']

    a1 = np.dot(x, W1) + b1
    z1 = sigmoid(a1)
    a2 = np.dot(z1, W2) + b2
    z2 = sigmoid(a2)
    a3 = np.dot(z2, W3) + b3
    y = softmax(a3)

    return y


x, t = get_data()
network = init_network()
accuracy_cnt = 0
for i in range(len(x)):
    y = predict(network, x[i])
    p= np.argmax(y) # 获取概率最高的元素的索引
    if p == t[i]:
        accuracy_cnt += 1

print("Accuracy:" + str(float(accuracy_cnt) / len(x)))

1.导入模块

import sys, os
sys.path.append(os.pardir)  # 把父目录加入路径,方便导入其他模块
import numpy as np
import pickle
from dataset.mnist import load_mnist
from common.functions import sigmoid, softmax

  • sys.path.append(os.pardir)

    • os.pardir 是父目录 (..)。

    • 加这行是为了可以导入 dataset.mnistcommon.functions

  • pickle:用来加载训练好的神经网络权重(存放在 sample_weight.pkl)。

  • sigmoidsoftmax

    • 激活函数

      • sigmoid:用于隐藏层。

      • softmax:输出层,用于多分类概率。


2️⃣ 加载 MNIST 测试数据

def get_data():
    (x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, flatten=True, one_hot_label=False)
    return x_test, t_test
  • 使用 load_mnist() 加载数据集。

    • normalize=True:把像素值缩放到 0~1。

    • flatten=True:每张图片展平成 784(28x28)的一维数组。

    • one_hot_label=False:标签是普通数字(如 5),不是 one-hot 编码。

  • 只返回测试集:x_test, t_test


3️⃣ 加载训练好的神经网络

def init_network():
    with open("sample_weight.pkl", 'rb') as f:
        network = pickle.load(f)
    return network
  • sample_weight.pkl 里读取神经网络权重和偏置。

  • 这个文件里保存了:

    • W1, b1:输入层 → 第一隐藏层的权重和偏置

    • W2, b2:第一隐藏层 → 第二隐藏层

    • W3, b3:第二隐藏层 → 输出层


4️⃣ 前向传播预测

def predict(network, x):
    W1, W2, W3 = network['W1'], network['W2'], network['W3']
    b1, b2, b3 = network['b1'], network['b2'], network['b3']

    a1 = np.dot(x, W1) + b1
    z1 = sigmoid(a1)

    a2 = np.dot(z1, W2) + b2
    z2 = sigmoid(a2)

    a3 = np.dot(z2, W3) + b3
    y = softmax(a3)

    return y
 

前向传播的3层神经网络结构

  1. 第一层

    • 计算加权和:a1 = x·W1 + b1

    • 激活函数:z1 = sigmoid(a1)

  2. 第二层

    • a2 = z1·W2 + b2

    • z2 = sigmoid(a2)

  3. 第三层(输出层)

    • a3 = z2·W3 + b3

    • 使用 softmax 归一化,得到每个类别的概率分布:y = softmax(a3)


5️⃣ 计算测试集准确率

x, t = get_data()
network = init_network()
accuracy_cnt = 0
for i in range(len(x)):
    y = predict(network, x[i])
    p = np.argmax(y)  # 概率最大的索引(预测类别)
    if p == t[i]:
        accuracy_cnt += 1

print("Accuracy:" + str(float(accuracy_cnt) / len(x)))
  • 遍历测试集 x

    • predict() 得到预测结果 y

    • np.argmax(y):找到概率最大值对应的索引 → 预测的数字

    • 如果预测值 p 和真实标签 t[i] 相等 → 计数加1

  • 最后计算准确率:

    accuracy = 正确预测数量 / 测试样本总数


📖 整体逻辑总结

  1. 加载

    • 训练好的权重(sample_weight.pkl)。

    • 测试集数据。

  2. 预测

    • 通过一个 3 层神经网络做前向传播。

  3. 评估

    • 统计预测正确的数量,计算准确率。


🧠 这个网络是几层的?

  • 输入层(784 节点)

  • 隐藏层1(W1, b1

  • 隐藏层2(W2, b2

  • 输出层(10 节点,对应数字 0~9)

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐