深度学习入门----04 神经网络的学习

  • 一、损失函数
  • 1、为什么需要损失函数?
  • 在回答这个问题之前,我们首先要明确的是,损失函数是用来作为我们学习的指标。但是通过上一节的学习,我们发现通过学习数据后得到的参数用在测试参数上与测试标签相对比可以得到一个识别精度,既然有了识别精度,我们为什么不用识别精度作为我们学习的指标而是用损失函数呢?从用途来说,我们得明白指标用来干啥?除了评判学习的效果,最重要的是通过这个指标知道下一次修改参数的方向,就是说通过这个这个指标我要知道下一次我的参数应该要改大还是改小。回顾我们以前学习过的知识,要预测数据变化的方向,最有用的就是导数。打比方说,我们想得到一个函数的最小值,那么我们肯定要修改自变量为对应的最小值的变量,怎们修改,求导!导数为负值,增大自变量的值,函数值变小,反之亦然。那要求导,求导的对象应该是啥,必须得是一个函数,而且不能是常函数,也尽量不能是导数大部分时候都为零的函数,要不然我们无法依靠导数确定参数需要改变的方向。那么识别精度能满足要求吗,显然不能,识别精度的自变量是对应输出y最大值对应索引值与标签的对应数目个数,很难用导数表示,且在变化一点参数时,识别精度很难发生明显的变化,所以我们引入了损失函数。
  • 2、均方误差型损失函数:
  • 函数公式由代码实现如下:
def mean_squared_error(y, t):
    return 0.5 * np.sum((y - t)**2)

t = [0, 0, 1, 0, 0]
y = [0.1, 0.05, 0.7, 0.05, 0.1]
print(mean_squared_error(np.array(y), np.array(t)))
# 0.05750000000000001
  • 3、交叉熵误差型损失函数:
  • 交叉熵误差的值由正确解标签所对应的输出结果决定。
def cross_entropy_erroe(y, t):
    delta = 1e-7
    return -np.sum(t * np.log(y + delta))

t = [0, 0, 1, 0, 0]
y = [0.1, 0.05, 0.7, 0.05, 0.1]
print(cross_entropy_erroe(np.array(y), np.array(t)))
# 0.3566748010815999
  • 4、mini-batch 学习
  • 神经网络的学习也是从训练数据中选出一批数据,称为mini_batch,然后对每个mini_batch进行学习。比如从6000个数据中选出100笔,再对这100笔数据进行学习。
  • 代码实现:
import os
import pickle
import sys
sys.path.append(os.pardir)  #为了导入父目录中的文件进行的设定。
from dataset.mnist import load_mnist
import numpy as np

(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, one_hot_label=True)
print(x_train.shape)
print(t_train.shape)
# (60000, 784)
# (60000, 10)
train_size = x_train.shape[0]
batch_size = 10
batch_mask = np.random.choice(train_size, batch_size)
x_batch = x_train[batch_mask]
t_batch = t_train[batch_mask]

np.random.choice(a,b)随机从0到a-1中选取b个数据。

  • 5、mini_batch版交叉熵误差实现:
  • (1)、数据进行了one_hot_label处理:
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
  • (2)、没有进行one_hot_label处理:
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(np.log(y[np.arange(batch_size), t] + 1e-7 )) / batch_size
  • 如果看不懂上述代码,可以看下面这段参考代码:
print(z.ndim) # 1
print(z.size) # 5
print(z) # [0.1  0.05 0.7  0.05 0.1 ]
print(z.shape[0]) # 5
z = z.reshape(1, z.size) 
print(z) # [[0.1  0.05 0.7  0.05 0.1 ]]
print(z.shape[0]) # 1

t = [0, 0, 1, 0, 0]
y = [0.1, 0.05, 0.7, 0.05, 0.1]
print(cross_entropy_erroe(np.array(y), np.array(t)))
# 0.3566748010815999

c = -np.log([z[0, 2]])
print(c) #[0.35667494]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值