机器学习分类,损失函数中为什么要用Log,机器学习的应用

目录

损失函数中为什么要用Log

为什么对数可以将乘法转化为加法?

机器学习(Machine Learning)

机器学习的分类

监督学习

无监督学习

强化学习

机器学习的应用

应用举例:猫狗分类

1. 现实问题抽象为数学问题

2. 数据准备

3. 选择模型

4. 模型训练及评估

5.预测结果

推荐阅读


损失函数中为什么要用Log


​Loss 在使用似然函数最大化时,其形式是进行连乘,但是为了便于处理,一般会套上log,这样便可以将连乘转化为求和求和形式更容易求偏导,应用到梯度下降中求最优解;

由于log函数是单调递增函数,因此不会改变优化结果。

极大似然估计中取对数的原因:取对数后,连乘可以转化为相加,方便求导,这是因为对数函数的求导更加简单,对数函数的导数比原函数更容易计算和优化;除此之外对数函数 ln为单调递增函数,不会改变似然函数极值点。

为什么对数可以将乘法转化为加法?

log2(x*y) = log2(y) + log2(y)

1, 2 ,3 ,4,5, 6······

和指数序列

2^(1), 2^(2) ,2^(3) ,2^(4),2^(5), 2^(6)······

,可以看出上一序列是下一序列的指数部分。那么我们如果想计算2*8 = (2^(1))*(2^(3))就可以将指数部分先加起来,即1+3=4,然后找第二个序列进行对应,就得到了2^(4)=16。这就是对数里的思想啦。

机器学习(Machine Learning)

基本思路是模仿人类学习的过程,例如人们一般通过经验归纳,总结规律,从而预测未来。

机器学习本质上就是让计算机自己在数据中学习规律,并根据所得到的规律对未来数据进行预测。

比如,不需要通过编程来识别猫或狗,机器学习可以通过使用图片来进行训练,从而归纳和识别特定的目标。

机器学习算法包括如聚类、分类、决策树、贝叶斯、神经网络、深度学习(Deep Learning)等。

图片

机器学习的分类

机器学习经过几十年的发展,衍生出了很多种分类方法,这里按学习模式的不同,可分为

  • 监督学习
  • 半监督学习
  • 无监督学习
  • 强化学习。

为了便于理解,用灰色圆点代表没有标签的数据,其他颜色的圆点代表不同的类别有标签数据。监督学习、无监督学习、强化学习的示意图如下所示:

图片

监督学习

监督学习(Supervised Learning)是从有标签的训练数据中学习模型,然后对某个给定的新数据利用模型预测它的标签。如果分类标签精确度越高,则学习模型准确度越高,预测结果越精确。

监督学习主要用于回归和分类问题。

常见的监督学习的回归算法有:线性回归、回归树、K邻近、Adaboost、神经网络等

常见的监督学习的分类算法有:朴素贝叶斯、决策树、SVM、逻辑回归、K邻近、Adaboost、神经网络等。

无监督学习

无监督学习(Unsupervised Learning)是从未标注数据中寻找隐含结构的过程。其中,

自监督学习(Self-Supervised Learning)方法在最近的学术界和工业界几年备受关注。

无监督学习主要用于关联分析、聚类和降维

常见的无监督学习算法有:稀疏自编码(Sparse Auto-Encoder)、主成分分析(Principal Component Analysis, PCA)、K-Means算法(K均值算法)、DBSCAN算法(Density-Based Spatial Clustering of Applications with Noise)、最大期望算法(Expectation-Maximization algorithm, EM)等。

如果人工智能是一块蛋糕,强化学习好比蛋糕上的樱桃,监督学习好比蛋糕上的糖衣,而蛋糕本身是非监督学习。—— Yann Lecun

LeCun 的蛋糕强调了无监督的重要性,他认为这可以突破当前 AI 技术的局限性。今天的 AI 可以轻松对图像进行分类并识别声音,但不能执行诸如推理不同对象之间的关系或预测人类运动等任务。这是无监督学习可以填补空白的地方。

