找回密码
 立即注册
搜索

初学者的机器学习入门实战教程




原文链接:https://www.pyimagesearch.com/2019/01/14/machine-learning-in-python/

作者:Adrian Rosebrock

这是一篇手把手教你运用 Python 完成机器学习算法,并在数值型数据和图像数据集上运转模型的入门教程,当你看完本文后,你该当可以末尾你的机器学习之旅了!

本教程会采用下述两个库来完成机器学习算法:
    scikit-learnKeras

此外,你还将学习到:
    评价你的成绩预备数据(原始数据、特征提取、特征工程等等)检查各种机器学习算法检验实验结果深化了解功能最好的算法

在本文会用到的机器学习算法包括:
    KNN朴素贝叶斯逻辑回归SVM决策树随机森林感知机多层前向网络CNNs

安装必备的 Python 机器学习库

末尾本教程前,需求先确保安装了一下的 Python 库:
    Numpy:用于 Python 的数值处理PIL:一个简单的图像处理库scikit-learn:包含多种机器学习算法(留意需求采用 0.2+ 的版本,所以下方安装命令需求加上 --upgrade )Kears 和 TensorFlow:用于深度学习。本教程可以仅采用 CPU 版本的 TensorFlowOpenCV:本教程并不会采用到 OpenCV,但 imutils 库依赖它;imutils :作者的图像处理/计算机视觉库

安装命令如下,引荐采用虚拟环境(比如应用 anaconda 创建一个新的环境):
$ pip install numpy
$ pip install pillow
$ pip install --upgrade scikit-learn
$ pip install tensorflow # or tensorflow-gpu
$ pip install keras
$ pip install opencv-contrib-python
$ pip install --upgrade imutils

数据集

本教程会用到两个数据集来协助更好的了解每个机器学习算法的功能。

第一个数据集是 Iris(鸢尾花) 数据集。这个数据集的地位,相当于你刚末尾学习一门编程言语时,敲下的 “Hello,World!”

这个数据集是一个数值型的数据,如下图所示,其实就是一个表格数据,每一行代表一个样本,然后每一列就是不同的属性。这个数据集次要是搜集了三种不同的鸢尾花的数据,分别为:
    Iris SetosaIris VersicolorIris Virginica

对应图中最后一列 Class label,然后还有四种属性,分别是:
    Sepal length--萼片长度Sepal width--萼片宽度Petal length--花瓣长度Petal width--花瓣宽度




这个数据集能够是最简单的机器学习数据集之一了,通常是用于教导程序员和工程师的机器学习和形式辨认基础的数据集。

对于该数据集,我们的目的就是根据给定的四个属性,训练一个机器学习模型来正确分类每个样本的类别。

需求留意的是,其中有一个类别和另外两个类别是线性可分的,但这两个类别之间却并非线性可分,所以我们需求采用一个非线性模型来对它们停止分类。当然了,在理想生活中,采用非线性模型的机器学习算法是非常常见的。

第二个数据集是一个三场景的图像数据集。这是协助初学者学习如何处理图像数据,并且哪种算法在这两种数据集上功能最优。

下图是这个三场景数据集的部分图片例子,它包括森林、高速公路和海岸线三种场景,总共是 948 张图片,每个类别的详细图片数量如下:
    Coast: 360Forest: 328Highway: 260




这个三场景数据集是采样于一个八场景数据集中,作者是 Oliva 和 Torralba 的 2001 年的一篇论文,Modeling the shape of the scene: a holistic representation of the spatial envelope: http://people.csail.mit.edu/torralba/code/spatialenvelope/

应用 Python 完成机器学习的步骤

无论什么时分完成机器学习算法,引荐采用如下流程来末尾:
    评价你的成绩预备数据(原始数据、特征提取、特征工程等等)检查各种机器学习算法检验实验结果深化了解功能最好的算法

这个流程会随着你机器学习方面的阅历的积累而改善和优化,但对于初学者,这是我建议入门机器学习时采用的流程。

所以,如今末尾吧!第一步,就是评价我们的成绩,问一下本人:
    数据集是哪种类型?数值型,类别型还是图像?模型的最终目的是什么?如何定义和衡量“准确率”呢?以目前本身的机器学习知识来看,哪些算法在处理这类成绩上效果很好?

