读书笔记-深度学习入门-(19)

重新review 了上一节的内容。

https://www.toutiao.com/article/7129312356684939789/

脑袋不如小时候,学习的一部分就是和遗忘作斗争,重新写下之前的理解。从page110 页开始,介绍了一个2层神经网络的类,实现过程如下:

  1. 根据手写数字识别的场景,输入为786个(28*28),输出为10个(1到10个数字的推断)。中间层hidden size 可以设置为一个合适的数值即可。下面的案例设置为10.

初始化权重,W1,W2初始值为随机化数据,b1,b2初始值为0


2.构造一个前向推理函数,predict(),基于输入的X的信息,做一个推断这个数据正确的概率。x.shape[0] 对应样本数量。

分类问题:基于初始的权重参数,求输出值softmax()函数


分类问题:基于初始的权重参数,求输出值softmax()函数

sigmoid 函数


3.求输入图像 和 输入的监督数据的损失函数(多大程度上不拟合)

基于输出值和监督数据的损失值

损失函数-交叉熵误差page 87


4.求输入函数推断的精准度


求输出值和监督值之间相比的精准度

x.shape[0] 代表样本数量,x.shape[1] 代表样本的信息,对应784个输入。

x.shape[0]对应



5.求损失函数针对权重参数w1,b1,w2,b2 分别的梯度。

这里面,x , t 其实都是预先准备好的图像以及标记(训练数据),针对训练数据,构造的函数loss(x,t)

求损失函数针对权重参数的梯度


损失函数loss.w 针对 权重参数的梯度


看下书本的描述,page113,

我们看一下TwolayerNet的方法的实现。首先是__init__(self,input_size,hidden_size,outputsize)方法,它是类的初始化方法(所谓初始化方法,就是生成TwolayerNet 实例时被调用的方法)从第一个参数开始,以此表示输入层的神经元数、隐藏层的神经元数,输出层的神经元数。另外,因为进行手写数字识别时,输入图像的大小是784(28*28),输出为10个类别,所以指定参数input_size = 784, output_size = 10, 将隐藏层的个数hidden_size 设置为一个合适的值即可。


此外,这个初始化方法会对权重参数进行初始化。如何设置权重参数的初始值这个问题是关系到神经网络能否成功学习的重要问题。后面会详细讨论权重参数的初始化,这里只需要知道,权重使用符合高斯分布的随机数进行初始化,偏置使用0进行初始化。predict(self,x) 和 accuracy(self,x,t)的实现和上一章的神经网络的推理处理基本一样。

另外loss(self,x,t) 是计算损失函数值的方法。这个方法会基于predict()的结果和正确解标签,计算交叉熵误差。剩下的numerical_gradient(self,x,t)方法会计算各个参数的梯度。根据数值微分,计算各个参数相对于损失函数的梯度。另外,gradient(self,x,t)是下一章要实现的方法,该方法使用误差反向传播法高效地计算梯度。


非常赞同,神经网络的学习比较花时间。

4.5.2 mini-batch的实现

神经网络的学习的实现使用的是前面介绍过的mini-batch学习。所谓mini-batch学习,就是从训练数据中随机选择一部分数据(称为mini-batch),再以这些mini-batch为对象,使用梯度法更新参数的过程。下面,我们就以Two-layeNet为对象,使用MNIST 数据集进行学习。




# coding: utf-8import sys, ossys.path.append(os.pardir)  # 親ディレクトリのファイルをインポートするための設定import numpy as npimport matplotlib.pyplot as pltfrom dataset.mnist import load_mnistfrom 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) #设置入参有784个,中间层有50个,输出层有10个数值。iters_num = 10000  # 适当设置重复次数train_size = x_train.shape[0] #样本的数量batch_size = 100 #这里指的是每次训练需要输入的样本的数量learning_rate = 0.1train_loss_list = [] #loss函数的结果集train_acc_list = [] #训练集 准确度概率test_acc_list = [] #测试集 准确度iter_per_epoch = max(train_size / batch_size, 1) #总的样本数量(train_size)/每次取出的样本量(batchsize) = 训练的批次 ,至少有第一批for i in range(iters_num):    #获取mini-batch(这里获取到了小的批次数据 batch_size 为100,train_size 为样本的总量)    batch_mask = np.random.choice(train_size, batch_size)    x_batch = x_train[batch_mask]    t_batch = t_train[batch_mask]    # 梯度计算    # grad = network.numerical_gradient(x_batch, t_batch)    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) #把损失数值插入到loss_list 中    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 | " + str(train_acc) + ", " + str(test_acc))# 绘图markers = {'train': 'o', 'test': 's'}x = np.arange(len(train_acc_list))plt.plot(x, train_acc_list, label='train acc') #显示训练数据的准确率plt.plot(x, test_acc_list, label='test acc', linestyle='--') #显示测试数据的准确率plt.xlabel("epochs")plt.ylabel("accuracy")plt.ylim(0, 1.0)plt.legend(loc='lower right')plt.show()


标注到后面,还未完全标注完,先看到这里。page115

越看越慢,惭愧。

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章