机器学习-猫狗识别(入门案例)

2023-05-16

案例分析:下载猫狗图片,进行分类。对数据进行分类,训练集和测试集。
训练集和测试集都进行命名规范,把猫标记为1,狗标记为0
处理流程: 数据处理,把数据处理为64X64大小的格式,参数初始化分被初试化 各层权重 W 和 偏置 b,(一般情况下W进行随机赋值,b赋值为1),前向传播,确定激活函数(浅层选择tanh函数,深层选择ReLu),交叉熵损失反向传播(梯度下降),更新参数,构建神经网络,训练进行测试,进行优化(后面还会更新的)。
导包引用:

import os
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
import skimage.io as io

数据处理:

在这里插入图片描述

def clean(path, save_path, w=64,h=64):
    """

    :param path: 读取图片的路径
    :param save_path: 存放图片的路径
    :param w: 图片宽度
    :param h: 图片高度
    :return:
    """

    if not os.path.exists(save_path):
        os.mkdir(save_path)
    file_names = os.listdir(path) # 获取路径下所有文件的名字

    for file_name in file_names:
        bl_dir = os.path.isdir(path + "/" + file_name)
        if bl_dir:
            lower_directory = path + "/" + str(file_name)
            save_ds = save_path + "/" + str(file_name)
            if not os.path.exists(save_ds):
                os.mkdir(save_ds)
            lower_directory_names = os.listdir(lower_directory)
        else:
            lower_directory = path
            lower_directory_names = file_names

        for lower_directory_name in lower_directory_names:

            # # print(save_name)
            bl_save_dir = os.path.isdir(lower_directory + "/" + lower_directory_name)
            photo_path = lower_directory + "/" + lower_directory_name
            save_name = lower_directory + "/" + lower_directory_name

            try:
                pic = Image.open(photo_path)
                pic = pic.resize((w, h))

                pic.save(save_name)

                print("成功")
            except:
                print("fail")

数据准备

def normalization():
    train_file = "dataset/train/*.jpg"
    test_file = "dataset/test/*.jpg"
    train_coll = io.ImageCollection(train_file)  # 加载文件下所有以.jpg的图片
    test_coll = io.ImageCollection(test_file)
    X_train = np.asarray(train_coll)  # 转成成array
    Y_train = np.hstack((np.ones((1, 250)), np.zeros((1, 250))))
    X_test = np.asarray(test_coll)
    Y_test = np.hstack((np.ones((1, 98)), np.zeros((1, 99))))
    m_train = X_train.shape[0]
    w, h, d = X_train.shape[1], X_train.shape[2], X_train.shape[3]
    print("训练集样本%d " % m_train)
    print(w, h, d)

    m_test = X_test.shape[0]
    print("测试样本有%d" % m_test)

    idx = [np.random.choice(m_train) for i in range(10)]
    lable = Y_train[0, idx]
    for i in range(2):
        for j in range(5):
            plt.subplot(2, 5, 5 * i + j + 1)
            plt.imshow(X_train[idx[5 * i + j]])
            plt.title("y=" + str([lable[5 * i + j]]))
            plt.axis('off')
    plt.show()
    X_train = X_train.reshape(m_train, -1).T
    print("训练样本维度" + str(X_train.shape))
    X_train = X_train / 250

    X_test = X_test.reshape(m_test, -1).T
    X_test = X_test / 250

    return X_train, Y_train, X_test, Y_test

参数初始化

def initialize_parameters(layer_dims):
    """
	W权重进行随机,b初始化为1
    :param layer_dims: 网络层神经元个数
    :return: 储存参数的字典
    """
    np.random.seed(5)

    parameters = {}

    L = len(layer_dims)

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

    return parameters

前向传播

def relu(Z):
    """
	深度网络选择Relu
    :param Z: 激活函数输入 神经元线性输出
    :return: A 激活函数输出,神经元非线性输出
    """
    A = np.maximum(0, Z)

    return A


def sidmoid(Z):

    """
	浅层网络 sidmoid
    :param Z: 激活函数输入 神经元线性输出
    :return: A 激活函数输出,神经元非线性输出
    """
    A = 1 / (1 + np.exp(-Z))

    return A
