zoukankan      html  css  js  c++  java
  • 神经网络学习笔记3

    神经网络
    ①梯度
    梯度法:在学习时找到最优参数,使用梯度寻找函数最小值方法:函数取值从
    梯度:表示各点处函数减少最多的方向,不一定指向最小值,但沿着方向可以最大限度减少函数的值。所以在寻找函数最小值的时候,以梯度信息为线索决定前进方向。
    学习率:在神经网络学习中,决定在一次学习中应该学习多少,以及在多大程度上更新参数

    使用python实现梯度下降法

    def gradient_descent(f,init_x,lr=0.01,step_num=100):
    x=init_x
    for i in range(setp_num):
    grad=numrical_gradient(f(x),x)
    x -= lr*grad
    return x

    f是要进行优化的函数,init_x是初始值,lr是学习率learning rate,step_num是梯度法的重复次数
    numerical_gradient(f,x)求函数的梯度,使用该计算的梯度乘以学习率得到的值更新操作,由step_num指定重复的次数。该函数还可以求函数最小值

    学习率过大,会发散成一个比较大的值;学习率过小,基本上没怎么更新就结束。设置合适的学习率非常重要。

    ※神经网络的梯度

    example:
    对于一个2*3权重W的神经网络,损失用L表示
    以一个简单的神经网络为例,实现求梯度代码
    实现一个名为simpleNet的类

    # coding: utf-8
    import sys, os
    sys.path.append(os.pardir)  # 为了导入父目录中的文件而进行的设定
    import numpy as np
    from common.functions import softmax, cross_entropy_error
    from common.gradient import 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
    
    
    x = np.array([0.6, 0.9])
    
    t = np.array([0, 0, 1])
    
    net = simpleNet()
    print(net.W) #输出权重参数
    
    p=net.predict(x)
    print(p)
    
    
    
    f = lambda w: net.loss(x, t)
    dW = numerical_gradient(f, net.W)
    
    print(dW)

    numerical_gradient(f,x)参数是f函数,x为传给f的参数
    这里参数x取net.W,定义一个计算损失函数的新函数f,把新定义的函数传给numerical_gradient(f,x)

  • 相关阅读:
    Java并发编程:volatile关键字解析(转)
    Java并发编程 Synchronized及其实现原理
    (a++)+(++a)=?
    Java集合中那些类是线程安全的
    Servlet 与 CGI 的比较
    JAVA中常见的锁以及其特性
    总结一下hashMap和hashtable方面的知识点
    Which statement is true?
    下面哪段程序能够正确的实现了GBK编码字节流到UTF-8编码字节流的转换:
    Kafka 详解(转)
  • 原文地址:https://www.cnblogs.com/AKsnoopy/p/13488152.html
Copyright © 2011-2022 走看看