【自学记录】深度学习入门——基于Python的理论与实现(第4章 神经网络的学习)

4.2 损失函数

csharp 复制代码
#损失函数
#均方误差
def mean_squared_error(y,t):
    return 0.5*np.sum((y-t)**2)
#交叉熵误差
def _cross_entropy_error(y,t):
    delta=1e-7
    return -np.sum(t*np.log(y+delta))

#交叉熵损失函数
def cross_entropy_error(y,t):
    if y.ndim==1:
        t=t.reshape(1,t.size)
        y=y.reshape(1,y.size)
    # 把one-hot-vector 转化为正确的【10000,】 索引
    if t.size==y.size:
        t=t.argmax(axis=1)
    batch_size=y.shape[0]#一批有多少,就是y有多少行
    return -np.sum(np.log(y[np.arange(batch_size),t]+1e-7))/batch_size

4.3数值微分

csharp 复制代码
#数值法求导数、偏导数   
def f(x):
    return x**2
def f2(x):
    return x[0]**2+x[1]**2

#数值法求导数(单个)
def numerical_diff(f,x):
    h=1e-4
    return (f(x+h)-f(x-h))/(2*h)

#求f2在点(3,4)处x1的偏导的中间函数
def f22(x):
    return x**2+4**2 

x=np.array([3.0,4.0])

#数值法求y=x**2在x=3下的导数
y=numerical_diff(f,3)
print("x**2在3的导数为"+str(y))

#数值法求单个y2=x1**2+x2**2在(3,4)下x1的偏导 
# f22是f(x,4),先把x2带入 
y2=numerical_diff(f22,3)
print("x1**2+x2**2在(3,4)的x1偏导数为"+str(y2))

4.4 梯度

csharp 复制代码
############4.4梯度#################
#数值法求梯度 即(dx1,dx2),一起计算x0、x1的偏导
def numerical_gradient(f,x):
    h=1e-4#0.0001
    grad=np.zeros_like(x)#生成和x相同的数组
    for idx in range(x.size):#如X[3,4],X不一定是一个数,可能是F(x1,x2),x1,x2两点处的偏导都要求
        tmp_val=x[idx]
        # f(x+h)
        x[idx]=tmp_val+h#x[3+h,4]
        fxh1=f(x)#F(3+h,4)

        #f(x-h)
        x[idx]=tmp_val-h
        fxh2=f(x)

        grad[idx]=(fxh1-fxh2)/(2*h) #[F(3+h,4)-F(3-h,4)]/(2*h)
        x[idx]=tmp_val#恢复X为X【3,4】
    return grad    
#数值法求个y2=x1**2+x2**2在(3,4)的偏导数
y2=numerical_gradient(f2,x)
print("x1**2+x2**2在(3,4)的偏导数为"+str(y2))

#梯度下降
#lr 学习率  学习率过大,会发散成一个很大的值,学习率过小,基本没怎么更新就结束了
#step_num梯度法的重复次数
def gradient_descent(f,init_x,lr=0.01,step_num=100):
    x=init_x
    for i in range(step_num):
        grad=numerical_gradient(f,x)#求此点的数值梯度
        x-=lr*grad #X每一次都在更新
    return x    
#求F2的最小值
init_x=np.array([-3.0,4.0])
min_x=gradient_descent(f2,init_x,lr=0.1,step_num=100)
min_y=f2(min_x)
print("F2mim=F2"+str(min_x)+"="+str(min_y))#与实际最小值(0,0)很接近

求简单神经网络的梯度

csharp 复制代码
import sys, os
sys.path.append(os.pardir)  # 为了导入父目录中的文件而进行的设定
import numpy as np
from study03_NeuralNetwork import softmax
from study04_NeuralNetworkStudy import cross_entropy_error,numerical_gradient

class simpleNet:
    def __init__(self):
        self.W=np.random.randn(2,3)#初始化
    
    def predict(self,x):
        return np.dot(x,self.W)
    def loss(self,x,t):
        z=self.predict(x)
        y=softmax(z)
        loss=cross_entropy_error(y,t)
        return loss


net=simpleNet()
#print(net.W)
x=np.array([0.6,0.9])

p=net.predict(x)
print("predict_p="+str(p))

t=np.array([0,0,1])#正确解的标签

loss=net.loss(x,t)
print("loss="+str(loss))

f = lambda w: net.loss(x, t) 
dW=numerical_gradient(f,net.W)
print("dW="+str(dW))
相关推荐
码云数智-大飞10 分钟前
使用 Python 高效提取 PDF 中的表格数据并导出为 TXT 或 Excel
python
biuyyyxxx1 小时前
Python自动化办公学习笔记(一) 工具安装&教程
笔记·python·学习·自动化
极客数模2 小时前
【2026美赛赛题初步翻译F题】2026_ICM_Problem_F
大数据·c语言·python·数学建模·matlab
小鸡吃米…3 小时前
机器学习中的代价函数
人工智能·python·机器学习
All The Way North-4 小时前
彻底掌握 RNN(实战):PyTorch API 详解、多层RNN、参数解析与输入机制
pytorch·rnn·深度学习·循环神经网络·参数详解·api详解
Li emily4 小时前
如何通过外汇API平台快速实现实时数据接入?
开发语言·python·api·fastapi·美股
m0_561359674 小时前
掌握Python魔法方法(Magic Methods)
jvm·数据库·python
Ulyanov4 小时前
顶层设计——单脉冲雷达仿真器的灵魂蓝图
python·算法·pyside·仿真系统·单脉冲
2401_838472515 小时前
使用Python进行图像识别:CNN卷积神经网络实战
jvm·数据库·python
童话名剑5 小时前
情感分类与词嵌入除偏(吴恩达深度学习笔记)
笔记·深度学习·分类