斋藤康毅-深度学习入门 学习笔记四

这篇博客探讨了神经网络中的损失函数,包括均方误差和交叉熵误差,以及数值微分的概念,用于求解梯度。作者通过实例展示了中心差分法来计算导数,并实现了一个简单的梯度下降算法。最后,通过一个两层神经网络的例子,演示了如何使用数值微分求取权重参数的梯度,以及如何在MNIST数据集上进行训练和评估。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ch 神经网络的学习

  1. 损失函数
    1.1 均方误差
import numpy as np


def mean_squared_error(y, t):
    return 0.5 * np.sum((y - t) ** 2)


if __name__ == '__main__':
    y = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]
    t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
    print(mean_squared_error(np.array(y), np.array(t)))

  1.2 交叉熵误差

import numpy as np


def cross_entropy_error(y, t):
    if y.ndim == 1:
        t = t.reshape(1, t.size)
        y = y.reshape(1, y.size)
    batch_size = y.shape[0]
    delta = 1e-7
    return -np.sum(t * np.log(y + delta)) / batch_size


if __name__ == '__main__':
    y = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]
    t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
    print(cross_entropy_error(np.array(y), np.array(t)))
  1. 数值微分
# 中心差分
def numerical_diff(f, x):
    h = 1e-5
    return (f(x + h) - f(x - h)) / (2 * h)


def function(x):
    return 0.01 * (x ** 2) + 0.1 * x


def function_2(x):
    return x[0] ** 2 + x[1] ** 2


def function_tmp1(x0):
    return x0 * x0 + 4.0 ** 2.0


def function_tmp2(x1):
    return 3.0 ** 2.0 + x1 * x1


if __name__ == '__main__':
    print(numerical_diff(function, 10))
    # 偏微分
    print(numerical_diff(function_tmp1, 3.0))
    print(numerical_diff(function_tmp2, 4.0))
  1. 梯度
import numpy as np


def numerical_diff(f, x):
    h = 1e-5
    return (f(x + h) - f(x - h)) / (2 * h)


def function_2(x):
    return x[0] ** 2 + x[1] ** 2

# 求梯度
def _numerical_gradient(f, x):
    h = 1e-4
    grad = np.zeros_like(x)

    for idx in range(x.size):
        tmp_val = x[idx]
        x[idx] = tmp_val + h
        fxh1 = f(x)

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

        grad[idx] = (fxh1 - fxh2) / (2 * h)
        x[idx] = tmp_val
    return grad


# 求极值点
# 函数 初值 学习率 迭代次数
def gradient_descent(f, init_x, lr=0.1, step_num=100):
    x = init_x

    for i in range(step_num):
        grad = _numerical_gradient(f, x)
        x -= lr * grad
    return x


if __name__ == '__main__':
    print(_numerical_gradient(function_2, np.array([3.0, 4.0])))
    # 使用梯度下降法求极值
    print(gradient_descent(function_2, init_x=np.array([3.0, -4.0]), lr=0.1, step_num=100))
  1. 学习算法的样例

two_layer_net.py

import numpy as np
import sys, os

sys.path.append(os.pardir)
from ch03.functions.all import *
from loss_function.cross_entropy_error import *
from gradient import numerical_gradient


class TwoLayerNet:
    def __init__(self, input_size, hidden_size, output_size, weight_init_std=0.01):
        self.params = {}
        self.params["W1"] = weight_init_std * np.random.randn(input_size, hidden_size)
        self.params["b1"] = np.zeros(hidden_size)
        self.params["W2"] = weight_init_std * np.random.randn(hidden_size, output_size)
        self.params["b2"] = np.zeros(output_size)

    def predict(self, x):
        W1, W2 = self.params["W1"], self.params["W2"]
        b1, b2 = self.params["b1"], self.params["b2"]

        a1 = np.dot(x, W1) + b1
        z1 = sigmoid(a1)
        a2 = np.dot(z1, W2) + b2
        y = softmax(a2)

        return y

    def loss(self, x, t):
        y = self.predict(x)
        return cross_entropy_error(y, t)

    def accuracy(self, x, t):
        y = self.predict(x)
        y = np.argmax(y, axis=1)
        t = np.argmax(t, axis=1)

        accuracy = np.sum(y == t) / float(x.shape[0])
        return accuracy

    def numerical_gradient(self, x, t):
        loss_W = lambda W: self.loss(x, t)

        grads = {}
        grads["W1"] = numerical_gradient(loss_W, self.params["W1"])
        grads["b1"] = numerical_gradient(loss_W, self.params["b1"])
        grads["W2"] = numerical_gradient(loss_W, self.params["W2"])
        grads["b2"] = numerical_gradient(loss_W, self.params["b2"])
        return grads