图片

强化学习

强化学习(Reinforcement Learning)类似于监督学习,但未使用样本数据进行训练,而是通过智能体(Agnet)与环境(Environment)的交互,在不断试错中进行学习的模式。

在监督学习和非监督学习中,数据是静态的、不需要与环境进行交互,比如猫狗识别,只要给出足够的差异样本,将数据输入神经网络中进行训练即可。

然而,强化学习的学习过程是动态的、不断交互的过程,所需要的数据也是通过与环境不断交互所产生的。

所以,与监督学习和非监督学习相比,强化学习涉及的对象更多,比如动作、环境、状态转移概率和回报函数等。

强化学习常用于机器人避障、棋牌类游戏(AlphaGo)、广告和推荐等应用场景中,解决的是决策问题。

机器学习的应用

机器学习是将现实中的问题抽象为数学模型,利用历史数据对数据模型进行训练,然后基于数据模型对新数据进行求解,并将结果再转为现实问题的答案的过程。

机器学习一般的应用实现步骤如下:

  • 将现实问题抽象为数学问题;

  • 数据准备;

  • 选择或创建模型;

  • 模型训练及评估;

  • 预测结果。

图片

应用举例:猫狗分类

这里我们以Kaggle上的一个竞赛Cats vs. Dogs(猫狗大战)来举例,感兴趣的同学可亲自动手实验。

图片

1. 现实问题抽象为数学问题

现实问题:给定一张图片,让计算机判断是猫还是狗?

数学问题:二分类问题,1表示分类结果是狗,0表示分类结果是猫。

2. 数据准备

数据下载地址:
https://www.kaggle.com/c/dogs-vs-cats。

 

下载 kaggle 猫狗数据集解压后分为 3 个文件 train.zip、 test.zip 和 sample_submission.csv。

训练集 train.zip,包含25000张已标记的图片文件,文件名格式为“类别.图片id.jpg”,类别为cat或dog,图片id为数字,如cat.0.jpg、dog.12247.jpg。训练集数据中标记为猫、狗的图片分别有12500张,比例1:1。

测试集 test.zip,包含12500张未标记的图片文件,文件名格式为“图片id.jpg”,图片id为数字,如1.jpg、11605.jpg。

数据集中图片尺寸大小不一,但在训练和测试时需要统一尺寸。数据中图像不一定完整包含完整猫或狗的身体,有的主体在图片中很小,图片背景复杂,图片里会出现人或其他物体,如左图1。另外,训练集中包含少量非猫或狗的图片,如右图2,这些异常数据大约占训练集的5.6 ‱,需要被清理掉。

这些异常图片文件名如下:cat.4688.jpg,cat.5418.jpg,cat.7377.jpg,cat.7564.jpg,cat.8100.jpg,cat.8456.jpg,cat.10029.jpg,cat.12272.jpg,dog.1259.jpg,dog.1895.jpg,dog.4367.jpg,dog.8736.jpg,dog.9517.jpg,dog.10190.jpg,dog.11299.jpg。

图片

复杂背景

图片

异常数据

  • sample_submission.csv 需要将最终测试集的测试结果写入.csv 文件中。

后续的实验中,我们将数据分成3个部分:训练集(60%)、验证集(20%)、测试集(20%),用于后面的验证和评估工作。一般三者切分的比例是:6:2:2,不过验证集并不是必须的,没有也是可以的。

图片

训练集、验证集、测试集作用这里说明一下:

  • 训练集用来调试神经网络

  • 验证集用来查看训练效果

  • 测试集用来测试网络的实际学习能力

训练集(train)毋庸置疑,是用于模型拟合的数据样本,用来调试网络中的参数。我们容易混淆的是验证集和测试集:验证集没有参与网络参数更新的工作,按理说也能用来测试网络的实际学习能力;测试集本来也能就是用来测试效果的,按理来说也能查看训练效果。