最后一个成绩非常重要,随着你运用 Python 完成机器学习的次数的添加,你也会随之获得更多的阅历。根据之前的阅历,你能够知道有一种算法的功能还不错。

因此,接着就是预备数据,也就是数据预处理以及特征工程了。

普通来说,这一步,包括了从硬盘中载入数据,检查数据,然后决议能否需求做特征提取或者特征工程。

特征提取就是运用某种算法经过某种方式来量化数据的过程。比如,对于图像数据,我们可以采用计算直方图的方法来统计图像中像素强度的分布,经过这种方式,我们就得到描画图像颜色的特征。

特征工程则是将原始输入数据转换成一个更好描画潜在成绩的特征表示的过程。当然特征工程是一项更先进的技术,这里建议在对机器学习有了一定阅历后再采用这种方法处理数据。

第三步,就是检查各种机器学习算法,也就是完成一系列机器学习算法,并运用在数据集上。

这里,你的工具箱该当包含以下几种不同类型的机器学习算法:
    线性模型(比如,逻辑回归,线性 SVM)非线性模型(比如 RBF SVM,梯度下降分类器)树和基于集成的模型(比如 决策树和随机森林)神经网络(比如 多层感知机,卷积神经网络)

该当选择比较鲁棒(波动)的一系列机器学习模型来评价成绩,由于我们的目的就是判别哪种算法在当前成绩的功能很好,而哪些算法很蹩脚。

决议好要采用的模型后,接上去就是训练模型并在数据集上测试,观察每个模型在数据集上的功能结果。

在多次实验后,你能够就是有一种“第六感”,知道哪种算法更适用于哪种数据集。

比如,你会发现:
    对于有很多特征的数据集,随机森林算法的效果很不错;而逻辑回归算法可以很好处理高维度的稀疏数据;对于图像数据,CNNs 的效果非常好。

而以上的阅历获得,当然就需求你多动手,多停止实战来深化了解不同的机器学习算法了!

末尾动手吧!

接上去就末尾敲代码来完成机器学习算法,并在上述两个数据集上停止测试。本教程的代码文件目录如下,包含四份代码文件和一个 3scenes文件夹,该文件夹就是三场景数据集,而 Iris 数据集直接采用 scikit-learn 库载入即可。
├── 3scenes
│ ├── coast [360 entries]
│ ├── forest [328 entries]
│ └── highway [260 entries]
├── classify_iris.py
├── classify_images.py
├── nn_iris.py
└── basic_cnn.py

代码和数据集文件可以在公众号后台,也就是公众号会话界面回复 『py_ml』获取!

首先是完成 classify_iris.py,这份代码是采用机器学习算法来对 Iris 数据集停止分类。

首先导入需求的库:
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.datasets import load_iris
import argparse
# 设置参数
ap = argparse.ArgumentParser()
ap.add_argument("-m", "--model", type=str, default="knn", help="type of python machine learning model to use")
args = vars(ap.parse_args())
# 定义一个保存模型的字典,根据 key 来选择加载哪个模型
models = {
"knn": KNeighborsClassifier(n_neighbors=1),
"naive_bayes": GaussianNB(),
"logit": LogisticRegression(solver="lbfgs", multi_class="auto"),
"svm": SVC(kernel="rbf", gamma="auto"),
"decision_tree": DecisionTreeClassifier(),
"random_forest": RandomForestClassifier(n_estimators=100),
"mlp": MLPClassifier()
}

可以看到在 sklearn 库中就集成了我们将要完成的几种机器学习算法的代码,包括:
    KNN朴素贝叶斯逻辑回归SVM决策树随机森林感知机

我们直接调用 sklearn 中相应的函数来完成对应的算法即可,比如对于 knn 算法,直接调用 sklearn.neighbors 中的 KNeighborsClassifier() 即可,只需求设置参数 n_neighbors ,即最近邻的个数。

这里直接用一个 models 的字典来保存不同模型的初始化,然后根据参数 --model 来调用对应的模型,比如命令输入 python classify_irs.py --model knn 就是调用 knn 算法模型。