train_neuralnet.py

import numpy as np
import sys, os
import matplotlib.pyplot as plt

sys.path.append(os.pardir)
from ch03.functions.all import *
from loss_function.cross_entropy_error import *
from gradient import numerical_gradient
from dataset.mnist import load_mnist
from two_layer_net import TwoLayerNet

(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, one_hot_label=True)

train_loss_list = []

# hyper parameters
iters_num = 10000
train_size = x_train.shape[0]
batch_size = 100
learning_rate = 0.1

network = TwoLayerNet(input_size=784, hidden_size=50, output_size=10)

for i in range(iters_num):
    print(i)
    batch_mask = np.random.choice(train_size, batch_size)
    x_batch = x_train[batch_mask]
    t_batch = t_train[batch_mask]

    grad = network.numerical_gradient(x_batch, t_batch)
    for key in {"W1", "b1", "W2", "b2"}:
        network.params[key] -= learning_rate * grad[key]

    loss = network.loss(x_batch, t_batch)
    train_loss_list.append(loss)

print(train_loss_list)
x = [i for i in range(0, len(train_loss_list))]
plt.plot(x, train_loss_list)
plt.show()

总结:

  • 机器学习中使用的数据分为训练数据和测试数据
  • 神经网络用训练数据进行学习, 并用测试数据评价学习到的模型的泛化能力
  • 神经网络的学习以损失函数为指标,更新权重参数,以使损失函数的值减小
  • 利用某个给定的微小值的差分求导数的过程,称为数值微分
  • 利用数值微分,可以计算权重参数的梯度

斋藤康毅-深度学习入门 专栏

### 回答1: 《深度学习入门斋藤康毅pdf》是一本由斋藤康毅所著的关于深度学习入门教材,主要介绍了深度学习的基本概念、原理和应用。 首先,这本书提供了深度学习的基本概念和背景知识。作者通俗易懂地解释了人工神经网络、卷积神经网络和循环神经网络等主要深度学习模型的原理和应用,对于没有深度学习基础的读者来说非常友好。 其次,这本书详尽地介绍了深度学习的核心技术和算法。作者讲解了各种深度学习的主要方法,包括目标检测、图像分类、语音识别等。读者可以通过学习这些技术和算法来提升自己的实践能力。 此外,这本书还强调了实践的重要性。作者提供了大量的示例代码和实际应用案例,读者可以通过动手实践来巩固所学知识,并且可以基于这些代码和案例进行深度学习项目的开发。 总之,《深度学习入门斋藤康毅pdf》是一本很好的深度学习入门教材。它适合那些对深度学习感兴趣的读者,无论是具有编程经验的工程师,还是想要了解深度学习技术的学生。这本书内容通俗易懂,注重实践,可以帮助读者快速入门深度学习,掌握相关技术和算法。 ### 回答2: 《深度学习入门 斋藤康毅pdf》是一本介绍深度学习基础知识的书籍。斋藤康毅是日本著名的深度学习专家,在该书中以简明易懂的方式向读者介绍了深度学习的基本概念、原理及其应用。 该书共分为3部分:第一部分是关于神经网络深度学习基础的讲解。通过对神经网络的结构和工作原理的详细说明,读者可以了解深度学习的基本概念和核心思想。同时,该部分还介绍了常用的深度学习框架和工具,帮助读者上手实践。 第二部分是关于深度学习的具体应用案例。通过实践案例的讲解,读者可以了解深度学习在计算机视觉、自然语言处理等领域的应用。同时,作者还分享了一些实战经验和技巧,方便读者在实际项目中更好地应用深度学习技术。 第三部分是关于深度学习研究的展望和发展方向。作者对当前深度学习领域的研究热点和趋势进行了分析和总结,探讨了未来深度学习可能的发展方向,为读者提供了学术研究和学习的参考。 总体而言,《深度学习入门 斋藤康毅pdf》是一本很好的入门教材。不仅能帮助初学者快速掌握深度学习的基础知识,还能为进一步深入学习和研究提供一定的帮助。它简洁明了的风格和实例驱动的方法使得读者能够更容易理解和应用深度学习技术。同时,书中提供的相关资源和参考文献也为读者提供了进一步学习的路径和资料。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值