使用NumPy从头开始实现神经网络

以下是使用NumPy从头开始实现神经网络的完整攻略以及两个示例:

一、准备工作

  1. 安装NumPy库。

  2. 准备数据集。神经网络需要有数据进行训练和测试,因此需要准备数据集。这里以鸢尾花数据集为例。

  3. 导入NumPy和数据集。

import numpy as np
from sklearn.datasets import load_iris

iris = load_iris()

二、数据预处理

  1. 分离训练集和测试集。将数据集分为训练集和测试集,通常测试集占数据集的20-30%。
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size = 0.3)
  1. 归一化。由于特征值的取值范围不同,需要将特征值归一化,确保在同一范围内和同一数据格式内。
X_train = X_train / np.max(X_train)
X_test = X_test / np.max(X_test)
  1. One-hot编码。将标签值变成一个向量,向量的长度等于标签可选范围的个数,每个值对应一个可能的取值,与实际取值完全对应的位置上放置1,其余位置则为0。
def one_hot(y):
    y_onehot = np.zeros((y.shape[0], np.unique(y).shape[0]))
    for i in range(y.shape[0]):
        y_onehot[i, y[i]] = 1
    return y_onehot

y_train = one_hot(y_train)
y_test = one_hot(y_test)

三、构建神经网络

  1. 初始化权重。权重即神经网络中每个神经元与其他神经元相互接触的连接权重,需要初始化为随机值。
def init_params(layer_dimensions):
    params = {}
    L = len(layer_dimensions)

    for l in range(1, L):
        params['W' + str(l)] = np.random.randn(layer_dimensions[l], layer_dimensions[l-1]) * 0.01
        params['b' + str(l)] = np.zeros((layer_dimensions[l], 1))

    return params

params = init_params([4, 10, 3])
  1. 前向传播。由于神经网络的本质就是通过前向传播来预测输出结果,因此需要编写前向传播算法。
def sigmoid(z):
    return 1 / (1 + np.exp(-z))

def forward_propagation(X, params):
    L = len(params) // 2
    A = X

    for l in range(1, L):
        A_prev = A
        Z = np.dot(params['W' + str(l)], A_prev) + params['b' + str(l)]
        A = sigmoid(Z)

    ZL = np.dot(params['W' + str(L)], A) + params['b' + str(L)]
    AL = np.exp(ZL) / np.sum(np.exp(ZL), axis = 0)

    return AL

AL = forward_propagation(X_train, params)
  1. 计算损失函数。定义损失函数是为了衡量预测结果和实际结果的差距。
def compute_cost(AL, Y):
    m = Y.shape[1]
    cost = (-1/m) * np.sum(np.dot(Y, np.log(AL).T) + np.dot(1-Y, np.log(1-AL).T))
    cost = np.squeeze(cost)
    return cost

cost = compute_cost(AL, y_train)
  1. 反向传播更新权重。定义反向传播函数进行权重的更新。
def sigmoid_backward(dA, Z):
    A = sigmoid(Z)
    return dA * A * (1 - A)

def backward_propagation(AL, Y, cache):
    grads = {}
    L = len(cache) // 3
    m = Y.shape[1]
    Y = Y.reshape(AL.shape)
    dZL = AL - Y

    dAL_prev = dZL
    for l in reversed(range(1, L+1)):
        A_prev = cache['A' + str(l-1)]
        dZ = np.multiply(sigmoid_backward(dAL_prev, cache['Z' + str(l-1)]), dAL_prev)
        grads['dW' + str(l)] = np.dot(dZ, A_prev.T) / m
        grads['db' + str(l)] = np.sum(dZ, axis = 1, keepdims=True) / m
        dAL_prev = np.dot(cache['W' + str(l)].T, dZ)
    return grads

grads = backward_propagation(AL, y_train, cache)
  1. 使用梯度下降法更新参数。
def update_params(params, grads, learning_rate):
    L = len(params) // 2

    for l in range(1, L+1):
        params['W' + str(l)] = params['W' + str(l)] - learning_rate * grads['dW' + str(l)]
        params['b' + str(l)] = params['b' + str(l)] - learning_rate * grads['db' + str(l)]

    return params

params = update_params(params, grads, learning_rate = 0.01)

四、模型训练和预测

  1. 定义模型训练函数,使用整个数据集进行多次迭代来训练神经网络模型。
def model(X_train, Y_train, layer_dimensions, learning_rate = 0.01, num_iterations = 10000, print_cost = False):
    params = init_params(layer_dimensions)

    for i in range(num_iterations):
        AL = forward_propagation(X_train, params)
        cost = compute_cost(AL, Y_train)
        grads = backward_propagation(AL, Y_train, cache)
        params = update_params(params, grads, learning_rate)

        if print_cost and i % 1000 == 0:
            print('Cost after iteration %i: %f' %(i, cost))

    return params

params = model(X_train.T, y_train.T, [4, 10, 3])
  1. 定义模型预测函数。
def predict(X, params):
    AL = forward_propagation(X, params)
    predictions = np.argmax(AL, axis = 0)
    return predictions

y_pred = predict(X_test.T, params)

五、代码示例

下面给出两个代码示例,分别使用神经网络解决手写数字识别和狗与猫分类问题。

  1. 手写数字识别

准备数据集。

from sklearn.datasets import load_digits

digits = load_digits()

X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target, test_size = 0.3)