接着就是载入数据部分:
print("[INFO] loading data...")
dataset = load_iris()
(trainX, testX, trainY, testY) = train_test_split(dataset.data,
dataset.target, random_state=3, test_size=0.25)

这里直接调用 sklearn.datasets 中的 load_iris() 载入数据,然后采用 train_test_split 来划分训练集和数据集,这里是 75% 数据作为训练集,25% 作为测试集。

最后就是训练模型和预测部分:
# 训练模型
print("[INFO] using '{}' model".format(args["model"]))
model = models[args["model"]]
model.fit(trainX, trainY)
# 预测并输入一份分类结果报告
print("[INFO] evaluating")
predictions = model.predict(testX)
print(classification_report(testY, predictions, target_names=dataset.target_names))

残缺版代码代码如下:
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.datasets import load_iris
import argparse
# 设置参数
ap = argparse.ArgumentParser()
ap.add_argument("-m", "--model", type=str, default="knn", help="type of python machine learning model to use")
args = vars(ap.parse_args())
# 定义一个保存模型的字典,根据 key 来选择加载哪个模型
models = {
"knn": KNeighborsClassifier(n_neighbors=1),
"naive_bayes": GaussianNB(),
"logit": LogisticRegression(solver="lbfgs", multi_class="auto"),
"svm": SVC(kernel="rbf", gamma="auto"),
"decision_tree": DecisionTreeClassifier(),
"random_forest": RandomForestClassifier(n_estimators=100),
"mlp": MLPClassifier()
}
# 载入 Iris 数据集,然后停止训练集和测试集的划分,75%数据作为训练集,其他25%作为测试集
print("[INFO] loading data...")
dataset = load_iris()
(trainX, testX, trainY, testY) = train_test_split(dataset.data, dataset.target, random_state=3, test_size=0.25)
# 训练模型
print("[INFO] using '{}' model".format(args["model"]))
model = models[args["model"]]
model.fit(trainX, trainY)
# 预测并输入一份分类结果报告
print("[INFO] evaluating")
predictions = model.predict(testX)
print(classification_report(testY, predictions, target_names=dataset.target_names))

接着就是采用三场景图像数据集的分类预测代码 classify_images.py ,跟 classify_iris.py 的代码其实是比较相似的,首先导入库部分,添加以下几行代码:
from sklearn.preprocessing import LabelEncoder
from PIL import Image
from imutils import paths
import numpy as np
import os

其中 LabelEncoder 是为了将标签从字符串编码为整型,然后其他几项都是处理图像相关。

对于图像数据,假如直接采用原始像素信息输入模型中,大部分的机器学习算法效果都很不理想,所以这里采用特征提取方法,次要是统计图像颜色通道的均值和标准差信息,总共是 RGB 3个通道,每个通道各计算均值和标准差,然后结合在一同,得到一个六维的特征,函数如下所示:
def extract_color_stats(image):
'''
将图片分成 RGB 三通道,然后分别计算每个通道的均值和标准差,然后前往
:param image:
:return:
'''
(R, G, B) = image.split()
features = [np.mean(R), np.mean(G), np.mean(B), np.std(R), np.std(G), np.std(B)]
return features

然后异样会定义一个 models 字典,代码一样,这里就不贴出来了,然后图像载入部分的代码如下:
# 加载数据并提取特征
print("[INFO] extracting image features...")
imagePaths = paths.list_images(args['dataset'])
data = []
labels = []
# 循环遍历一切的图片数据
for imagePath in imagePaths:
# 加载图片,然后计算图片的颜色通道统计信息
image = Image.open(imagePath)
features = extract_color_stats(image)
data.append(features)
# 保存图片的标签信息
label = imagePath.split(os.path.sep)[-2]
labels.append(label)
# 对标签停止编码,从字符串变为整数类型
le = LabelEncoder()
labels = le.fit_transform(labels)
# 停止训练集和测试集的划分,75%数据作为训练集,其他25%作为测试集
(trainX, testX, trainY, testY) = train_test_split(data, labels, test_size=0.25)

上述代码就完成从硬盘中加载图片的途径信息,然后依次遍历,读取图片,提取特征,提取标签信息,保存特征和标签信息,接着编码标签,然后就是划分训练集和测试集。