# 前向传播
def single_layer_forward(A_prev, W, b, activation):
    """

    :param A_prev: 该网络的输入,上层网络的输出
    :param W: 该层网络的权重
    :param b: 该层网络的偏置参数
    :param activation: 激活函数
    :return: A 该网络的输出层
           cache: 储存所有的中间变量 A_prev W b Z
    """

    Z = np.dot(W, A_prev) + b
    if activation == "sigmoid":
        A = sidmoid(Z)
    elif activation == "relu":
        A = relu(Z)
    cache = (A_prev, W, b, Z)

    return A , cache
    def forward_propagation(X, parameters):
    """

    :param X: 神经网络的输入
    :param parameters:  该层网络的权重数据
    :return:  A 该层网络的输出  cache 储存该层网络所有的中间变量
    """

    caches = []
    A = X
    L = len(parameters)   # 因为有wb两个,所以需要除以2
    L = int(L/2)
    for l in range(1, L):
        A_prev = A
        A, cache = single_layer_forward(A_prev, parameters['W' + str(l)], parameters['b' + str(l)], "relu")

        caches.append(cache)

    Al, cache = single_layer_forward(A, parameters['W' + str(L)], parameters['b' + str(L)], "sigmoid")
    caches.append(cache)

    return Al, caches

交叉熵损失

def compute_cost(AL, Y):
    """

    :param AL:神经网络输出层输出
    :param Y: 神经网络真是标签
    :return: 交叉熵损失
    """
    m = AL.shape[1]
    cross_entropy = -(Y * np.log(AL) + (1 - Y) * np.log(1 - AL))
    cost = 1.0 / m * np.sum(cross_entropy)

    return cost

反向传播

def relu_backward(dA, Z):
    """

    :param dA: A 的梯度
    :param z: 神经网络的输出
    :return: dZ Z的梯度
    """

    dZ = np.array(dA, copy=True)
    dZ[Z <= 0] = 0

    return dZ

def sigmoid_backward(dA, Z):
    """

    :param dA:A 的梯度
    :param Z: 神经网络的输出
    :return: dZ Z的梯度
    """
    s = 1/ (1 + np.exp(-Z))
    dZ = dA * s * (1-s)
    return dZ

def single_layer_backward(dA, cache, activation):
    """
    :param dA:A 的梯度
    :param cache: 储存所有中间变量 A_prev W b Z
    :param activation: 选择的激活函数
    :return: dA_prev 上一层A_prev 的梯度 dW 参数W的梯度 db 参数b梯度
    """
    A_prev, W, b, Z = cache
    if activation == "relu":
        dZ = relu_backward(dA, Z)
    elif activation == "sigmoid":
        dZ = sigmoid_backward(dA, Z)

    m = dA.shape[1]
    dW  = 1/m*np.dot(dZ, A_prev.T)
    db = 1 / m * np.sum(dZ, axis=1, keepdims=True)
    dA_prev = np.dot(W.T, dZ)
    return dA_prev, dW, db

def backward_propagarion(AL, Y, caches):
    """

    :param AL: 神经网络输出的层数
    :param cache:  储存所有中间变量 A_prev W b Z
    :param Y:真实标签
    :return: grads 所有参数梯度
    """
    gards = {}
    L = len(caches)
    m = AL.shape[1]

    dAL = -(np.divide(Y, AL) - np.divide(1 - Y , 1 - AL))
    current_cache = caches[L-1]
    gards["dA" + str(L-1)],gards["dW" + str(L-1)], gards["db" + str(L-1)] = single_layer_backward(dAL, current_cache, activation="sigmoid")

    for l in reversed(range(L-1)):
        current_cache = caches[l]
        dA_prev_temp, dW_temp, db_temp = single_layer_backward(gards["dA" + str(l + 1)], current_cache, activation="relu")
        gards["dA" + str(l)] = dA_prev_temp
        gards["dW" + str(l)] = dW_temp
        gards["db" + str(l)] = db_temp

    return gards

更新参数


def update_parameters(parameters, grads, learning=0.1):
    """

    :param parameters: 网络参数
    :param grads: 神经网络参数梯度
    :param learning: 学习速率
    :return: 网络参数
    """

    L = len(parameters)
    L = int(L/2)
    for l in range(L):
        parameters["W" +str(l+1)] -= learning * grads["dW" + str(l)]
        parameters["b" +str(l+1)] -= learning * grads["db" + str(l)]

    return parameters

构建模型

