深度学习

基础知识和各种网络结构实战 ...

前言


一、基于MNIST数据集前馈神经网络

# 开发时间 ;2021/6/8 0008 15:43
#KNN实现MNIST数据分类
#使用pytorch框架进行数据的下载与读取
import torch
from torch.utils.data import DataLoader
import torchvision.datasets as da
import numpy as np
import torchvision.transforms as transforms
batch_size=100
#-----------------------------------------------------------------------------------------------------------------------

def sigmoid(z):
    return 1 / (1 + np.exp(-z))
def relu(x):
    return np.maximum(0,x)
#softmax处理多分类问题,Only支持向量版本
def softmax(z):
    c=np.max(z)
    exp_z=np.exp(z-c)
    return exp_z/np.sum(exp_z)
#softmax处理多分类问题,修改后,支持矩阵
def softmax_1(z):
    if z.ndim==2:
        c=np.max(z,axis=1)
        z=z.T-c#溢出对策
        y=np.exp(z)/np.sum(np.exp(x),axis=0)
        return y.T
    c=np.max(z)
    exp_z = np.exp(z - c)
    return exp_z/np.sum(exp_z)
#-----------------------------------------------------------------------------------------------------------------------

#minist dataset
train_dataset=da.MNIST(root='/pymnist', #选择数据根目录
                       train=True,      #选择训练数据集
                       transform=None,  #不考虑使用任何数据预处理
                       download=True)   #从网上下载
test_dataset=da.MNIST(root='/pymnist',  #选择数据根目录
                       train=False,     #选择测试数据集
                       transform=None,  #不考虑使用任何数据预处理
                       download=True)   #从网上下载
#加载数据
train_loader=torch.utils.data.DataLoader(dataset=train_dataset,
                                         batch_size=batch_size,
                                         shuffle=True)#打乱数据
test_loader=torch.utils.data.DataLoader(dataset=test_dataset,
                                        batch_size=batch_size,
                                        shuffle=True)
#MNIST数据集,其输入层为784个神经元,输出为10类,2层隐藏层。第一层隐藏层为50个神经元,第二层隐藏层为100个神经元
#-----------------------------------------------------------------------------------------------------------------------

def init_network():
    network={}
    weight_scale=1e-3
    network['W1']=np.random.randn(784,50)
    network['b1']=np.ones(50)
    network['W2']=np.random.randn(50,100)
    network['b2']=np.ones(100)
    network['W3']=np.random.randn(100,10)
    network['b3']=np.ones(10)
    return network
#-----------------------------------------------------------------------------------------------------------------------

def forward(network,x):
    '''
    :param network: 权重和偏差
    :param x: 输入
    :return: 输出
    '''
    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)
    z1=relu(a1)
    a2 = z1.dot(w2) + b2#第二层
    # z2 = sigmoid(a2)
    z2=relu(a2)
    a3 = z2.dot(w3) + b3#第三层
    y = a3
    return y
#-----------------------------------------------------------------------------------------------------------------------

network = init_network()
acc_cnt=0
x=test_dataset.test_data.numpy().reshape(-1,28*28)
labels=test_dataset.test_labels.numpy()#tensor-->numpy
for i in range(len(x)):
    y=forward(network,x[i])
    p=np.argmax(y)#取概率最高的
    if p==labels[i]:
        acc_cnt+=1
print('精度:'+str(float(acc_cnt)/len(x)*100)+"%")

精度:13.03%

  在MNIST数据集前向传播中,其输入的形状为(10000,784)的数据集,但其依旧按一张一张图来计算,先改为批处理:

#从for循环一张一张遍历图片到批量处理
network = init_network()
acc_cnt=0
batch_size=100
x=test_dataset.test_data.numpy().reshape(-1,28*28)
labels=test_dataset.test_labels.numpy()#tensor-->numpy
for i in range(0,len(x),batch_size):
    x_batch=x[i:i+batch_size]
    y_batch=forward(network,x_batch)
    p=np.argmax(y_batch,axis=1)
    acc_cnt+=np.sum(p==labels[i:i+batch_size])
print('精度:'+str(float(acc_cnt)/len(x)*100)+"%")

精度:10.41%

总结

期待大家和我交流,留言或者私信,一起学习,一起进步!

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