深度学习:手写感知机

news2024/11/25 22:38:15

在这里插入图片描述

文章目录

    • 前言
    • 感知机
    • 模型训练
    • 模型预测
    • 小结

前言

上面是一只猫,人类的大脑可以很轻松地识别出。人脑是如何识别的呢?

人类能够识别出这只猫,是因为这张图片具有猫的典型特征。例如,猫的耳朵、眼睛、猫须、嘴巴等独特的形态特征,可以迅速引起大脑的注意和识别。当我们的大脑看到这些特征时,能够与之前的经验相匹配,从而判断出这是一只猫。

计算机是否可以模拟人脑的方式,判断出这是一只猫呢?

要让计算机模拟人脑的识别过程,首先需要了解人脑的基本工作原理。

一个刚出生的大脑虽然有一定的感知能力,但识别能力尚未完全发育。人类通过视觉、听觉、嗅觉、触觉和味觉等感官获取外界的信息,神经系统将这些信息传递给大脑中的特定区域进行处理。大脑通过分析和整合这些感知信息,逐步学习并记忆不同事物的特征。随着经验的累积,大脑能够更快、更精确地识别出熟悉的事物。

感知机

虽然人脑的识别过程极为复杂,但计算机可以通过一些方式来简单地模仿这一过程。感知机 就是一种可以模仿人脑的方案。

感知机的工作原理是:

  1. 接收输入的特征值
  2. 通过训练数据对特征值学习
  3. 根据之前的学习结果,对新输入的数据进行判断

由于感知机的学习能力较弱,只能处理较为简单的、线性可分的任务,即可以用一条直线将数据划分的任务。

例如,我们可以通过实现一个简单的感知机来识别图片是否为一只猫。

import numpy as np

class Perceptron:
    def __init__(self, input_size, lr=0.01):
        """
        初始化感知机模型,设置权重和偏置,并定义学习率。
        :param input_size: 输入特征的维度大小
        :param lr: 学习率
        """
        self.weights = np.random.randn(input_size) * 0.01  # 权重随机初始化为小值
        self.bias = 0  # 偏置初始化
        self.lr = lr  # 学习率

    def activation(self, z):
        """
        阶跃函数,用于二分类任务。
        :param z: 输入的加权和
        :return: 返回1(正类)或0(负类)
        """
        # 使用 NumPy 的向量化方式处理 z
        return np.where(z >= 0, 1, 0)

    def predict(self, x):
        """
        对给定的输入样本进行预测。
        :param x: 输入特征
        :return: 分类结果(1或0)
        """
        z = np.dot(x, self.weights) + self.bias  # 计算加权和
        return self.activation(z)

    def train(self, x_train, y_train, epochs=100):
        """
        训练感知机模型。
        :param x_train: 训练数据特征
        :param y_train: 训练数据标签
        :param epochs: 训练的迭代次数
        """
        for epoch in range(epochs):
            total_error = 0  # 每个 epoch 初始化总误差
            for i in range(len(x_train)):
                x = x_train[i]
                y = y_train[i]
                y_pred = self.predict(x)
                error = y - y_pred
                total_error += np.abs(error)  # 计算绝对误差

                # 根据误差更新权重和偏置
                self.weights += self.lr * error * x
                self.bias += self.lr * error
            
            # 每个 epoch 完成后打印总误差
            print(f'Epoch {epoch + 1}/{epochs}, Total Error: {total_error}')

模型训练

感知机就如同人类的大脑,通过学习之后会掌握一些能力。为了让这颗人造的“大脑”能够识别猫,我们可以让感知机不断地学习猫的特征。

这里有几个关键点:

  1. 计算机如何读取猫的特征
  2. 计算机应该读取哪些特征

计算机并没有眼睛,不能像人类一样用眼睛观察猫。为了解决这个问题,我们可以给猫拍照,然后让计算机通过图片来学习猫的特征。

但是,只依赖少量图片进行学习,感知机可能无法很好地识别猫的特征。类似于我们初次进入动物园时,需要多次观察猴子和狒狒才能区分它们的不同。为了简化这一过程,我们可以采用 CIFAR-10 数据集,这个数据集包含了数千张图片,包括我们需要的猫的图片。

有了数据,我们就可以开始使用感知机进行训练了。感知机不会自动知道哪些特征重要。因此,它只会根据输入的数值化特征进行学习。这个过程称为 特征提取