我们换个说法或者详细一些可能就会明白了:

验证集(validation): 查看模型训练的效果是否朝着坏的方向进行。验证集的作用是体现在训练的过程。举个栗子:通过查看训练集和验证集的损失值随着epoch的变化关系可以看出模型是否过拟合,如果是可以及时停止训练,然后根据情况调整模型结构和超参数,大大节省时间。

测试集(test): 用来评估模最终模型的泛化能力。但不能作为调参、选择特征等算法相关的选择的依据。测试集的作用是体现在测试的过程。

一个形象的比喻:

  • 训练集:学生的课本;学生根据课本里的内容来掌握知识。训练集直接参与了模型调参的过程,显然不能用来反映模型真实的能力(防止课本死记硬背的学生拥有最好的成绩,即防止过拟合)。

  • 验证集:作业;通过作业可以知道不同学生学习情况、进步的速度快慢。验证集参与了人工调参(超参数)的过程,也不能用来最终评判一个模型(刷题库的学生不能算是学习好的学生)。

  • 测试集:考试;考的题是平常都没有见过,考察学生举一反三的能力。所以要通过最终的考试(测试集)来考察一个学(模)生(型)真正的能力(期末考试)。

对原始数据进行三个数据集的划分,也是为了防止模型过拟合。当使用了所有的原始数据去训练模型,得到的结果很可能是该模型最大程度地拟合了原始训练数据。当新的样本出现,再使用该模型进行预测,效果可能还不如只使用一部分数据训练的模型。

import cv2
import os
import numpy as npimport random
import timeimport pickledata_dir = './data'  # 解压后数据start_time = time.time()print("正在制作数据....")# 图片统一大小100*100
# 训练集 20000张
# 测试集 剩下的所有,测试集从训练集中进行切分,因为测试集没有标签all_data_files = os.listdir(os.path.join(data_dir, "train/"))random.shuffle(all_data_files)  # 打乱文件顺序all_train_files = all_data_files[:20000]  # 前20000个图片用来训练
all_test_files = all_data_files[20000:]  # 后5000个图片用来测试train_images = []  # 存储图片对应的narry数组的
train_labels = []  # 存储图片对应标签
train_files = []  # 存储对应图片名test_images = []
test_labels = []
test_files = []for each in all_train_files:img = cv2.imread(os.path.join(data_dir, "train", each), 1)# print(img.shape)  # 每张图片的大小不一致,需要转换成统一大小resized_img = cv2.resize(img, (100, 100))img_data = np.array(resized_img)  # 统一转换成narray数组类型,因为tensorflow支持narraytrain_images.append(img_data)if 'cat' in each:train_labels.append(0)  # 0表示猫elif 'dog' in each:train_labels.append(1)  # 1表示狗else:raise Exception("\n%s is a wrong train file" % (each))train_files.append(each)for each in all_test_files:img = cv2.imread(os.path.join(data_dir, "train", each), 1)# print(img.shape)  # 每张图片的大小不一致,需要转换成统一大小resized_img = cv2.resize(img, (100, 100))img_data = np.array(resized_img)  # 统一转换成narray数组类型,因为tensorflow支持narraytest_images.append(img_data)if 'cat' in each:test_labels.append(0)  # 0表示猫elif 'dog' in each:test_labels.append(1)  # 1表示狗else:raise Exception("\n%s is a wrong test file" % (each))test_files.append(each)# print(len(train_images), len(test_images))train_data = {'images': train_images,'labels': train_labels,'files': train_files
}test_data = {'images': test_images,'labels': test_labels,'files': test_files
}with open(os.path.join(data_dir,"train-data"),'wb') as f:pickle.dump(train_data,f)with open(os.path.join(data_dir,'test-data'),'wb') as f:pickle.dump(test_data,f)end_time = time.time()print('制作结束,用时{}秒.'.format(end_time-start_time))

3. 选择模型