接着是相反的训练模型和预测的代码,异样没有任何改变,这里就不罗列出来了。

残缺版如下:
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.neural_network import MLPClassifier
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from PIL import Image
from imutils import paths
import numpy as np
import argparse
import os
def extract_color_stats(image):
'''
将图片分成 RGB 三通道,然后分别计算每个通道的均值和标准差,然后前往
:param image:
:return:
'''
(R, G, B) = image.split()
features = [np.mean(R), np.mean(G), np.mean(B), np.std(R), np.std(G), np.std(B)]
return features
# 设置参数
ap = argparse.ArgumentParser()
ap.add_argument("-d", "--dataset", type=str, default="3scenes",
help="path to directory containing the '3scenes' dataset")
ap.add_argument("-m", "--model", type=str, default="knn",
help="type of python machine learning model to use")
args = vars(ap.parse_args())
# 定义一个保存模型的字典,根据 key 来选择加载哪个模型
models = {
"knn": KNeighborsClassifier(n_neighbors=1),
"naive_bayes": GaussianNB(),
"logit": LogisticRegression(solver="lbfgs", multi_class="auto"),
"svm": SVC(kernel="rbf", gamma="auto"),
"decision_tree": DecisionTreeClassifier(),
"random_forest": RandomForestClassifier(n_estimators=100),
"mlp": MLPClassifier()
}
# 加载数据并提取特征
print("[INFO] extracting image features...")
imagePaths = paths.list_images(args['dataset'])
data = []
labels = []
# 循环遍历一切的图片数据
for imagePath in imagePaths:
# 加载图片,然后计算图片的颜色通道统计信息
image = Image.open(imagePath)
features = extract_color_stats(image)
data.append(features)
# 保存图片的标签信息
label = imagePath.split(os.path.sep)[-2]
labels.append(label)
# 对标签停止编码,从字符串变为整数类型
le = LabelEncoder()
labels = le.fit_transform(labels)
# 停止训练集和测试集的划分,75%数据作为训练集,其他25%作为测试集
(trainX, testX, trainY, testY) = train_test_split(data, labels, random_state=3, test_size=0.25)
# print('trainX numbers={}, testX numbers={}'.format(len(trainX), len(testX)))
# 训练模型
print("[INFO] using '{}' model".format(args["model"]))
model = models[args["model"]]
model.fit(trainX, trainY)
# 预测并输入分类结果报告
print("[INFO] evaluating...")
predictions = model.predict(testX)
print(classification_report(testY, predictions, target_names=le.classes_))

完成这两份代码后,我们就可以末尾运转下代码,对比不同算法在两个数据集上的功能。

由于篇幅的缘由,这里我会省略原文对每个算法的引见.

KNN

这里我们先运转下 classify_irs,调用默许的模型 knn ,看下 KNN 在 Iris数据集上的实验结果,如下所示:




其中次要是给出了对每个类别的准确率、召回率、F1 以及该类别测试集数量,即分别对应 precision, recall, f1-score, support 。根据最后一行第一列,可以看到 KNN 获得 95% 的准确率。

接着是在三场景图片数据集上的实验结果:




这里 KNN 获得 72% 的准确率。

(ps:实践上,运转这个算法,不同次数会有不同的结果,原文作者给出的是 75%,其次要缘由是由于在划分训练集和测试集的时分,代码没有设置参数 random_state,这导致每次运转划分的训练集和测试集的图片都是不同的,所以运转结果也会不相反!)

朴素贝叶斯

接着是朴素贝叶斯算法,分别测试两个数据集,结果如下:







异样,朴素贝叶斯在 Iris 上有 98% 的准确率,但是在图像数据集上仅有 63% 的准确率。

那么,我们能否可以阐明 KNN 算法比朴素贝叶斯好呢?

当然是不可以的,上述结果只能阐明在三场景图像数据集上,KNN 算法优于朴素贝叶斯算法。

实践上,每种算法都有各自的优缺陷和适用场景,不能混为一谈地说某种算法任何时分都优于另一种算法,这需求详细成绩详细分析。

逻辑回归

接着是逻辑回归算法,分别测试两个数据集,结果如下:







