Artificial Intelligence With Python 简明教程

AI with Python – Deep Learning

人工神经网络 (ANN) 是一种高效的计算系统,其核心主题借鉴了对生物神经网络进行类比。神经网络是机器学习的一个类型模型。在 20 世纪 80 年代末和 90 年代初,神经网络在架构方面取得了许多重大的进步。在本章中,你将进一步了解人工智能的一种方法,深度学习。

深度学习源于十年来的爆炸性计算增长,成为该领域的强有力竞争者。因此,深度学习是一种特殊类型的机器学习,其算法受到人脑结构和功能的启发。

Machine Learning v/s Deep Learning

深度学习是当今最强大的机器学习技术。它之所以如此强大,是因为它们在学习如何解决问题的同时,也学习解决问题的最佳方式。下面给出了深度学习和机器学习的比较−

Data Dependency

第一个区别点基于当数据规模增加时 DL 和 ML 的性能。当数据量较大时,深度学习算法表现非常好。

Machine Dependency

深度学习算法需要高端机器才能完美运行。另一方面,机器学习算法也可以在低端机器上运行。

Feature Extraction

深度学习算法可以提取高级特征并尝试从中学习。另一方面,需要专家识别机器学习提取的大多数特征。

Time of Execution

执行时间取决于算法中使用的大量参数。深度学习具有比机器学习算法更多的参数。因此,DL 算法的执行时间,尤其是训练时间,远多于 ML 算法。但 DL 算法的测试时间少于 ML 算法。

Approach to Problem Solving

深度学习端到端地解决问题,而机器学习使用解决问题的传统方式,即将其分解为多个部分。

Convolutional Neural Network (CNN)

卷积神经网络与普通神经网络相同,因为它们也由具有可学习权重和偏差的神经元组成。普通神经网络忽略输入数据的结构,并且在将所有数据馈送到网络之前,将其转换为一维数组。此过程适用于常规数据,但是如果数据包含图像,则此过程可能会很麻烦。

CNN 很容易解决此问题。它们在处理图像时会考虑它们的二维结构,这使它们能够提取图像特有的属性。通过这种方式,CNN 的主要目标是从输入层的原始图像数据转到输出层的正确类别。普通神经网络和 CNN 之间的唯一区别在于输入数据的处理方式和层类型。

Architecture Overview of CNNs

在架构上,普通神经网络接收输入并通过一系列隐藏层对其进行转换。每一层通过神经元的帮助连接到另一层。普通神经网络的主要缺点是它们不能很好地扩展到完整图像。

CNN 的架构具有排列在三个维度(称为宽度、高度和深度)中的神经元。当前层中的每个神经元都连接到前一层的输出中的一小块区域。这类似于在输入图像上叠加 𝑵×𝑵 滤镜。它使用 M 滤镜以确保获取所有细节。这些 M 滤镜是特征提取器,用于提取边缘、角等特征。

Layers used to construct CNNs

以下层用于构建 CNN:

  1. Input Layer - 其以原始图像数据为依据。

  2. Convolutional Layer - 此层是 CNN 的核心构件,负责完成大部分计算。此层计算神经元与输入中的各种补丁之间的卷积。

  3. Rectified Linear Unit Layer - 其将激活函数应用于上一层的输出。其为网络添加非线性,以便其可以针对任何类型的函数进行良好的泛化。

  4. Pooling Layer - 池化有助于我们在网络中进行时仅保留重要部分。池化层独立于输入的每一层深度切片运行,并对其进行空间调整。其使用 MAX 函数。

  5. Fully Connected layer/Output layer *− This layer computes the output scores in the last layer. The resulting output is of the size *𝟏×𝟏×𝑳 ,其中 L 为训练数据集类别的数目。

Installing Useful Python Packages

您可以使用 Keras ,这是一种用 Python 编写的、可以在 TensorFlow、CNTK 或 Theno 上运行的高级神经网络 API。其兼容 Python 2.7-3.6。您可以从 https://keras.io/ 了解更多相关信息。

使用以下命令安装 keras −

pip install keras

conda 环境中,您可以使用以下命令 −

conda install –c conda-forge keras

Building Linear Regressor using ANN

本节中,您将学习如何构建一个使用人工神经网络的线性回归器。您可以使用 KerasRegressor 来实现此目的。在此示例中,我们使用包含 13 个波士顿房产数字的波士顿房价数据集。以下是 Python 代码 −

导入所有必需的软件包,如所示 −

import numpy
import pandas
from keras.models import Sequential
from keras.layers import Dense
from keras.wrappers.scikit_learn import KerasRegressor
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import KFold

现在,加载我们保存在本地目录中的数据集。

dataframe = pandas.read_csv("/Usrrs/admin/data.csv", delim_whitespace = True, header = None)
dataset = dataframe.values