机器学习有很多模型,需要选择哪种模型,需要根据数据类型,样本数量,问题本身综合考虑。

如本问题主要是处理图像数据,可以考虑使用卷积神经网络(Convolutional Neural Network, CNN)模型来实现二分类,因为选择CNN的优点之一在于避免了对图像前期预处理过程(提取特征等)。

猫狗识别的卷积神经网络结构如下图所示:

图片

最下层是网络的输入层(Input Layer),用于读入图像作为网络的数据输入;最上层是网络的输出层(Output Layer),其作用是预测并输出读入图像的类别,由于只需要区分猫和狗,因此输出层只有2个神经计算单元;位于输入和输出层之间的,都称之为隐含层(Hidden Layer),也叫卷积层(Convolutional Layer),图示中包含3个隐含层。

4. 模型训练及评估

我们需要预先设定损失函数Loss计算得到的损失值,这里选择对数损失函数(Log Loss)作为模型评价指标。

对数损失函数(Log Loss)亦被称为逻辑回归损失(Logistic regression loss)或交叉熵损失(Cross-entropy loss),刻画的是两个概率分布之间的距离,是分类问题中使用广泛的一种损失函数。交叉熵损失越小,代表模型的性能越好

图片

  • n是测试集中图片数量;

  • y尖 是图片预测为狗的概率;

  • y_{i}如果图像是狗,则为1,如果是猫,则为0;

  • loge 是自然常数  为底的自然对数。

我们用准确率(Accuracy)来衡量算法预测结果的准确程度:

图片

  • TP(True Positive)是将正类预测为正类的结果数目;

  • FP(False Positive)是将负类预测为正类的结果数目;

  • TN(True Negative)是将负类预测为负类的结果数目;

  • FN(False Negative)是将正类预测为负类的结果数目。

from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense, Dropout, Convolution2D, MaxPool2D, Flatten
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.utils import to_categorical
import pickle
import numpy as npdef load_data(filename):with open(filename, 'rb') as f:data = pickle.load(f, encoding='utf-8')return np.array(data['images']), to_categorical(np.array(data['labels']), num_classes=2), np.array(data['files'])TRAIN_DIR = "data/train-data"train_images, train_labels, train_files = load_data(TRAIN_DIR)model = Sequential([Convolution2D(16, kernel_size=(3, 3), strides=(1, 1), padding="same", input_shape=(100, 100, 3), activation='relu'),# 100*100*96MaxPool2D((2, 2), strides=(2, 2), padding='same'),  # 50*50*96Convolution2D(32, kernel_size=(3, 3), strides=(1, 1), padding='same', activation='relu'),  # 50*50*192MaxPool2D((2, 2), strides=(2, 2), padding='same'),  # 25*25*192Convolution2D(64, kernel_size=(3, 3), strides=(1, 1), padding='same', activation='relu'),  # 25*25*384MaxPool2D((2, 2), strides=(2, 2), padding='same'),  #Convolution2D(128, kernel_size=(3, 3), strides=(1, 1), padding='same', activation='relu'),MaxPool2D((2, 2), strides=(2, 2), padding='same'),Flatten(),Dense(512, activation='relu'),Dropout(0.3),Dense(256, activation='relu'),Dropout(0.3),Dense(2)
])
# 模型编译
model.compile(optimizer=Adam(), loss='categorical_crossentropy', metrics=['accuracy'])
# 模型训练
model.fit(train_images, train_labels, batch_size=200, epochs=10)
# 训练完保存模型
model.save("cat_and_dog.h5") # hdf5文件 pip intall h5py

图片

训练过中的 loss 和 accuracy,使用GPU训练速度会更快,i5 CPU也是可以跑的,增加训练轮次,准确率会更高

5.预测结果

训练好的模型,我们可以看看模型的识别效果:

