深度学习入门(基于python实现)--第三章 神经网络 03

# _*_ coding:UTF-8 _*_
# 开发工具:PyCharm
"""
手写数字的识别
利用书中所给的脚本文件,我已经上传到了CSDN的资源中,免费下载

前向传播:假设神经网络已经训练完毕,此时我们将一个数据输入并进行判断,这个就是“推理”的过程
这个过程也称为“前向传播”
"""
import pickle
import sys, os
import numpy as np

sys.path.append(os.pardir)
from dataset.mnist import load_mnist
from PIL import Image

# 第一次下载会用点时间
# (训练图像,训练标签(tag_train)),(测试,测试标签)
(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=False)

# 输出各个数据形状
print(x_train.shape)
print(t_train.shape)
print(x_test.shape)
print(t_test.shape)

# 输出如下
# (60000, 784)
# (60000,)
# (10000, 784)
# (10000,)


def img_show(img):
    pil_img = Image.fromarray(np.uint8(img))
    pil_img.show()


img = x_train[0]
label = t_train[0]  # 获得对应标签
img = img.reshape(28, 28)  # 把图片变为原来尺寸,一开始读入的时候进行了一维展开
img_show(img)  # 显示为5

"""下面进行神经网络的推理"""
"""
由于输出为0~9,十个数字,那么便有十个输出神经元
输入神经元为784个,28*28
此外,这个神经网络有两个隐藏层,分别为50/100个神经元,这个可以自己随意设置
但是由于之后用到的是已经训练好的权值和偏置,就设置成这样
"""


def sigmoid(x):
    """
    sigmoid激活函数
    :param x: list[int]
    :return: list[int]
    """
    return 1.0 / (1 + np.exp(-x))


def softmax(a):
    c = np.max(a)  # 防止溢出,比如e的100次方就是一个很大的数了,具体数学论证请看书上内容
    exp_a = np.exp(a - c)
    sum_exp_a = np.sum(exp_a)
    y = exp_a / sum_exp_a
    return y


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


def init_network():
    """返回权重和偏置"""
    with open(r"sample_weight.pkl", "rb") as f:  # 假设已经训练好了,现在进行测试
        network = pickle.load(f)
    return network


def predict(network: dict, 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  # 第0层到第一层
    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)))
# 我这边测试时显示精度为92.07%,书上显示为93.52%

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值