异样,逻辑回归在 Iris 上有 98% 的准确率,但是在图像数据集上仅有 77% 的准确率(对比原文作者的逻辑回归准确率是 69%)

支持向量机 SVM

接着是 SVM 算法,分别测试两个数据集,结果如下:







异样,SVM 在 Iris 上有 98% 的准确率,但是在图像数据集上仅有 76% 的准确率(对比原文作者的准确率是 83%,次要是发现类别 coast 差别有些大)

决策树

接着是决策树算法,分别测试两个数据集,结果如下:







异样,决策树在 Iris 上有 98% 的准确率,但是在图像数据集上仅有 71% 的准确率(对比原文作者的决策树准确率是 74%)

随机森林

接着是随机森林算法,分别测试两个数据集,结果如下:







异样,随机森林在 Iris 上有 96% 的准确率,但是在图像数据集上仅有 77% 的准确率(对比原文作者的决策树准确率是 84%)

留意了,普通假如决策树算法的效果还不错的话,随机森林算法应该也会获得不错甚至更好的结果,这是由于随机森林实践上就是多棵决策树经过集成学习方法组合在一同停止分类预测。

多层感知机

最后是多层感知机算法,分别测试两个数据集,结果如下:







异样,多层感知机在 Iris 上有 98% 的准确率,但是在图像数据集上仅有 79% 的准确率(对比原文作者的决策树准确率是 81%).

深度学习以及深度神经网络

神经网络

最后是完成深度学习的算法,也就是 nn_iris.py 和 basic_cnn.py 这两份代码。

(这里需求留意 TensorFlow 和 Keras 的版本成绩,我采用的是 TF=1.2 和 Keras=2.1.5)

首先是 nn_iris.py 的完成,异样首先是导入库和数据的处理:
from keras.models import Sequential
from keras.layers.core import Dense
from keras.optimizers import SGD
from sklearn.preprocessing import LabelBinarizer
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.datasets import load_iris
# 载入 Iris 数据集,然后停止训练集和测试集的划分,75%数据作为训练集,其他25%作为测试集
print("[INFO] loading data...")
dataset = load_iris()
(trainX, testX, trainY, testY) = train_test_split(dataset.data,
dataset.target, test_size=0.25)
# 将标签停止 one-hot 编码
lb = LabelBinarizer()
trainY = lb.fit_transform(trainY)
testY = lb.transform(testY)

这里我们将采用 Keras 来完成神经网络,然后这里需求将标签停止 one-hot 编码,即独热编码。

接着就是搭建网络模型的结构和训练、预测代码:
# 应用 Keras 定义网络模型
model = Sequential()
model.add(Dense(3, input_shape=(4,), activation="sigmoid"))
model.add(Dense(3, activation="sigmoid"))
model.add(Dense(3, activation="softmax"))
# 采用梯度下降训练模型
print('[INFO] training network...')
opt = SGD(lr=0.1, momentum=0.9, decay=0.1 / 250)
model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=["accuracy"])
H = model.fit(trainX, trainY, validation_data=(testX, testY), epochs=250, batch_size=16)
# 预测
print('[INFO] evaluating network...')
predictions = model.predict(testX, batch_size=16)
print(classification_report(testY.argmax(axis=1), predictions.argmax(axis=1), target_names=dataset.target_names))

这里是定义了 3 层全衔接层的神经网络,前两层采用 Sigmoid 激活函数,然后最后一层是输入层,所以采用 softmax 将输入变成概率值。接着就是定义了运用 SGD 的优化算法,损失函数是 categorical_crossentropy,迭代次数是 250 次,batch_size 是 16。