from tensorflow.keras.models import load_model
from tensorflow.keras.utils import to_categorical
import pickle
import numpy as npdef load_data(filename):with open(filename, 'rb') as f:data = pickle.load(f, encoding='utf-8')return np.array(data['images']), to_categorical(np.array(data['labels']), num_classes=2), np.array(data['files'])TEST_DIR = "data/test-data"              test_image, test_labels, test_files = load_data(TEST_DIR)model = load_model("cat_and_dog.h5") # 同时加载结构和参数# 模型评估loss, accuracy = model.evaluate(test_image, test_labels)
print("test loss", loss)
print("test accuracy", accuracy)

图片

至此,我们就完成了一个简单的机器学习二分类任务。重在明白流程,细节我们都会在日后的文章中慢慢说清楚。

推荐阅读

  • 一份最有效的小白学AI路线图

  • AI常用编程工具介绍与安装

  • XGBoost详解

  • 通俗易懂详解注意力机制

  • 关于Attention的总结

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

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

相关文章

Tcp 协议的接口测试

首先明确 Tcp 的概念,针对 Tcp 协议进行接口测试,是指基于 Tcp 协议的上层协议比如 Http ,串口,网口, Socket 等。这些协议与 Http 测试方法类似(具体查看接口自动化测试章节),但在测…

iMX6ULL QT环境配置 | CMake在Linux下的交叉编译环境搭建及使用

习惯了使用cmake,再也不想回到手写makefile的年代了。相比手写makefile,使用cmake则像是实现了机动化,管理项目工程的编译变得很简单了。况且cmake很流行,linux下的很多软件源码包,很多也都使用了cmake的方式编译。因此…

创建型(四) - 原型模式

一、概念 原型模式(Prototype Pattern):利用对已有对象(原型)进行复制(或者叫拷贝)的方式来创建新对象,以达到节省创建时间的目的。 使用场景:如果对象的创建成本比较大…

【IO进程线程】使用标准IO函数完成用户的登录和注册

1 实现登录功能 自定义一个usr.txt,先手动输入其账户密码。 格式:账户 密码 例: zhangsan 12345 lisi abcde wangwu abc123 需求如下: 1. 从终端获取账户密码,与文件中的账户密码比较; 2. 若终端输入的账户…

商城-学习整理-高级-商城业务-Sentinel限流熔断降级Sleuth+Zipkin链路追踪(二十二)

目录 一、秒杀系统的架构二、SpringCloud Alibaba-Sentinel简介1、熔断降级限流什么是熔断什么是降级异同:什么是限流 2、Sentinel 简介官方文档:Sentinel 具有以下特征:Sentinel 分为两个部分: 3、Hystrix 与 Sentinel 比较4、整合 FeignSentinel 测试熔…

微服务集成spring cloud sentinel

目录 1. sentinel使用场景 2. sentinel组成 3. sentinel dashboard搭建 4. sentinel客户端详细使用 4.1 引入依赖 4.2 application.properties增加dashboard注册地址 4.3 手动增加限流配置类 4.4 rest接口及service类 4.5 通过dashboard动态配置限流规则 1. sentinel使…

Vue3项目实战

目录 一、项目准备 二、基础语法应用 2.1、mixin应用 2.2、网络请求 2.3、显示与隐藏 2.4、编程式路由跳转 2.5、下载资料 2.6、调用方法 2.7、监听路由变化 2.8、pinia应用 (1)存储token(user.js) (2)全选全不选案例(car.js) 一、项目准备 下载: cnp…

[JavaWeb]【十三】web后端开发-原理篇

目录 一、SpringBoot配置优先级 1.1 配置优先级比较 1.2 java系统属性和命令行参数 1.3 打包运行jar 1.4 综合优先级​编辑 二、Bean管理 2.1 获取bean 2.2 bean作用域 2.2.1 五种作用域 2.2.2 配置作用域 2.3 第三方bean 2.3.1 编写公共配置类 三、SpringBoot原理 …

mybatis-plus如何使用枚举类来实现性别和标签的数字带描述