现在,将数据分成输入和输出变量,即 X 和 Y −

X = dataset[:,0:13]
Y = dataset[:,13]

由于我们使用的是基线神经网络,因此,定义模型 −

def baseline_model():

现在,按如下方式创建模型 −

model_regressor = Sequential()
model_regressor.add(Dense(13, input_dim = 13, kernel_initializer = 'normal',
   activation = 'relu'))
model_regressor.add(Dense(1, kernel_initializer = 'normal'))

接下来,编译模型 −

model_regressor.compile(loss='mean_squared_error', optimizer='adam')
return model_regressor

现在,按如下方式修复随机种子以实现可重复性 −

seed = 7
numpy.random.seed(seed)

用作 scikit-learn 中回归估计器的 Keras 封装对象称为 KerasRegressor 。在本节中,我们将使用标准化数据集评估此模型。

estimator = KerasRegressor(build_fn = baseline_model, nb_epoch = 100, batch_size = 5, verbose = 0)
kfold = KFold(n_splits = 10, random_state = seed)
baseline_result = cross_val_score(estimator, X, Y, cv = kfold)
print("Baseline: %.2f (%.2f) MSE" % (Baseline_result.mean(),Baseline_result.std()))

以上显示的代码的输出将是模型在问题上的性能,而不见于的数据。这将是均方误差,包括跨验证评估的全部 10 个折叠的平均值和标准差。

Image Classifier: An Application of Deep Learning

卷积神经网络 (CNN) 解决了图像分类问题,即输入图像属于哪个类别。您可以使用 Keras 深度学习库。请注意,我们使用的是以下链接中猫和狗图像的训练和测试数据集 https://www.kaggle.com/c/dogs-vs-cats/data

如所示,导入重要的 keras 库和模块 −

名为顺序的以下模块将初始化神经网络作为顺序网络。

from keras.models import Sequential

名为 Conv2D 的以下模块用于执行卷积运算,即 CNN 的第一步。

from keras.layers import Conv2D

名为 MaxPoling2D 的以下模块用于执行池化运算,即 CNN 的第二步。

from keras.layers import MaxPooling2D

名为 Flatten 的以下模块是将所有所得二维数组转换成一个长的连续线性向量的过程。

from keras.layers import Flatten

名为 Dense 的以下模块用于执行神经网络的全连接,即 CNN 的第四步。

from keras.layers import Dense

现在,创建一个顺序类的对象。

S_classifier = Sequential()

现在,下一步是编码卷积部分。

S_classifier.add(Conv2D(32, (3, 3), input_shape = (64, 64, 3), activation = 'relu'))

此处 relu 是整流函数。

现在,CNN 的下一步是在卷积部分后对所得特征图进行池化运算。

S-classifier.add(MaxPooling2D(pool_size = (2, 2)))

现在,通过使用展平将所有池化的图像转换成一个连续向量 −

S_classifier.add(Flatten())

接下来,创建一个完全连接的层。

S_classifier.add(Dense(units = 128, activation = 'relu'))

此处,128 是隐藏单元的数量。将隐藏单元的数量定义为 2 的幂次是一个常见的做法。

现在,初始化输出层如下 −

S_classifier.add(Dense(units = 1, activation = 'sigmoid'))

现在,编译我们已经构建的 CNN −

S_classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])

此处优化程序参数是选择随机梯度下降算法,损失参数是选择损失函数,度量参数是选择性能度量。

现在,执行图像增强,然后将图像拟合到神经网络 −

train_datagen = ImageDataGenerator(rescale = 1./255,shear_range = 0.2,
zoom_range = 0.2,
horizontal_flip = True)
test_datagen = ImageDataGenerator(rescale = 1./255)

training_set =
   train_datagen.flow_from_directory(”/Users/admin/training_set”,target_size =
      (64, 64),batch_size = 32,class_mode = 'binary')

test_set =
   test_datagen.flow_from_directory('test_set',target_size =
      (64, 64),batch_size = 32,class_mode = 'binary')

现在,将数据拟合到我们已经创建的模型 −

classifier.fit_generator(training_set,steps_per_epoch = 8000,epochs =
25,validation_data = test_set,validation_steps = 2000)

此处,steps_per_epoch 具有训练图像的数量。

现在,该模型已培训,我们可以按如下方式将其用于预测:

from keras.preprocessing import image

test_image = image.load_img('dataset/single_prediction/cat_or_dog_1.jpg',
target_size = (64, 64))

test_image = image.img_to_array(test_image)

test_image = np.expand_dims(test_image, axis = 0)

result = classifier.predict(test_image)

training_set.class_indices

if result[0][0] == 1:
prediction = 'dog'

else:
   prediction = 'cat'