X_train = X_train / np.max(X_train)
X_test = X_test / np.max(X_test)

y_train = one_hot(y_train)
y_test = one_hot(y_test)

定义模型。以多层神经网络为例。

params = model(X_train.T, y_train.T, [64, 128, 64, 10], learning_rate = 0.1, num_iterations = 3000, print_cost = True)

预测结果。

y_pred = predict(X_test.T, params)
  1. 狗与猫分类问题

准备数据集。

import os

path = 'train/'

def load_data(path):
    X = []
    y = []
    for file in os.listdir(path):
        if 'dog' in file:
            y.append(1)
        elif 'cat' in file:
            y.append(0)
        img = cv2.imread(os.path.join(path,file))
        img = cv2.resize(img, (64, 64), interpolation = cv2.INTER_AREA)
        X.append(img)

    return np.array(X), np.array(y)

X_train, y_train = load_data(path)
X_train, X_test, y_train, y_test = train_test_split(X_train, y_train, test_size = 0.3)
X_train = X_train / 255
X_test = X_test / 255

y_train = y_train.reshape((-1, 1))
y_test = y_test.reshape((-1, 1))

y_train = one_hot(y_train)
y_test = one_hot(y_test)

定义模型。以卷积神经网络为例。

params = model(X_train.T, y_train.T, [64, 128, 256, 512, 2], learning_rate = 0.001, num_iterations = 10, print_cost = True)

预测结果。

y_pred = predict(X_test.T, params)

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用NumPy从头开始实现神经网络 - Python技术站

(0)
上一篇 2023年3月25日
下一篇 2023年3月25日

相关文章

  • 用Python实现职工信息管理系统

    用Python实现职工信息管理系统 简介 本文将介绍如何使用Python实现一个职工信息管理系统。该系统将包括以下功能: 添加职工信息 删除职工信息 修改职工信息 查询职工信息 准备工作 在实现本系统之前,需要先安装Python解释器和相关库。我们强烈推荐使用Python 3.x版本。 安装完Python后,我们需要安装以下库: pandas:用于处理数据和…

    python 2023年5月30日
    00
  • python正则表达式之作业计算器

    以下是“Python正则表达式之作业计算器”的完整攻略: 一、问题描述 在Python中,我们可以使用正则表达式来实现一个简单的作业计算器。本文将详细讲解如何使用正则表达式来实现作业计算器,并提供两个示例说明。 二、解决方案 2.1 正则表达式 在作业计算器中,我们需要使用正则表达式来匹配用户输入的表达式,并计算表达式的值。以下是一个示例正则表达式: imp…

    python 2023年5月14日
    00
  • Python2及Python3如何实现兼容切换

    要实现Python2与Python3的兼容切换,主要需要以下几个步骤: 确定使用的Python版本:首先要确定当前使用的Python版本是Python2还是Python3,可以通过在命令行中输入python -V来查看当前使用的Python版本。 确认代码是否兼容:Python2和Python3之间存在语法差异,特别是在一些高级特性和某些内置函数的使用上,需…

    python 2023年5月14日
    00
  • python数字图像处理之图像的批量处理

    Python数字图像处理是基于Python程序语言的数字图像处理技术,具有灵活、高效、易学等特点。在实际应用中,有很多需要进行批量处理的图像处理任务,例如对大量图片进行压缩、裁剪、保存等操作,可以通过Python数字图像处理实现自动化处理。 本文将介绍如何利用Python实现图像的批量处理,主要包含以下步骤: 导入相关库 Python中有很多图像处理库,我们…

    python 2023年5月14日
    00
  • Python 中没有更改desired_word_found 变量

    【问题标题】:desired_word_found variable is not being changed in PythonPython 中没有更改desired_word_found 变量 【发布时间】:2023-04-02 03:04:01 【问题描述】: 我正在用 Python 编写一个简单的程序来确定一个单词是否包含在一段文本中。问题是,当在文…

    Python开发 2023年4月8日
    00
  • python用函数创造字典的实例讲解

    下面是关于“Python用函数创建字典的实例讲解”的完整攻略,具体过程如下: 1. 了解字典数据结构 在Python中,字典是一种非常常见的数据结构,其结构类似于Java和其他编程语言中的“Map”或“字典”。字典是由键和值组成的集合,其中每个键都必须是唯一的。 2. 使用字典字面量创建字典 Python中创建字典最简单的方法是使用字典字面量。您可以使用大括…

    python 2023年5月13日
    00
  • Python异常处理如何才能写得优雅(retrying模块)

    Python异常处理如何才能写得优雅(retrying模块) 在Python编程中,异常处理是非常重要的一部分。为了让代码更加优雅,我们可以使用retry块来异常。本文将详细讲解如何使用retrying模块来优雅地处理异常,包括retrying模块的安装、方法和两个示例。 安装retrying模块 在使用retrying模块之前,我们需要先安装它。可以使用命…

    python 2023年5月13日
    00
  • 使用python进行nc转tif的3种情况解决

    使用Python进行nc转tif的3种情况解决 本文将提供使用Python对nc文件进行tif格式转换的方法,分为以下3种情况: 转换单个nc文件 批量转换nc文件夹下所有文件 批量转换nc多级子文件夹下所有文件 在进行操作之前,请确保您的Python环境配置正确,并且已经安装了相关的库。 1.转换单个nc文件 这是最简单的情况,只需要用Python编写一个…

    python 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部