Python(Numpy)实现均方差、交叉熵损失函数等(3)

鱼书3:
1.MSE均方差误差(适用于线性回归)
MSE

import numpy as np
def MSE(y,t):
    #形参t代表训练数据(监督数据)(真实)
    #y代表预测数据
    return 0.5*np.sum((y-t)**2)
# 设“2”为正确解
t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
#假设预测下标为2是正确的
y1 = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]
print(MSE(np.array(y1),np.array(t)))
#输出:    0.09750000000000003,很小,代表误差很小,预测大概对了

#假设预测下标为7是正确的
y2 = [0.1, 0.05, 0.1, 0.0, 0.05, 0.1, 0.0, 0.6, 0.0, 0.0]
print(MSE(np.array(y2),np.array(t)))
#输出:    0.5975   ,很大,代表误差大,表示预测很不好

2.交叉熵损失函数(cross entropy error)

交叉熵是一种思想,交叉熵损失函数是基于这种思想的产物

CEE
这里,log表示以e为底数的自然对数(log e)。yk是神经网络的输出,tk是
正确解标签。并且,tk中只有正确解标签的索引为1,其他均为0(one-hot表示)。因此,式(4.2)实际上只计算对应正确解标签的输出的自然对数,比如,假设正确解标签的索引是“2”,与之对应的神经网络的输出是0.6,则交叉熵误差是−log 0.6 = 0.51;若“2”对应的输出是0.1,则交叉熵误差为−log0.1 = 2.30。也就是说,交叉熵误差的值是由正确解标签所对应的输出结果决定的。(因为采用one-hot,tk中的0×任何数=0)

import numpy as np
def cross_entropy_error(y,t):
    delta=1e-7  #添加一个微小值可以防止负无限大(np.log(0))的发生。
    return -np.sum(t*np.log(y+delta))

t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
y1 = [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(y1),np.array(t)))  #输出0.510825457099338(也比较小啦)

y2 = [0.1, 0.05, 0.1, 0.0, 0.05, 0.1, 0.0, 0.6, 0.0, 0.0]
print(cross_entropy_error(np.array(y2),np.array(t)))  #2.302584092994546

3.mini-batch版交叉熵误差的实现

  • 训练数据是One_hot形式;
    y是神经网络的输出,t是监督数据。y的维度为1时,即求单个数据的交叉熵误差时,需要改变数据的形状。并且,当输入为mini-batch时,要用batch的个数进行正规化,计算单个数据的平均交叉熵误差。
def cross_entropy_error(y,t):
    #y是一维的情况
    if y.ndim==1:
        #转为二维:shape是(1,t.size)的类型(这里是1,10),
        #而不是一维shape(t.size,)的情况(这里是10,)了
        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 #就是又多少行(batch_size),就除以多少,这就是小批量来估计整体

t1 = np.array([0, 0, 1, 0, 0, 0, 0, 0, 0, 0])
y1 = np.array([0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0])
print(cross_entropy_error(y1,t1))

t2 = np.array([[0, 0, 1, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0, 1, 0, 0, 0]])
y2 = np.array([[0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0],
               [0.6, 0.05, 0.1, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]])
print(cross_entropy_error(y2,t2))
  • 非one-hot(标签形式)
    省略
  • 8
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值