深度学习入门 基于python理论和实践读书笔记(六)

第四章 神经网络学习 第一 二节

从数据中学习

        神经网络它的特征就是可以从数据中进行学习,在学习中自动调整权重参数(不用人去手工调整),通过对权重参数的调整,达到更高的准确率。深度学习有时候可以指是端到端机器学习。从原始数据(输入)获得目标结果(输出)。神经网络的优点就是对所有的问题可以用同样的流程来解决。通过不断学习所提供的数据,尝试发现待求解的问题的模式。与待处理问题无关。

数据驱动

        数据是机器学习的命根子。机器学到的模式都是在数据的基础上获取而来的。尝试从收集到的数据中发现答案(模式)。这样子就更加能够避免人为的介入了。
        数据分为训练数据和测试数据。训练数据用来训练模型,测试数据用来测试训练模型的准确率和模型的泛化能力。泛化能力是指处理未被观察过的数据的能力。所以吧数据分为测试数据和训练数据很重要。某个模型可以顺利地处理某个数据集,但无法处理其他数据集的情况。只对某个数据集过度拟合的状态称为过拟合。这种情况在机器学习中是要尽量避免的。

损失函数

损失函数是表示神经网络性能的“恶劣程度”的指标,当前的神经网络对监督数据在多大程度上不拟合。常用的两个损失函数有均方误差和交叉熵差。

均方误差

公式为
在这里插入图片描述
python代码

import numpy as np
def  mean_squared_error(y,t):
    return 0.5*np.sum((y-t)**2)
t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
y = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]
print(mean_squared_error(np.array(y), np.array(t)))

交叉熵

公式为
在这里插入图片描述
log表示以e为底数的自然对数(log e)。这个公式因为乘了一个tk。tk中只有正确解标签的索引为1,其他均为0。所以这样只会比较到正确标签和对应的该索引预测出来的概率之间的差距。
python 代码

def cross_entropy_error(y,t):
    delta = 1e-7
    return  -np.sum(t*np.log(y+delta))
t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
y = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]
print(cross_entropy_error(np.array(y), np.array(t)))

mini-batch学习

计算损失函数的时候必须将所有训练集数据做为对象,但是有些训练集的数据非常之庞大。比如手写数据集就有6万个数据,这样子每一个数据都要计算其损失函数是非常耗时的。神经网络的学习就是从训练集中选取一批数据,这批数据就是称为mini-batch。然后对每一个mini-batch进行学习。比如说手写数字中6万个数据中抽取100个。这种学习就叫做minibatch学习。
python代码

import sys, os
sys.path.append(os.pardir) # 为了导入父目录中的文件而进行的设定
import numpy as np
from dataset.mnist import  load_mnist
(x_train, t_train), (x_test, t_test) = \
 load_mnist(normalize=True, one_hot_label=True)
print(x_train.shape) # (60000, 784)
print(t_train.shape) # (60000, 10)
train_size = x_train.shape[0]
batch_size = 10
batch_mask = np.random.choice(train_size,batch_size)
x_bacth = x_train[batch_mask]
t_bacth = t_train[batch_mask]

np.random.choice(60000, 10)会从0到59999之间随机选择10个数字。

mini-batch交叉熵误差

就是进行批量计算交叉熵误差,第一种是当t是one-hot的时候。
python代码

def cross_entropy_error(y, t):
     if y.ndim == 1:
         t = t.reshape(1, t.size)
         y = y.reshape(1, y.size)
     batch_size = y.shape[0]
     return -np.sum(t * np.log(y + 1e-7)) / batch_size

这里唯一要解释一下的就是为什么当处理数据为单个的数据的时候,需要
t = t.reshape(1, t.size)些这句代码,它就是给t增加了一维。之前如果你输出它的shape只有维就是它列的个数,现在它就是行为一行,列为之前输出的。这样子就如果它本来就大于一的话,它shape[0]就是batch的数量。如果它只有一维的话shape[0]就是列数,就加了一维。让batch等于1。后面就按照公式来就可以了。
第一种是当t不是one-hot的时候。
python代码为

def cross_entropy_error(y, t):
     if y.ndim == 1:
         t = t.reshape(1, t.size)
         print(t)
         y = y.reshape(1, y.size)
     batch_size = y.shape[0]
     print(y[np.arange(batch_size), t])
     return -np.sum(np.log(y[np.arange(batch_size), t] + 1e-7)) / batch_size

对于一个小萌新来说,我真的是理解了好久,写代码去验证自己的猜测。最后理解代码的意思了,也符合那个公式,首先y[np.arange(batch_size), t] 会生成 NumPy 数 组 [y[0,2], y[1,7], y[2,0], y[3,9], y[4,4]])。然后y[0,2]意思就是假如y是行数为1,它的数据是y = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]这样子的话,如果t标签等于[2],就是说明该图属于2这个标签,y[0,2]就是找y矩阵的第一行的三列的数字,比如这里就是y[0,2]=0.6

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值