残缺版如下:
from keras.models import Sequential
from keras.layers.core import Dense
from keras.optimizers import SGD
from sklearn.preprocessing import LabelBinarizer
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.datasets import load_iris
# 载入 Iris 数据集,然后停止训练集和测试集的划分,75%数据作为训练集,其他25%作为测试集
print("[INFO] loading data...")
dataset = load_iris()
(trainX, testX, trainY, testY) = train_test_split(dataset.data,
dataset.target, test_size=0.25)
# 将标签停止 one-hot 编码
lb = LabelBinarizer()
trainY = lb.fit_transform(trainY)
testY = lb.transform(testY)
# 应用 Keras 定义网络模型
model = Sequential()
model.add(Dense(3, input_shape=(4,), activation="sigmoid"))
model.add(Dense(3, activation="sigmoid"))
model.add(Dense(3, activation="softmax"))
# 采用梯度下降训练模型
print('[INFO] training network...')
opt = SGD(lr=0.1, momentum=0.9, decay=0.1 / 250)
model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=["accuracy"])
H = model.fit(trainX, trainY, validation_data=(testX, testY), epochs=250, batch_size=16)
# 预测
print('[INFO] evaluating network...')
predictions = model.predict(testX, batch_size=16)
print(classification_report(testY.argmax(axis=1),
predictions.argmax(axis=1), target_names=dataset.target_names))

直接运转命令 python nn_iris.py, 输入的结果如下:




这里得到的是 100% 的准确率,和原文的一样。当然实践上原文给出的结果如下图所示,可以看到其实类别数量上是不相反的。




CNN

最后就是完成 basic_cnn.py 这份代码了。

异样首先是导入必须的库函数:
from keras.models import Sequential
from keras.layers.convolutional import Conv2D
from keras.layers.convolutional import MaxPooling2D
from keras.layers.core import Activation
from keras.layers.core import Flatten
from keras.layers.core import Dense
from keras.optimizers import Adam
from sklearn.preprocessing import LabelBinarizer
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from PIL import Image
from imutils import paths
import numpy as np
import argparse
import os
# 配置参数
ap = argparse.ArgumentParser()
ap.add_argument("-d", "--dataset", type=str, default="3scenes",
help="path to directory containing the '3scenes' dataset")
args = vars(ap.parse_args())

异样是要导入 Keras 来建立 CNN 的网络模型,另外由于是处理图像数据,所以 PIL、imutils 也是要导入的。

然后是加载数据和划分训练集和测试集,对于加载数据,这里直接采用原始图像像素数据,只需求对图像数据做一致尺寸的调整,这里是一致调整为 32×32,并做归一化到 [0,1] 的范围。
# 加载数据并提取特征
print("[INFO] extracting image features...")
imagePaths = paths.list_images(args['dataset'])
data = []
labels = []
# 循环遍历一切的图片数据
for imagePath in imagePaths:
# 加载图片,然后调整成 32×32 大小,并做归一化到 [0,1]
image = Image.open(imagePath)
image = np.array(image.resize((32, 32))) / 255.0
data.append(image)
# 保存图片的标签信息
label = imagePath.split(os.path.sep)[-2]
labels.append(label)
# 对标签编码,从字符串变为整型
lb = LabelBinarizer()
labels = lb.fit_transform(labels)
# 划分训练集和测试集
(trainX, testX, trainY, testY) = train_test_split(np.array(data), np.array(labels), test_size=0.25)