文章目录 目录 文章目录 前言 一、环境准备 二、使用步骤 一 实体类 二 枚举类 三 持久层 四 控制层 总结 前言 枚举是一种表示一组有限可能取值的数据类型。它具有以下几个好处: 易于理解和维护:枚举提供了一种清晰明了的方式来表示一组具体的取值&a…

【Linux操作系统】线程的基本知识和创建--循环创建多个子线程

本篇文章主要介绍了线程的概念和作用,线程三级映射的实现,创建线程的方法(讲解pthread_self和pthread_create函数),循环创建多个子线程为例子,同时分析线程之间的全局变量的共享问题,希望可以帮…

Redis笔记——(狂神说)待续

Nosql概述 为什么要用NoSql? 1、单机mysql的年代:90年代,网站访问量小,很多使用静态网页html写的,服务器没压力。 当时瓶颈是:1)数据量太大一个机器放不下。2)数据的索引(BTree),一个机器内存也…

Git最简入门

文章目录 几个基本概念版本控制Git的由来分布式 vs 集中式GitSVN Git、GitHub、GitLab、GitWeb、Gitee的区别 动手进行版本控制初始化Git使用情景一:开发新项目使用情景二:在已有项目上开发设置代理 参考 几个基本概念 版本控制 在工作学习中&#xff…

「Python|音视频处理|环境准备」如何在Windows系统下安装并配置音视频处理工具FFmpeg

本文主要介绍如何在Windows系统下安装并配置音视频处理工具FFmpeg,方便使用python进行音视频相关的下载或编辑处理。 文章目录 一、下载软件二、解压并配置三、验证安装 一、下载软件 首先要去 ffmpeg官网 下载软件包 由于上面直接下载的按钮是.tar.xz格式的。为了…

基于 Alpine 环境源码构建 alibaba-tengine(阿里巴巴)的 Docker 镜像

About Alpine(简介) Alpine Linux 是一款极其轻量级的 Linux 发行版,基于 busybox,多被当做 Docker 镜像的底包(基础镜像),在使用容器时或多或少都会接触到此系统,本篇文章我们以该镜…

Pydev·离线git包

Pydev离线git包 1.下载离线git包:eclipse.egit.repository-4.4.0.201606070830-r.zip 2.将解压后目录:eclipse.egit.repository-4.4.0.201606070830-r\plugins下的jar文件放到 ide\eclipse\plugins目录下 3.重启pydevIDE 百度搜索站长工具:h…

Spring集成【MyBatis】和【PageHelper分页插件】整合---详细介绍

一,spring集成Mybatis的概念 Spring 整合 MyBatis 是将 MyBatis 数据访问框架与 Spring 框架进行集成,以实现更便捷的开发和管理。在集成过程中,Spring 提供了许多特性和功能,如依赖注入、声明式事务管理、AOP 等 它所带来给我们的…

校对的力量:当专业遇上细节,文字焕发新生

在这个信息爆炸的时代,文字成为了我们传达思想、展现形象的重要工具。从新闻稿、政府材料到商业文档,其背后的准确性和专业性往往决定了信息传递的效果。而保证这一切的,就是细致入微的校对工作。 1.错别字与校对:细节之美 错别字…

开源全球地理空间数据可视化框架——Cesium学习(2023.8.21)

Cesium学习 2023.8.21 1、Cesium简介1.1 Github上的Cesium 2、Cesium下载安装使用2.1 方式一:页面在线引用2.2 方式二:页面离线使用2.3 方式三:完整项目使用 3、CesiumJS学习教程(快速上手 API文档)3、Cesium官方示例…

vue离线缓存资源文件

本文章主要是解决大文件,实时请求资源浪费网络资源的问题 从而有效的将解决用户体验的问题 话不多说上才艺 ⬇️⬇️⬇️⬇️⬇️⬇️⬇️ 找到项目中的 index.html 文件,并在 html 标签中加入 manifest"manifest.appcache" 安装 appcache-manifest 包 npm ins…