mini-batch学习
交叉熵误差
'''
在训练数据过多的情况下,全部进行学习这是不现实的,会耗费大量时间和算力。因此我们从中选取一部分数据进行训练,这种方法被称为
mini-batch.
'''
import sys,os
sys.path.append('D:/pycharm/SAVE_FILE/pythonProject/【源代码】深度学习入门:基于Python的理论与实现')
"""
对于需要引用的模块和需要执行的脚本文件不在同一个目录时,可以按照如下形式来添加路径:
①导入的XX包在另一个项目文件中,在自己写的程序中需要用到XX包。
②所以我们在运行自己写的程序时,首先加载导入的XX包,加载的时候python解释器会去sys.path默认搜索路径去搜索。
③如果通过sys.path中的路径可以搜索到XX包,然后加载。
④如果无法通过sys.path中的路径搜索到XX包,即说明自己的程序中引用的XX包,与自己程序脚本所在目录不在同一个路径。(无法在自己的程序脚本中根据默认搜索路径查找到XX包)
⑤然后我们就需要将XX包的搜索路径添加到自己程序脚本的默认搜索路径中,重新运行自己的程序脚本,先搜索XX包在加载XX包。
"""
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)
print(t_train.shape)
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]
'''
在先前的交叉熵误差中只计算了单个数据的损失函数,现在将所有mini-batch的训练数据的损失函数总数计算出来。
只要改良一下之前实现的对应单个数据的交叉熵误差就可以了。这里,我们来实现一个可以同时处理单个数据和批量数据(数据作为batch集中输人)两种情况的函数。
'''
def cross_entropy_error(y,t):
if y.ndim==1:
y=y.reshape(1,y.size)
t=t.reshape(1,t.size)
batch_size=y.shape[0]
print("y.shape[0]:", y.shape[0])
print("y.shape:", y.shape)
return -np.sum(t*np.log(y+1e-7))/batch_size
t = np.array([0, 0, 1, 0, 0, 0, 0, 0, 0, 0])
y = np.array([0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0])
test_result = cross_entropy_error(y,t)
print(test_result)
def cross_entropy_error1(y,t):
if y.ndim==1:
t=t.reshape(1,t.size)
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
运行结果为:
|