深度学习代码02--用训练好的神经网络在 MNIST 测试集上做预测并计算准确率
训练好的权重(
# 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.mnist和common.functions。
-
-
pickle:用来加载训练好的神经网络权重(存放在sample_weight.pkl)。 -
sigmoid和softmax:-
激活函数
-
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层神经网络结构:
-
第一层:
-
计算加权和:
a1 = x·W1 + b1 -
激活函数:
z1 = sigmoid(a1)
-
-
第二层:
-
a2 = z1·W2 + b2 -
z2 = sigmoid(a2)
-
-
第三层(输出层):
-
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 = 正确预测数量 / 测试样本总数
📖 整体逻辑总结
-
加载:
-
训练好的权重(
sample_weight.pkl)。 -
测试集数据。
-
-
预测:
-
通过一个 3 层神经网络做前向传播。
-
-
评估:
-
统计预测正确的数量,计算准确率。
-
🧠 这个网络是几层的?
-
输入层(784 节点)
-
隐藏层1(
W1,b1) -
隐藏层2(
W2,b2) -
输出层(10 节点,对应数字 0~9)
更多推荐
所有评论(0)