def nn_model(X, Y, layers_dims, num_iterations=300, learning_rate=0.01,):
    """

    :param X:神经网络输入
    :param Y: 样本标签
    :param layers_dims:神经网络各层神经元个数,包括输入层和输出层
    :param learning_rate: 学习速率
    :param num_iterations: 学习率
    :return:  训练完成后的网络模型
    """

    np.random.seed(1)
    costs = []

    parameters = initialize_parameters(layers_dims)

    for i in range(num_iterations):
        AL, caches = forward_propagation(X, parameters)
        cost = compute_cost(AL, Y)
        grads = backward_propagarion(AL, Y, caches)

        parameters = update_parameters(parameters, grads, learning_rate)

        if (i+1) % 100 == 0:
            print("Cost after iteration %i : %f" % (i+1, cost))
            costs.append(cost)

    plt.plot(np.squeeze(costs))
    plt.ylabel('cost')
    plt.xlabel('loop humber')
    plt.title("learning" + str(learning_rate))
    plt.show()
    plt.close()

    return parameters

进行预测

def predit(X, parameter):
    """

    :param X:神经网络输入
    :param parameter: 训练完成后的网络参数
    :return: 预测样本标签
    """

    AL, caches = forward_propagation(X, parameter)
    Y_pred = np.zeros((1, X.shape[1]))
    Y_pred[AL > 0.5] = 1

    return Y_pred
if __name__ == "__main__":
    layers_dims = [64*64*3, 200, 100, 10, 1]
    X_train, Y_train, X_test, Y_test = normalization()
    parameters = nn_model(X_train, Y_train, layers_dims, num_iterations=2000, learning_rate=0.01)
    # print(parameters)


    Y_test_pred = predit(X_test, parameters)
    print(Y_test_pred)
    print("*" * 50)
    print(Y_test)
    acc_test = np.mean(Y_test_pred == Y_test)
    print("测试数据的精确度为:%f " % (acc_test))

运行结果:网络结构(输入层 隐藏层(1) 输出层)迭代1000
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
参考书目:深度学习入门(基于pytorch和TensorFlow的理论与实现)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