在训练过程中,感知机会尝试调整它的权重来找到一个能够将猫与其他动物区分开的 分类边界。在这个例子中,我们进行了 10 次训练,然后将训练的结果存储起来。不过,由于感知机只适用于线性可分的任务,如果图片中的猫和其他物体的特征无法用线性方式区分,感知机将无法很好地完成识别任务。

import joblib
from tensorflow.keras.datasets import cifar10
from perceptron_model import Perceptron
from sklearn.preprocessing import StandardScaler
import numpy as np
import time

# 第1步:加载 CIFAR-10 数据集
(x_train, y_train), (x_test, y_test) = cifar10.load_data()

# 第2步:定义猫的标签
cat_label = 3

# 第3步:预处理数据
x_train_flat = x_train.reshape(x_train.shape[0], -1)  # 展平图像
x_test_flat = x_test.reshape(x_test.shape[0], -1)

# 使用 StandardScaler 进行标准化
scaler = StandardScaler()
x_train_scaled = scaler.fit_transform(x_train_flat)
x_test_scaled = scaler.transform(x_test_flat)

y_train_cat = (y_train == cat_label).astype(int).flatten()
y_test_cat = (y_test == cat_label).astype(int).flatten()

# 第4步:初始化感知机并训练模型
input_size = x_train_scaled.shape[1]  # 输入特征维度
perceptron = Perceptron(input_size, lr=0.01)
perceptron.train(x_train_scaled, y_train_cat, epochs=10)

# 第5步:模型评估(使用批处理提高效率)
predictions = perceptron.predict(x_test_scaled)
accuracy = np.mean(predictions == y_test_cat)
print(f"模型在测试集上的准确率: {accuracy:.2f}")

# 第6步:保存模型
model_data = {
    'weights': perceptron.weights,
    'bias': perceptron.bias,
    'scaler': scaler,
    'version': '1.0',
    'train_time': time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime()),
    'test_accuracy': accuracy,
    'hyperparameters': {'learning_rate': 0.01, 'epochs': 10}
}

try:
    joblib.dump(model_data, 'perceptron_cat_model_v1.pkl')
    print("模型已保存!")
except Exception as e:
    print(f"模型保存失败: {e}")

模型训练结果:

模型预测

我们创建的大脑——感知机,已经学习了猫的特征。现在,我们可以使用它所学习的结果来识别一张新的猫的图片。

首先,我们从 CIFAR-10 数据集中取出一张猫的图片。因为感知机只能处理数值化的特征,我们需要先将这张图片转化为感知机可以理解的形式,例如将图像的像素值展平成一维数组。接下来,启动感知机并加载之前保存的训练结果。

感知机通过已经学到的权重和线性分类器,对输入的图像数据进行计算。它将判断这张图片是否符合之前所学习到的“猫”的特征。如果符合,它会将这张图片判断为猫,否则会判断为其他类别。

import numpy as np
import joblib
from tensorflow.keras.datasets import cifar10
from perceptron_model import Perceptron
import logging

logging.basicConfig(level=logging.INFO)

def preprocess_image(image, scaler):
    image_flat = image.reshape(1, -1)
    image_scaled = scaler.transform(image_flat)
    return image_scaled

def is_cat(image, model, scaler):
    image_scaled = preprocess_image(image, scaler)
    prediction = model.predict(image_scaled[0])
    logging.info(f"模型预测输出: {prediction}")
    return prediction == 1

def load_model(filepath='perceptron_cat_model_v1.pkl'):
    try:
        model_data = joblib.load(filepath)
        return model_data
    except FileNotFoundError:
        logging.error("模型文件未找到,请检查路径。")
        return None
    except Exception as e:
        logging.error(f"模型加载失败: {e}")
        return None

def evaluate_model(model, scaler, images, labels):
    predictions = [is_cat(img, model, scaler) for img in images]
    accuracy = np.mean(predictions == (labels == 3))
    logging.info(f"模型准确率: {accuracy * 100:.2f}%")
    return accuracy

# 加载 CIFAR-10 数据集
(x_train, y_train), (x_test, y_test) = cifar10.load_data()

# CIFAR-10 类别索引
cat_class_index = 3
cat_images = x_test[y_test.flatten() == cat_class_index]

# 加载保存的模型
model_data = load_model('perceptron_cat_model_v1.pkl')
if model_data is None:
    raise Exception("模型加载失败")

# 恢复模型和预处理器
perceptron = Perceptron(input_size=3072)
perceptron.weights = model_data['weights']
perceptron.bias = model_data['bias']
scaler = model_data['scaler']

# 评估模型
evaluate_model(perceptron, scaler, cat_images, y_test[y_test.flatten() == cat_class_index])

# 选择一张图片进行预测
test_image = cat_images[0]
if is_cat(test_image, perceptron, scaler):
    print("这是一张猫的图片!")
else:
    print("这不是猫的图片。")

模型识别结果:

小结

感知机是一种早期模拟大脑工作机制的模型,尽管它为人工智能带来了重要的启示,但也存在明显的局限性。比如,它的模拟能力不够准确,无法有效处理复杂问题。然而,感知机依然为我们探索更复杂的人工智能模型奠定了基础。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2207576.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

gcc学习

理论 在使用 GCC (GNU Compiler Collection) 进行 C 或 C 程序的编译时,可以将整个过程分为四个主要阶段:预处理、编译、汇编和链接。下面是每个阶段的命令示例: 1. 预处理-E 预处理阶段会处理所有的预处理指令(如 #include 和…

ArcGis JS天地图 暗色地图

方法一&#xff1a;使用css filter 在body下增加svg&#xff0c;并增加需要用到的滤镜&#xff0c;这边用到x-rays <svg id"svgfilters" aria-hidden"true" style"position: absolute; width: 0; height: 0; overflow: hidden"version"…

刷题 排序算法

912. 排序数组 注意这道题目所有 O(n^2) 复杂度的算法都会超过时间限制&#xff0c;只有 O(nlogn) 的可以通过 快速排序空间复杂度为 O(logn)是由于递归的栈的调用归并排序空间复杂度为 O(n) 是由于需要一个临时数组 (当然也需要栈的调用&#xff0c;但是 O(logn) < O(n) 的…

【华为】配置RIP协议

RIP&#xff08;Routing Information Protocol&#xff09;是一种内部网关协议&#xff08;IGP&#xff09;&#xff0c;主要用于小型网络中的动态路由。RIP有两个主要版本&#xff1a;‌RIPv1和‌RIPv2&#xff0c;它们之间存在一些关键区别&#xff1a; ‌分类支持‌&#xf…

利用FnOS搭建虚拟云桌面,并搭建前端开发环境(一)

利用FnOS搭建虚拟云桌面&#xff0c;并搭建前端开发环境 一 飞牛FnOS官方文档一、安装FnOS【Win11系统】1.下载VirtualBox2.下载FnOS镜像3.创建虚拟机4.启动完成后&#xff0c;会进入这样一个界面&#xff0c;这个基本上后续就后台了 本人在网上冲浪了很久&#xff0c;一直也没…

python pyqt5 +vtk 显示obj模型文件

python pyqt5 vtk 显示obj模型文件 准备代码参考 准备 名称版本python3.8.19pyqt55.15.9pyqt5-tools5.15.9.3.3pyqt5-sip12.15.0vtk9.3.1 代码 使用wsl2 和 XLaunch 配合pyqt5进行可视化是可行的。使用pip在conda环境中安装pyqt5相关组件。以下代码在 WSL2 的 Ubuntu 20.04 …

Java运算符逻辑控制

目录 一、运算符 1.1基本四则运算符&#xff08;加减乘除模&#xff09; 1.2增量运算符 1.3关系运算符 1.4自增、自减运算符 1.5逻辑运算符 1.6位运算符 1.7移位运算符 1.8条件运算符&#xff08;三目运算符&#xff09; 二、逻辑控制 2.1if语句 2.2switch语句 2.…

Docker 搭建mysql 连接超时问题,xxl-job启动mysql连接报错

1.本地连接Navicat报错信息&#xff0c;猜测是navicat默认连接超时导致的&#xff0c;后面换成idea一个插件虽然慢但连接上了 2013 - Lost connection to MySQL server at reading initial communication packet 2.启动xxl-job会报错&#xff0c;网上有人mysql驱动与数据库不匹…

【高频SQL基础50题】31-35

又到SQL。 目录 1.查询结果的质量和占比 2.求关注者的数量 3.指定日期的产品价格 4.好友申请 II &#xff1a;谁有最多的好友 5.按日期分组销售产品 1.查询结果的质量和占比 聚合题。 # Write your MySQL query statement below SELECT t1.query_name,ROUND((SUM(t1.r…

问题记录(个人)

备注&#xff1a; 在7月10日记录之前遇到的问题及解决方法: 一&#xff1a;常见的访问问题&#xff1a; 403 Forbidden&#xff1a;&#xff08;未有请求权限&#xff09; 表示服务器理解请求但是拒绝执行它。这通常是由于服务器上的文件或资源没有正确的读、写或执行权限&…

【从零开始的LeetCode-算法】3164.优质数对的总数 II

给你两个整数数组 nums1 和 nums2&#xff0c;长度分别为 n 和 m。同时给你一个正整数 k。 如果 nums1[i] 可以被 nums2[j] * k 整除&#xff0c;则称数对 (i, j) 为 优质数对&#xff08;0 < i < n - 1, 0 < j < m - 1&#xff09;。 返回 优质数对 的总数。 示…

python画图|多个Y轴分列右侧

【1】引言 前述python画图学习中&#xff0c;已经探索过X轴和Y轴的共享&#xff0c;可通过下述链接直达&#xff1a; 西猫雷婶-CSDN博客 但现实的画图实践中总会有新的要求&#xff0c;之前将所有轴合到一起的形式可能不再适用&#xff0c;因此&#xff0c;很有必要探索多个…

下一代安全:融合网络和物理策略以实现最佳保护

在当今快速发展的技术环境中&#xff0c;网络和物理安全融合变得比以往任何时候都更加重要。随着物联网 (IoT) 和工业物联网 (IIoT) 的兴起&#xff0c;组织在保护数字和物理资产方面面临着独特的挑战。 本文探讨了安全融合的概念、说明其重要性的实际事件以及整合网络和物理安…

Pandas处理时间序列之光谱分析与聚类

import matplotlib.pylab as plt %matplotlib inline import numpy as np from numpy import fft import pandas as pd 一、光谱分析 • 将时间序列分解为许多正弦或余弦函数的总和 • 这些函数的系数应该具有不相关的值 • 对正弦函数进行回归 光谱分析应用场景 基于光谱的…

Windows 修改 Alt+Tab 键 切换 新版 Microsoft Edge 单个标签页/窗口

Windows 10 修改 AltTab 键 切换 新版 Microsoft Edge 单个标签页/窗口 解决方案&#xff1a;在 Windows 设置 的搜索框中 搜索 alt&#xff0c;选择 选择按下 AltTab 时显示的窗口和选项卡&#xff0c;将 按 Alt Tab 将显示 选为 仅打开的窗口 详细过程&#xff1a; 在 Win…

打造高效3D打印利器:STEP转STL格式转换器

随着3D打印技术的日益普及&#xff0c;越来越多的设计师和工程师开始使用三维建模软件来创建复杂的产品模型。然而&#xff0c;不同的软件往往采用不同的文件格式&#xff0c;这给模型的共享和打印带来了诸多不便。本文将重点介绍STEP格式转STL格式的转换器&#xff0c;帮助大家…

【图论】(三)图论的并查集问题

图论的并查集问题 并查集理论基础并查集理论路径压缩代码模板模拟过程 找亲戚寻找存在的路径冗余连接冗余连接II 并查集理论基础 参考学习视频&#xff1a; 图论——并查集(详细版) 并查集理论 并查集主要用于处理一些不相交集合的合并问题&#xff08;连通性问题&#xff0…

汽车网络安全 -- 后量子密码时代还远吗?

目录 1.量子计算对密码学的威胁 1.1 传统密码学速览 1.2 量子计算对密码学的威胁 2.后量子密码学 2.1 量子计算原理 2.2 后量子密码学 3.未来汽车网络安全面临的威胁 3.1 量子计算对汽车的威胁 3.2 TC4xx对于PQC算法的支持 国庆抽空回顾了下Hitex组织的《Designing wi…

西门子S7-1200选型指南之概述

S7-1200 控制器概述 S7-1200 虽然只是中小型控制器&#xff0c;但是功能很全面。它具有较高性能&#xff0c;并且具有很强的扩展能力&#xff0c;通信能力多种多样&#xff0c;本体即具有各种常见工艺功能&#xff0c;此外也具备西门子常见的诊断功能&#xff0c;下面将分几部…

vue3 + vite + cesium项目

GitHub - tingyuxuan2302/cesium-vue3-vite: 项目基于 vue3 vite cesium&#xff0c;已实现常见三维动画场&#xff0c;欢迎有兴趣的同学加入共建&#xff0c;官网服务器相对拉胯&#xff0c;请耐心等候...https://github.com/tingyuxuan2302/cesium-vue3-vite/tree/github