给公司在百度上做网站,WordPress搜索按钮代码,wordpress+首页多栏,公司建设网站的必要性目录
损失函数中为什么要用Log
为什么对数可以将乘法转化为加法#xff1f;
机器学习#xff08;Machine Learning#xff09;
机器学习的分类
监督学习
无监督学习
强化学习
机器学习的应用
应用举例#xff1a;猫狗分类
1. 现实问题抽象为数学问题
2. 数据准备…目录
损失函数中为什么要用Log
为什么对数可以将乘法转化为加法
机器学习Machine Learning
机器学习的分类
监督学习
无监督学习
强化学习
机器学习的应用
应用举例猫狗分类
1. 现实问题抽象为数学问题
2. 数据准备
3. 选择模型
4. 模型训练及评估
5.预测结果
推荐阅读 损失函数中为什么要用Log Loss 在使用似然函数最大化时其形式是进行连乘但是为了便于处理一般会套上log这样便可以将连乘转化为求和求和形式更容易求偏导应用到梯度下降中求最优解
由于log函数是单调递增函数因此不会改变优化结果。
极大似然估计中取对数的原因取对数后连乘可以转化为相加方便求导这是因为对数函数的求导更加简单对数函数的导数比原函数更容易计算和优化除此之外对数函数 ln为单调递增函数不会改变似然函数极值点。 为什么对数可以将乘法转化为加法 log2(x*y) log2(y) log2(y)
1 2 3 45 6······
和指数序列
2^(1) 2^(2) 2^(3) 2^(4)2^(5) 2^(6)······
可以看出上一序列是下一序列的指数部分。那么我们如果想计算2*8 (2^(1))*(2^(3))就可以将指数部分先加起来即134然后找第二个序列进行对应就得到了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.jpgcat.5418.jpgcat.7377.jpgcat.7564.jpgcat.8100.jpgcat.8456.jpgcat.10029.jpgcat.12272.jpgdog.1259.jpgdog.1895.jpgdog.4367.jpgdog.8736.jpgdog.9517.jpgdog.10190.jpgdog.11299.jpg。 复杂背景 异常数据 sample_submission.csv 需要将最终测试集的测试结果写入.csv 文件中。
后续的实验中我们将数据分成3个部分训练集60%、验证集20%、测试集20%用于后面的验证和评估工作。一般三者切分的比例是622不过验证集并不是必须的没有也是可以的。 训练集、验证集、测试集作用这里说明一下 训练集用来调试神经网络 验证集用来查看训练效果 测试集用来测试网络的实际学习能力
训练集(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尖 是图片预测为狗的概率 如果图像是狗则为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, encodingutf-8)return np.array(data[images]), to_categorical(np.array(data[labels]), num_classes2), np.array(data[files])TRAIN_DIR data/train-datatrain_images, train_labels, train_files load_data(TRAIN_DIR)model Sequential([Convolution2D(16, kernel_size(3, 3), strides(1, 1), paddingsame, input_shape(100, 100, 3), activationrelu),# 100*100*96MaxPool2D((2, 2), strides(2, 2), paddingsame), # 50*50*96Convolution2D(32, kernel_size(3, 3), strides(1, 1), paddingsame, activationrelu), # 50*50*192MaxPool2D((2, 2), strides(2, 2), paddingsame), # 25*25*192Convolution2D(64, kernel_size(3, 3), strides(1, 1), paddingsame, activationrelu), # 25*25*384MaxPool2D((2, 2), strides(2, 2), paddingsame), #Convolution2D(128, kernel_size(3, 3), strides(1, 1), paddingsame, activationrelu),MaxPool2D((2, 2), strides(2, 2), paddingsame),Flatten(),Dense(512, activationrelu),Dropout(0.3),Dense(256, activationrelu),Dropout(0.3),Dense(2)
])
# 模型编译
model.compile(optimizerAdam(), losscategorical_crossentropy, metrics[accuracy])
# 模型训练
model.fit(train_images, train_labels, batch_size200, epochs10)
# 训练完保存模型
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, encodingutf-8)return np.array(data[images]), to_categorical(np.array(data[labels]), num_classes2), 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的总结