1,误差反向传播法的梯度确认
确认数值微分求出的梯度结果和误差反向传播法求出的结果是否一致的操作称为梯度确认,梯度确认的代码实现如下所示
import sys,os
sys.path.append(os.pardir)
import numpy as np
from dataset.mnist import load_mnist
from two_layer_net import TwoLayerNet
#读入数据
(x_train,t_train),(x_test,t_test)=\
load_mnist(normalize=True,one_hot_label=True)
network=TwoLayerNet(input_size=784,hidden_size=50,output_size=10)
x_batch=x_train[:3]
t_batch=t_train[:3]
grad_numerical=network.numerical_gradient(x_batch,t_batch)
grad_backprop=network.gradient(x_batch,t_batch)
# 求各个权重的绝对误差的平均值
for key in grad_numerical.keys():
diff=np.average(np.abs(grad_backprop[key]-grad_numerical[key]))
print(key+":"+str(diff))
2. 使用误差反向传播法的学习
import sys,os
sys.path.append(os.pardir)
import numpy as np
from dataset.mnist import load_mnist
from two_layer_net import TwoLayerNet
#读入数据
(x_train,t_train),(x_test,t_test)=\
load_mnist(normalize=True,one_hot_label=True)
network=TwoLayerNet(input_size=784,hidden_size=50,output_size=10)
iters_num=10000
train_size=x_train.shape[0]
batch_size=100
learning_rate=0.1
train_loss_list=[]
train_acc_list=[]
test_acc_list=[]
iter_per_epoch=max(train_size/batch_size,1) #计算完成一个epoch所需的迭代次数
for i in range(iters_num):
batch_mask=np.random.choice(train_size,batch_size)
x_batch=x_train[batch_mask]
t_batch=t_train[batch_mask]
# 通过误差反向传播法求梯度
grad=network.gradient(x_batch,t_batch)
# 更新
for key in ("W1","b1","W2","b2"):
network.params[key]-=learning_rate*grad[key]
loss=network.loss(x_batch,t_batch)
train_loss_list.append(loss)
if i % iter_per_epoch==0:
train_acc=network.accuracy(x_train,t_train)
test_acc=network.accuracy(x_test,t_test)
train_acc_list.append(train_acc)
test_acc_list.append(test_acc)
print(train_acc,test_acc)