0. 问题的出现
我们可以一张一张的将图像输入神经网络进行处理
- 但是花费时间会长
为什么不一次性多传入点照片呢?
- 例如一次直接传入100张图片
1. batch
捆,批的意思
- 要尽可能地让计算机处于计算状态
- 而不是数据传送状态
- 这样效率会更好更高
- 计算结果的速度会更快
2. 源码
# 在本实例中以batch的思想实现mnist神经网络
import pickle
import numpy as np
import sys, os
sys.path.append(os.pardir)
from dataset.mnist import load_mnist
def sigmod(x):
y = 1 / (1 + np.exp(-x))
return y
def softmax1(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))
def softmax(x):
max = np.max(x)
exp_a = np.exp(x - max)
sum_exp_a = np.sum(exp_a)
y = exp_a / sum_exp_a
return y
# 拿到数据集
def get_mnist():
(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, flatten=True, one_hot_label=False)
return x_test, t_test
# 神经网络学习
def init_network():
# pickle得到学习好的神经网络
with open(file='sample_weight.pkl', mode='rb') as f: # 从pickle中读取训练好的网络
network = pickle.load(file=f) # 使用pickle类读取打开的pkl文件
return network
# 神经网络推理
def predict(network, x):
pass
# 拿到网络权重
W1 = network['W1']
W2 = network['W2']
W3 = network['W3']
b1 = network['b1']
b2 = network['b2']
b3 = network['b3']
# 推理
a1 = np.dot(x, W1) + b1
z1 = sigmod(a1)
a2 = np.dot(z1, W2) + b2
z2 = sigmod(a2)
a3 = np.dot(z2, W3) + b3
y = softmax(a3)
return y
# 主入口
x, t = get_mnist() # 输入层的值
network = init_network()
batch_size = 100
accuracy_count = 0
# 计算正确率
for i in range(0, len(x), batch_size):
x_batch = x[i:i + batch_size]
y_batch = predict(network, x_batch) # 得到的y是一个ndarray数组
predict_result = np.argmax(y_batch, axis=1) # 预测结果
rigth_count = np.sum(predict_result == t[i:i + batch_size])
# if predict_result == t[i:i + batch_size]:
accuracy_count = accuracy_count + rigth_count
print('Accuracy is ' + str(accuracy_count / len(x) * 100) + ' %')
3. 关键参数展示
p = np.argmax(y_batch, axis=1)
参数p和t进行比较,从而来让准确度+1
思考
- 行表示元祖的第一个值,一般都是输入的个数
- 列表示原则的第二个值,这里是表示预测的结果
从0到9正好是个数,都分布在这里,所以应该是从行的方向上找最大值的索引,axis=1