接着定义了一个 4 层的 CNN 网络结构,包含 3 层卷积层和最后一层输入层,优化算法采用的是 Adam 而不是 SGD 。代码如下所示:
# 定义 CNN 网络模型结构
model = Sequential()
model.add(Conv2D(8, (3, 3), padding="same", input_shape=(32, 32, 3)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(Conv2D(16, (3, 3), padding="same"))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(Conv2D(32, (3, 3), padding="same"))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(Flatten())
model.add(Dense(3))
model.add(Activation("softmax"))
# 训练模型
print("[INFO] training network...")
opt = Adam(lr=1e-3, decay=1e-3 / 50)
model.compile(loss="categorical_crossentropy", optimizer=opt, metrics=["accuracy"])
H = model.fit(trainX, trainY, validation_data=(testX, testY),
epochs=50, batch_size=32)
# 预测
print("[INFO] evaluating network...")
predictions = model.predict(testX, batch_size=32)
print(classification_report(testY.argmax(axis=1),
predictions.argmax(axis=1), target_names=lb.classes_))

残缺版如下:
from keras.models import Sequential
from keras.layers.convolutional import Conv2D
from keras.layers.convolutional import MaxPooling2D
from keras.layers.core import Activation
from keras.layers.core import Flatten
from keras.layers.core import Dense
from keras.optimizers import Adam
from sklearn.preprocessing import LabelBinarizer
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from PIL import Image
from imutils import paths
import numpy as np
import argparse
import os
# 配置参数
ap = argparse.ArgumentParser()
ap.add_argument("-d", "--dataset", type=str, default="3scenes",
help="path to directory containing the '3scenes' dataset")
args = vars(ap.parse_args())
# 加载数据并提取特征
print("[INFO] extracting image features...")
imagePaths = paths.list_images(args['dataset'])
data = []
labels = []
# 循环遍历一切的图片数据
for imagePath in imagePaths:
# 加载图片,然后调整成 32×32 大小,并做归一化到 [0,1]
image = Image.open(imagePath)
image = np.array(image.resize((32, 32))) / 255.0
data.append(image)
# 保存图片的标签信息
label = imagePath.split(os.path.sep)[-2]
labels.append(label)
# 对标签编码,从字符串变为整型
lb = LabelBinarizer()
labels = lb.fit_transform(labels)
# 划分训练集和测试集
(trainX, testX, trainY, testY) = train_test_split(np.array(data), np.array(labels), test_size=0.25)
# 定义 CNN 网络模型结构
model = Sequential()
model.add(Conv2D(8, (3, 3), padding="same", input_shape=(32, 32, 3)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(Conv2D(16, (3, 3), padding="same"))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(Conv2D(32, (3, 3), padding="same"))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(Flatten())
model.add(Dense(3))
model.add(Activation("softmax"))
# 训练模型
print("[INFO] training network...")
opt = Adam(lr=1e-3, decay=1e-3 / 50)
model.compile(loss="categorical_crossentropy", optimizer=opt, metrics=["accuracy"])
H = model.fit(trainX, trainY, validation_data=(testX, testY),
epochs=50, batch_size=32)
# 预测
print("[INFO] evaluating network...")
predictions = model.predict(testX, batch_size=32)
print(classification_report(testY.argmax(axis=1),
predictions.argmax(axis=1), target_names=lb.classes_))

运转命令 python basic_cnn.py, 输入结果如下:




CNN 的准确率是达到 90%,它是优于之前的几种机器学习算法的结果。

小结

最后,这仅仅是一份对机器学习完全是初学者的教程,其实就是简单调用现有的库来完成对应的机器学习算法,让初学者简单感受下如何运用机器学习算法,正好像在学习编程言语的时分,对着书本的代码例子敲起来,然后运转代码,看看本人写出来的程序的运转结果。

经过这份简单的入门教程,你应该明白的是:
    没有任何一种算法是完美的,可以完全适用一切的场景,即便是目前很抢手的深度学习方法,也存在它的局限性,所以应该详细成绩详细分析!记住扫尾引荐的 5 步机器学习操作流程,这里再次复习一遍:

    评价你的成绩预备数据(原始数据、特征提取、特征工程等等)检查各种机器学习算法检验实验结果深化了解功能最好的算法
    最后一点,是我运转算法结果,和原文作者的结果会不相反,这实践上就是每次采样数据,划分训练集和测试集不相反的缘由!这其实也阐明了数据非常重要,对于机器学习来说,好的数据很重要

接着,根据这份教程,你可以继续进一步了解每种机器学习算法,了解每种算法的基本原理和完成,尝试本人手动完成,而不是简单调用现有的库,这样愈加能加深印象,这里引荐《机器学习实战》,经典的机器学习算法都有引见,并且都会带你一步步完成算法!

最后,极力引荐大家去阅读下原文作者的博客,原文作者也是一个大神,他的博客地址如下:

https://www.pyimagesearch.com/

他的博客包含了 Opencv、Python、机器学习和深度学习方面的教程和文章,而且作者喜欢经过实战学习,所以很多文章都是经过一些实战练习来学习某个知识点或者某个算法,正好像本文经过完成这几种常见的机器学习算法在两个不同类型数据集上的实战来带领初学者入门机器学习。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

大神点评3

小白一个 顶一下
回复

使用道具 举报

cyokkk 2019-6-23 18:42:41 显示全部楼层
加油!不要理那些键盘侠!
回复

使用道具 举报

茻匸 2019-6-24 17:49:56 显示全部楼层
无论是不是沙发都得回复下
回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies