神经网络基础-前馈神经网络
深度学习基础知识和各种网络结构实战...神经网络基础-补充深度学习前言一、基础概念总结前言对独热码的解释一、基础概念 独热码,在英文称为one-hot code,直观来看,如果是分类问题就是有多少个类别就有多少个bit,并且只有一个bit为1,其余的都为0的一种码制。 假如只有一个特征是离散值:{fruits:{apple,pear,other}},该特征总共包含了3个不同的分类值,此时需要3
·
深度学习
基础知识和各种网络结构实战 ...神经网络基础-补充
前言
一、基于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%
总结
期待大家和我交流,留言或者私信,一起学习,一起进步!
更多推荐
所有评论(0)