神经网络前向处理代码学习
本项目基于mnist手写文字数据集。MNIST是一个著名的手写数字数据集,由Yann LeCun, Corinna Cortes和Chris Burges创建,包含60,000个训练样本和10,000个测试样本,每个样本都是28x28像素的手写数字图像。这些图像已经被归一化,并且数字居中显示在固定大小的图像中
。MNIST数据集是机器学习和深度学习领域中用来测试算法效果的标准数据集,例如线性分类器、K-近邻算法、支持向量机、神经网络和卷积神经网络等
导入必要的库
# coding: utf-8
import os
import struct
import pickle
import numpy as np
import matplotlib.pylab as plt
import tkinter as tk
from tkinter import filedialog
from PIL import Image
定义sigmoid函数,激活函数
def sigmoid(self, x):
return 1 / (1 + np.exp(-x))
定义softmax函数,输出层激活函数
def softmax(self, x):
if x.ndim == 2:
x = x.T
x = x - np.max(x, axis=0)
y = np.exp(x) / np.sum(np.exp(x), axis=0)
return y.T
x = x - np.max(x) # 溢出对策
return np.exp(x) / np.sum(np.exp(x))
读取minst数据集中的数据
def load_mnist(self, kind='train'): # kind是train或test
path = self.minstpath
labels_path = os.path.join(path, '%s-labels.idx1-ubyte' % kind) # 标签文件路径
images_path = os.path.join(path, '%s-images.idx3-ubyte' % kind) # 图像文件路径
with open(labels_path, 'rb') as lbpath:
magic, n = struct.unpack('>II', lbpath.read(8)) # 读取文件头
labels = np.fromfile(lbpath, dtype=np.uint8) # 读取标签
with open(images_path, 'rb') as imgpath:
magic, num, rows, cols = struct.unpack('>IIII', imgpath.read(16)) # 读取文件头
images = np.fromfile(imgpath, dtype=np.uint8).reshape(len(labels), 784) # 读取图像并转换为784维向量
return images, labels
前向处理
输入信号——>权重+偏置——>激活函数——>权重+偏置——>激活函数——>输出层激活函数——>输出
def predict(self, x):
W1, W2, W3 = self.params["w1"], self.params["w2"], self.params["w3"]
b1, b2, b3 = self.params["b1"], self.params["b2"], self.params["b3"]
a1 = np.dot(x, W1) + b1
z1 = self.sigmoid(a1)
a2 = np.dot(z1, W2) + b2
z2 = self.sigmoid(a2)
a3 = np.dot(z2, W3) + b3
y = self.softmax(a3)
return y
main
if __name__ == "__main__":
root = tk.Tk()
root.withdraw() # 隐藏主窗口
# 选择包含数据库的文件夹
folder_selected = filedialog.askdirectory() # 打开文件夹选择对话框
print("选择的文件夹路径:", folder_selected)
# 选择包含模型权重参数的文件
file_selected = filedialog.askopenfilename() # 打开文件选择对话框
print("选择的文件路径:", file_selected)
my_predect = Predict_num(minstpath=folder_selected, pklpath=file_selected)
images, labels = my_predect.load_mnist(kind='train')
# 显示待预测的图片
random_num = np.random.randint(0, images.shape[0])
img = images[random_num]
img_show = np.array(img).reshape(28, 28)
pil_img = Image.fromarray(np.uint8(img_show))
pil_img.show()
print("预测结果:", np.argmax(my_predect.predict(img)))
print("实际结果:", labels[random_num])
数据集和代码已打包,公众号“逃离小星球”发送关键词“前向处理”自取,感谢支持