机器学习-猫狗识别(入门案例) 的相关文章

  • MQ-2烟雾传感器模块功能实现(STM32)

    认识MQ 2模块与其工作原理 MQ 2型烟雾传感器属于二氧化锡半导体气敏材料 xff0c 属于表面离子式N型半导体 当处于200 300摄氏度时 xff0c 二氧化锡吸附空气中的氧 xff0c 形成氧的负离子吸附 xff0c 使半导体中的电
  • [编程题]提取不重复的整数

    Talk is cheap show me the code 一 问题描述 输入一个int型整数 xff0c 按照从右向左的阅读顺序 xff0c 返回一个不含重复数字的新的整数 输入描述 xff1a 输入一个int型整数 输出描述 xff1
  • [编程题]判断两个IP是否属于同一子网

    Talk is cheap show me the code 一 问题描述 子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据 二 问题分析 这道题又是一道坑题 xff0c 题意没描述清楚 xff0c 首先判断一个ip或者m
  • centos7永久关闭防火墙

    首先输入用户名和密码进入centos7 接着先是看centos7的防火墙的状态 xff0c 查看的命令为 sudo systemctl status firewalld 查看后 xff0c 看到active running 就意味着防火墙打
  • ubuntu系统安装Go和liteide及环境配置

    大家好 xff0c 我是加摩斯 xff0c 觉得文章有帮助的小伙伴 xff0c 记得一键三连哟 xff5e 申明 xff1a 原创 xff0c 转载前请与我沟通 搭建环境是编程中最基本的工作 xff0c 但有时方法不对 xff0c 也会踩到
  • OVS的作用OVS 总体架构、源码结构及数据流程全面解析

    为什么要有OVS 1 xff09 方便网络管理与监控 OVS 的引入 xff0c 可以方便管理员对整套云环境中的网络状态和数据流量进行监控 xff0c 比如可以分析网络中流淌的数据包是来自哪个 VM 哪个 OS 及哪个用户 xff0c 这些
  • LATEX——两张图并列排列/双栏模板中图片通栏并列布局

    LATEX 两张图并列排列 双栏模板中图片通栏并列布局 正常插入图片并列插入两张图片双栏模板中图片通栏并列布局1 不同图片使用不同标题 xff0c 不同编号 双栏模板中图片通栏并列布局2 xff08 不同图片使有不同的小标题 xff0c 但
  • SUMO输出文件设置

    1 fcd浮动车数据输出 轨迹数据输出 sumo c demo sumocfg fcd output fcd1 xml 2 设置E3检测器 E3检测器简介 Multi Entry Exit Detectors xff08 E3 xff09
  • 私有地址

    私有地址 xff08 Private address xff09 属于非注册地址 xff0c 专门为组织机构内部使用 以下表列出留用的内部寻址地址 A类 10 0 0 0 10 255 255 255 B类 172 16 0 0 172 3
  • apereo CAS Server 6.2.x 和 6.4.x 的部署

    代码地址 xff0c 分别下载6 2和6 4两个版本 https github com apereo cas overlay template 版本地址 xff1a https github com apereo cas overlay t
  • 微信小程序学习第九课:总结JS页面 radio (单选)向后台传值

    1 data里增加 dengji 0 dengjiitems name 34 优 34 value 34 1 34 name 34 良 34 value 34 0 34 34 checked 34 39 true 39 name 34 中
  • 微信小程序WXSS加虚线

    cartLeft width 50 height 100rpx border right 1rpx dashed a7a8a8
  • 没见过这么恶心的,钉钉开发同一个ip只能被一个企业使用

    关键是把另外一个企业的IP改了 xff0c 还是提示 xff01 同一个ip只能被一个企业使用 创建企业自建应用 xff0c 提示 同一个ip只能被一个企业使用 xff0c 请您参考以下内容确认 xff1a 1 如果是授权定制服务商开发的应
  • Workbench的服务器公网白名单:

    登录名称 Administrator 64 139 196 54 95 3389 实例id i uf6exzqcieg2y4tvzly1 实例名称 launch advisor 20200109 登录实例失败 xff0c 原因 连接实例 i
  • 【PHP】使用mpdf生成pdf文件

    本文主要需求是将html页面转换为pdf文档 1 安装mpdf工具类 xff08 composer方式 xff09 composer require mpdf mpdf 8 0 3 2 控制器里调用 lt php public functi
  • ubuntu2004安装cuda11.7+cuDNN8.6 deb版本

    ubuntu2004安装cuda11 7 43 cuDNN8 6 deb版本 1 显卡驱动安装1 1查看驱动版本 2 安装cuda2 1安装前检查2 2下载CUDA11 72 3安装2 4设置环境变量2 5检测 3 cuDNN安装3 1下载
  • FastAdmin 插件离线安装不成功的原因

    离线安装 1 xff09 登录后台 进入插件管理 xff0c 选择本地安装或者是离线安装 2 xff09 安装时会进行压缩包验证 版本依赖 判断 xff0c 提升从官网下载压缩包 3 xff09 绕过判断 xff0c 直接安装的方式 xff
  • 微擎手机端传图总是提示4M限制修改

    app resource js app util js 这个文件里 fileSizeLimit 4194304 fileSingleSizeLimit 4194304 4194304最后加一个0就变40M了 4 1024 1024 61 4
  • 数学中的特殊符号

    正负号 xff1a 加号 xff1a 43 减号 xff1a 百分号 xff1a 等号 xff1a 61 a a xff0f b 61 a b a 0b xfe65 0 ab 61 a b a 0b 0 i 61 1 x 2 这个是x的2次
  • Ubuntu+ROS+opencv4.3.0 修改cv_bridge配置文件,解决ROS与opencv版本冲突问题

    Ubuntu18 04 43 ROS melodic 43 opencv4 3 0 修改cv bridge配置文件 xff0c 解决ROS使用不同版本opencv的冲突问题 在ros下使用opencv读取图像话题时 xff0c 在OpenC

随机推荐

  • Highcharts 柱状图不显示0

    Highcharts 柱状图显示0值会给人造成误解 xff0c 毕竟0值和空值是两个结果 解决方案 xff1a 将数据源 0值替换为null
  • FastReport模板字段为Null却显示0 ; 以及0被隐藏、不显示的解决方法

    FastReport模板字段为Null却显示0 以及0被隐藏 不显示的解决方法 字段为Null 不默认显示0 取消勾选后 xff0c null就不会显示0 数值0不隐藏 调整 xff1a 属性 HideZeros False xff0c 0
  • ASP.NET控件FileUpload实现Excel文件内容上传到数据库

    实现思路 xff1a Excel的内容并不可以直接上传到数据库 xff0c 所以先将Excel内容读取出来转化为DataSet xff0c 然后可以得到DataTable xff0c 遍历每一行 xff0c 存到数据库里就好了 前台只放了两
  • Echarts折线图平滑问题

    Echarts3 0官网上的折线图不够平滑 xff0c 有棱角 看着不舒服 xff08 个人感觉 xff09 xff0c 解决办法 xff1a 增加一个属性 smooth true name 39 最高气温 39 type 39 line
  • Visual Studio 附加到进程调试找不到问w3wp.exe的解决办法

    1 在IIS中部署好站点 xff0c 确保有一个应用程序池在跑 2 设置好断点后 xff0c 调试 gt 附加到进程 xff0c 勾选 显示所有用户的进程 xff0c 在英文输入法的状态下 xff0c 按下 W 键 xff0c 快速找到 w
  • DIV鼠标悬停显示文字

    最简洁的办法是加一个 title属性 lt div title 61 34 停止回放 34 gt lt div gt
  • OpenCV:多线程加速的多尺度模板匹配

    OpenCV中的模板匹配 matchTemplate 一直被诟病 xff0c 原因是不能多尺度识别且不能旋转识别 xff0c 后者比较复杂 xff0c 这里只讨论前者 网上多数示例都是从一张图上截取一个目标 xff0c 然后进行匹配识别 x
  • 如何快速转载CSDN中的博客

    以下内容转载自 https blog csdn net zhongjianblackberry article details 79456338 在参考 如何快速转载CSDN中的博客 后 xff0c 由于自己不懂html以及markdown
  • 5680在网设备开启端口聚合不断网的方法----我测试不断网

    在5680T做双端口聚合上行的时候 xff0c 要先给正在使用的端口开启端口聚合 比如目前使用0 19 0 端口千兆上行 xff0c 计划将0 19 0 和0 19 1的2个端口做端口聚合 xff0c 然后双千兆上行 网上查的说是直接输入
  • 正则表达式:(?:) 或 .*? 或 .+?

    一 这个代表不捕获分组 比较 X 和 X xff0c 前者是捕获分组 xff0c 后者不捕获 xff0c 区别在于正则表达式匹配输入字符串之后所获得的匹配的 xff08 数 xff09 组当中没有 X 匹配的部分 xff1b 例如 xff1
  • Maven 多个war项目的引用关系 overlay配置实例

    在Maven项目中 xff0c 一般是jar文件的依赖 xff0c 但是也要考虑一种情况 xff0c 那就是war项目的依赖 比如说base war项目包含基本的网页 xff0c 但是需要为另外有一个定制的war项目有几个页面是需要特别定制
  • NVIDIA CUDA, CUDNN, MATLAB配置

    64 NVIDIA 深度学习环境配置 配置NVIDIA GPU以支持MATLAB等计算平台进行并行计算 NVIDIA NVIDIA 支持并行计算 xff0c 可提高深度学习的计算效率 从硬件到软件的链条是 xff1a NVIDIA GPU
  • OAuth2.0四种授权模式以及Oauth2.0实战

    OAuth2 0四种授权模式以及Oauth2 0实战 首先我们得了解什么是Oauth2 0 xff0c 简单来说Oauth2 0它是一个授权协议 我们可能会听说过 xff0c 使用Oauth2 0来实现单点登录SSO xff0c 以及第三方
  • firewalld-cmd简介

    firewalld是centos7的一大特性 xff0c 最大的好处有两个 xff1a 支持动态更新 xff0c 不用重启服务 xff1b 第二个就是加入了防火墙的 zone 概念 firewalld有图形界面和工具界面 xff0c 由于我
  • hdfs创建文件夹及目录

    span class token keyword import span java span class token punctuation span io span class token punctuation span IOExcep
  • auto.js 入门学习(参考GitHub文档)

    GitHub开发文档 input span class token punctuation span span class token punctuation span i span class token punctuation span
  • python-名片管理系统

    span class token builtin class name shift span 43 F6 重命名 当修改变量名或者函数名是十分实用 from learn card manage span class token functi
  • 【linux】清理pip空间缓存

    输入命令查看内存使用情况 xff1a df h 发现 dev sda6 这个目录下可使用内存基本上没有了 xff0c 先需要对其进行清理缓存 切换到pip目录下 cd cache pip 为了防止直接删除出错 xff0c 先将要删除的文件复
  • YOLOv5 - AssertionError: Image not Found

    出现上图原因是val 路径还有中文 xff0c cv imread 不能识别 解决方法 xff1a 1 修改还有中文的文件名 2 使用绝对路径 xff0c 把测试图片放在含有中文的文件里面 下图的名称也无法读取 xff0c 可能是含有 xf
  • 机器学习-猫狗识别(入门案例)

    案例分析 xff1a 下载猫狗图片 xff0c 进行分类 对数据进行分类 xff0c 训练集和测试集 训练集和测试集都进行命名规范 xff0c 把猫标记为1 xff0c 狗标记为0 处理流程 xff1a 数据处理 xff0c 把数据处理为6