机器学习分类,损失函数中为什么要用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.rhkb.cn/news/100367.html

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

相关文章

Docker容器:docker镜像的创建及dockerfile案例

文章目录 一.docker镜像的三种创建方法1.基于现有镜像创建1.1 启动镜像1.2 生成新镜像 2.基于本地模板创建2.1 OPENVZ 下载模板2.2 导入容器生成镜像 3.基于dockerfile创建3.1 dockerfile结构及分层3.2 联合文件系统3.3 docker镜像加载原理及过程 4.dockerfile操作常用的指令4.…

蓝奥声智能工业安全用电监测与智慧能源解决方案

能源管理变得越来越重要。如今,能源成本已成为国内预算的核心因素,因此用电监控对大多数现代企业来说都很重要。许多企业在日常能源消耗监控中面临着一些挑战,因为它们的规模庞大,基础设施多样化,灵活性低,…

更好的 3D 网格,从重建到生成式 AI

推荐:使用 NSDT场景编辑器 助你快速搭建可二次编辑的3D应用场景 这些生成的 3D 模型通常提取为标准三角形网格。网格表示提供了许多好处,包括支持现有软件包、高级硬件加速和支持物理仿真。但是,并非所有网格都是平等的,这些优势只…

Linux系统下消息中间件RocketMQ下载、安装、搭建、配置、控制台rocketmq-dashboard的安装保姆级教程 rocketmq ui

这里给出我使用的 RocketMQ 版本(5.1.3)、RocketMQ-Dashboard 版本的百度网盘链接: 链接:https://pan.baidu.com/s/1HaKBBDGWZ0WKLGgVwIG9pw 提取码:1234 文章目录 一. 官网下载安装二、启动NameServer三、启动Broker四…

Elasticsearch 查询之Function Score Query

前言 ES 的主查询评分模式分为两种,是信息检索领域的重要算法: TF-IDF 算法 和 BM25 算法。 Elasticsearch 从版本 5.0 开始引入了 BM25 算法作为默认的文档评分(relevance scoring)算法。在此之前,Elasticsearch 使…

uniapp 顶部头部样式

<u-navbartitle"商城":safeAreaInsetTop"true"><view slot"left"><image src"/static/logo.png" mode"" class"u-w-50 u-h-50"></image></view></u-navbar>

Certify The Web (IIS)

一、简介 Certify The Web 适用于 Windows的SSL 证书管理器用户界面&#xff0c;与所有 ACME v2 CA 兼容&#xff0c;为您的 IIS/Windows 服务器轻松地安装和自动更新来自 Letencrypt.org 和其他 ACME 证书授权机构的免费 SSL/TLS 证书&#xff0c;设置 https 从未如此简单。 …

【中危】PowerJob 未授权访问漏洞 (CVE-2023-36106)

漏洞描述 PowerJob 是一款开源的分布式任务调度框架。 在 PowerJob 受影响版本中存在错误的访问控制漏洞。由于没有对/container/list接口做鉴权&#xff0c;未授权的攻击者可以构造 appId 参数访问 /container/list接口获取应用容器的标识、运行状态、日志等敏感信息。 漏洞…

java+springboot+mysql小区自来水实时监控管理系统

项目介绍&#xff1a; 使用javaspringbootmysql开发的小区自来水实时监控管理系统&#xff0c;系统包含超级管理员&#xff0c;系统管理员、用户角色&#xff0c;功能如下&#xff1a; 超级管理员&#xff1a;管理员管理&#xff1b;楼栋管理&#xff1b;租户管理、用水管理&…

糖尿病视网膜病变,黄斑病变,年龄相关检测研究(Matlab代码)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【Git分支操作---讲解二】

Git分支操作---讲解二 查看分支创建分支切换分支修改分支切换分支合并分支合并分支【冲突】(只会修改主分支不会修改其他分支)什么时候会有冲突&#xff1f; 查看分支 创建分支 切换分支 修改分支 切换分支 合并分支 合并分支【冲突】(只会修改主分支不会修改其他分支) 什么时…

python 打印沁园春 雪 居中对齐 文本对齐

以下是python 中使用 DebugInfo 模块居中对齐打印《沁园春・雪》的效果 引入模块 pip install DebugInfopython代码 # -*- coding:UTF-8 -*-# region 引入必要依赖 from DebugInfo.DebugInfo import * # endregion诗文 沁园春 雪 作者: 毛主席 北国风光&#xff0c;千里冰封…

Blazor前后端框架Known-V1.2.13

V1.2.13 Known是基于C#和Blazor开发的前后端分离快速开发框架&#xff0c;开箱即用&#xff0c;跨平台&#xff0c;一处代码&#xff0c;多处运行。 Gitee&#xff1a; https://gitee.com/known/KnownGithub&#xff1a;https://github.com/known/Known 概述 基于C#和Blazo…

PySpark安装及WordCount实现(基于Ubuntu)

先盘点一下要安装哪些东西&#xff1a; VMwareubuntu 14.04&#xff08;64位&#xff09;Java环境&#xff08;JDK 1.8&#xff09;Hadoop 2.7.1Spark 2.4.0&#xff08;Local模式&#xff09;Pycharm &#xff08;一&#xff09;Ubuntu VMware 和 ubuntu 14.04&#xff08;…

数据结构与算法:计算机科学的基石

文章目录 数据结构&#xff1a;构建数据的框架算法&#xff1a;问题的解决方案编程语言&#xff1a;实现数据结构的工具结论 &#x1f389;欢迎来到数据结构学习专栏~数据结构与算法&#xff1a;计算机科学的基石 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&…

python schedule库使用教程

schedule 是一个 Python 库&#xff0c;用于在指定的时间间隔或特定时间点执行任务。它可以帮助你创建定时任务&#xff0c;例如定时运行函数、脚本等。以下是一个简单的 schedule 库的使用教程。 安装 首先&#xff0c;你需要安装 schedule 库。你可以使用以下命令通过 pip …

速通蓝桥杯嵌入式省一教程:(八)ADC测量模拟电压

ADC(Analog to Digital Converter)&#xff0c;模拟数字转换器&#xff0c;是电子工程师必须掌握的一个内容。由于单片机、计算机等是由0和1组成的&#xff0c;因此其无法直接测量或使用连续的模拟信号&#xff0c;需要用ADC将模拟信号转换为离散的数字信号。ADC的具体原理在此…

uni-app 打包生成签名Sha1

Android平台打包发布apk应用&#xff0c;需要使用数字证书&#xff08;.keystore文件&#xff09;进行签名&#xff0c;用于表明开发者身份。 可以使用JRE环境中的keytool命令生成。以下是windows平台生成证书的方法&#xff1a; 安装JRE环境&#xff08;推荐使用JRE8环境&am…

CH02_重构的原则(什么是重构、为什么重构、何时重构)

什么是重构 重构&#xff08;名词&#xff09;&#xff1a;对软件内部结构的一种调整&#xff0c;目的是在不改变软件可观察行为的前提下&#xff0c;提高其可理解性&#xff0c;降低其修改成本。 重构&#xff08;动词&#xff09;&#xff1a;使用一系列重构手法&#xff0…

ThinkPHP6.0+ 使用Redis 原始用法

composer 安装 predis/predis 依赖&#xff0c;或者安装php_redis.dll的扩展。 我这里选择的是predis/predis 依赖。 composer require predis/predis 进入config/cache.php 配置添加redis缓存支持 示例&#xff1a; <?php// -----------------------------------------…