【自学记录】深度学习入门——基于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))
相关推荐
一个闪现必杀技3 分钟前
Python入门--函数
开发语言·python·青少年编程·pycharm
AI完全体3 分钟前
【AI知识点】偏差-方差权衡(Bias-Variance Tradeoff)
人工智能·深度学习·神经网络·机器学习·过拟合·模型复杂度·偏差-方差
sp_fyf_202416 分钟前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-02
人工智能·神经网络·算法·计算机视觉·语言模型·自然语言处理·数据挖掘
小鹿( ﹡ˆoˆ﹡ )23 分钟前
探索IP协议的神秘面纱:Python中的网络通信
python·tcp/ip·php
卷心菜小温38 分钟前
【BUG】P-tuningv2微调ChatGLM2-6B时所踩的坑
python·深度学习·语言模型·nlp·bug
陈苏同学1 小时前
4. 将pycharm本地项目同步到(Linux)服务器上——深度学习·科研实践·从0到1
linux·服务器·ide·人工智能·python·深度学习·pycharm
唐家小妹1 小时前
介绍一款开源的 Modern GUI PySide6 / PyQt6的使用
python·pyqt
FL16238631292 小时前
[深度学习][python]yolov11+bytetrack+pyqt5实现目标追踪
深度学习·qt·yolo
羊小猪~~2 小时前
深度学习项目----用LSTM模型预测股价(包含LSTM网络简介,代码数据均可下载)
pytorch·python·rnn·深度学习·机器学习·数据分析·lstm
Marst Code2 小时前
(Django)初步使用
后端·python·django