# 手工计算神经网络第三期：数据读取与完成训练

```train_img_path=r'C:\Users\Dell\MNIST\train-images.idx3-ubyte'
train_lab_path=r'C:\Users\Dell\MNIST\train-labels.idx1-ubyte'
test_img_path=r'C:\Users\Dell\MNIST\t10k-images.idx3-ubyte'
test_lab_path=r'C:\Users\Dell\MNIST\t10k-labels.idx1-ubyte'```

```import struct

train_num=50000
valid_num=10000
test_num=10000

with open(train_img_path,'rb') as f:
tmp_img=np.fromfile(f,dtype=np.uint8).reshape(-1,28*28)
train_img=tmp_img[:train_num]  #前五万个数据是训练集
valid_img=tmp_img[train_num:]  #第五万到第六万个数据是测试集

with open(test_img_path,'rb') as f:
test_img=np.fromfile(f,dtype=np.uint8).reshape(-1,28*28)

with open(train_lab_path,'rb') as f:
tmp_lab=np.fromfile(f,dtype=np.uint8)
train_lab=tmp_lab[:train_num]
valid_lab=tmp_lab[train_num:]

with open(test_lab_path,'rb') as f:
test_lab=np.fromfile(f,dtype=np.uint8)```

reshape(-1,28*28)：如果参数中存在-1，表示该参数由其他参数来决定.-1是将一维数组转换为二维的矩阵，并且第二个参数是表示每一行数的个数。

```import matplotlib.pyplot as plt
def show_train(index):
plt.imshow(train_img[index].reshape(28,28),cmap='gray')
print('label:{}'.format(train_lab[index]))
def show_test(index):
plt.imshow(train_img[index].reshape(28,28),cmap='gray')
print('label:{}'.format(test_lab[index]))
def valid_train(index):
plt.imshow(valid_img[index].reshape(28,28),cmap='gray')
print('label:{}'.format(valid_lab[index]))```

## 训练数据

```def tanh(x):
return np.tanh(x)

def softmax(x):
exp = np.exp(x-x.max())
return exp/exp.sum()
dimensions = [28*28,10]
activation = [tanh,softmax]
distribution=[
{
'b':[0,0]
},{
'b':[0,0],
'w':[-math.sqrt(6/(dimensions[0]+dimensions[1])),math.sqrt(6/(dimensions[0]+dimensions[1]))]
}]

# 初始化参数b
def init_parameters_b(layer):
dist = distribution[layer]['b']
return np.random.rand(dimensions[layer])*(dist[1]-dist[0])+dist[0]
# 初始化参数w
def init_parameters_w(layer):
dist = distribution[layer]['w']
return np.random.rand(dimensions[layer-1],dimensions[layer])*(dist[1]-dist[0])+dist[0]

#初始化参数方法
def init_parameters():
parameter=[]
for i in range(len(distribution)):
layer_parameter={}
for j in distribution[i].keys():
if j=='b':
layer_parameter['b'] = init_parameters_b(i)
continue;
if j=='w':
layer_parameter['w'] = init_parameters_w(i)
continue
parameter.append(layer_parameter)
return parameter

# 预测函数
def predict(img,init_parameters):
l0_in = img+parameters[0]['b']
l0_out = activation[0](l0_in)
l1_in = np.dot(l0_out,parameters[1]['w'])+parameters[1]['b']
l1_out = activation[1](l1_in)
return l1_out```

```def d_softmax(data):
sm = softmax(data）
return np.diag(sm)-np.outer(sm,sm)

def d_tanh(data):
return 1/(np.cosh(data))**2

differential = {softmax:d_softmax,tanh:d_tanh}```

```differential = {softmax:d_softmax,tanh:d_tanh}
onehot = np.identity(dimensions[-1])```

```def sqr_loss(img,lab,parameters):
y_pred = predict(img,parameters)
y = onehot[lab]
diff = y-y_pred
return np.dot(diff,diff)```

```def grad_parameters(img,lab,init_parameters):
l0_in = img+parameters[0]['b']
l0_out = activation[0](l0_in)
l1_in = np.dot(l0_out,parameters[1]['w'])+parameters[1]['b']
l1_out = activation[1](l1_in)
diff = onehot[lab]-l1_out
act1 = np.dot(differential[activation[1]](l1_in),diff)
# 与上文优化d_tanh有关，将矩阵乘法化为数组乘以矩阵

```def train_batch(current_batch,parameters):
for img_i in range(1,batch_size):

import copy
parameter_tmp = copy.deepcopy(parameters)
return parameter_tmp```

```def learn_self(learn_rate):
for i in range(train_num//batch_size):
if i%100 == 99:
print("running batch {}/{}".format(i+1,train_num//batch_size))
global parameters

```def valid_loss(parameters):
loss_accu = 0
for img_i in range(valid_num):
loss_accu+=sqr_loss(valid_img[img_i],valid_lab[img_i],parameters)
return loss_accu```

```def valid_accuracy(parameters):
correct = [predict(valid_img[img_i],parameters).argmax()==valid_lab[img_i] for img_i in range(valid_num) ]
print("validation accuracy:{}".format(correct.count(True)/len(correct)))```

*注：此篇文章受B站up主大野喵渣的启发，并参考了其代码，感兴趣的同学可以去B站观看他关于神经网络的教学视频，以及到他的Github地址逛逛。

https://www.bilibili.com/video/av51197008

https://github.com/YQGong

0 条评论

• ### 无人驾驶公司小马智行获得丰田4亿美元投资，估值超过30亿美元

2月26日，国内无人驾驶初创公司小马智行（Pony.ai) 正式宣布从丰田汽车公司（Toyota Motor Corporation）筹集了4亿美元，以加深和扩...

• ### 2019 IEEE Fellow名单曝光，90多位华人入选，大陆学者33位

日前，IEEE(国际电气与电子工程师协会)发布了2019年度新当选会员（Fellow）名单 (IEEE Society Report《IEEE Fellows ...

• ### 吴恩达机器学习笔记-2

逻辑回归 (Logistic Regression)是分类问题的一个代表算法，这是目前最流行使用最广泛的一种学习算法。

• ### 十分钟入门 Python 绘图库 Matplotlib 入门教程

Matplotlib是一个Python语言的2D绘图库，它支持各种平台，并且功能强大，能够轻易绘制出各种专业的图像。本文是对它的一个入门教程。

• ### Python 绘图库 Matplotlib 入门教程

Matplotlib是一个Python语言的2D绘图库，它支持各种平台，并且功能强大，能够轻易绘制出各种专业的图像。本文是对它的一个入门教程。

• ### SVM梯度求导及实现

昨晚看了一部电影，叫做我是马布里，非常正能量，推荐给各位，看完这部电影的总结话是：

• ### 聊聊怎么阅读SDWebImage源码

关于SDWebImage的介绍就不多说了，网上很多。我们主要聊聊怎么阅读SDWebImage的源码。 阅读源码前首先我们要思考几个问题： 1.SDWebIm...

• ### 剑指offer 栈的压入，弹出序列

输入两个整数序列，第一个序列表示栈的压入顺序，请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序...