📜  带有Python的AI –深度学习

📅  最后修改于: 2020-12-11 05:50:43             🧑  作者: Mango


人工神经网络(ANN)是一个高效的计算系统,其中心主题是从生物神经网络的类比中借鉴而来的。神经网络是机器学习的一种模型。在1980年代中期和1990年代初期,神经网络在架构上取得了重要的进步。在本章中,您将了解有关深度学习(一种人工智能方法)的更多信息。

深度学习来自十年的爆炸性计算增长,成为该领域的重要竞争者。因此,深度学习是一种特殊的机器学习,其算法受人脑的结构和函数的启发。

机器学习与深度学习

如今,深度学习是最强大的机器学习技术。它之所以强大,是因为他们在学习如何解决问题的同时,学习了代表问题的最佳方法。深度学习和机器学习的比较如下-

数据依赖

当数据规模增加时,第一点差异是基于DL和ML的性能。当数据很大时,深度学习算法会表现出色。

机器依赖性

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

特征提取

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

执行时间

执行时间取决于算法中使用的众多参数。深度学习比机器学习算法具有更多的参数。因此,DL算法的执行时间,特别是训练时间,比ML算法要多得多。但是DL算法的测试时间少于ML算法。

解决问题的方法

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

卷积神经网络(CNN)

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

CNN可以轻松解决此问题。在处理图像时会考虑图像的2D结构,这使它们可以提取特定于图像的属性。这样,CNN的主要目标是从输入层中的原始图像数据转到输出层中的正确类别。普通NN和CNN之间的唯一区别在于输入数据的处理方式和层的类型。

CNN的体系结构概述

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

CNN的结构具有排列为3个维度的神经元,分别称为宽度,高度和深度。当前层中的每个神经元都连接到前一层输出的一小块。这类似于在输入图像上叠加ð’µÃ–ð’µ滤镜。它使用M个过滤器来确保获取所有详细信息。这些M过滤器是特征提取器,可提取诸如边,角等特征。

用于构造CNN的层

以下几层用于构建CNN-

  • 输入层-直接获取原始图像数据。

  • 卷积层卷积层是进行大多数计算的CNN的核心构建块。该层计算输入中神经元与各种面片之间的卷积。

  • 整流的线性单位层-将激活函数应用于上一层的输出。它为网络增加了非线性,因此可以很好地推广到任何类型的函数。

  • 池化层-池化有助于我们在网络发展过程中仅保留重要部分。池化层在输入的每个深度切片上独立运行,并在空间上调整其大小。它使用MAX函数。

  • 完全连接层/输出层-此层计算最后一层的输出分数。结果输出的大小为ðŸÃððÃð„„ ,其中L是数字训练数据集类。

安装有用的Python软件包

您可以使用Keras (这是高级神经网络API),它使用Python编写,并且能够在TensorFlow,CNTK或Theno之上运行。它与Python 2.7-3.6兼容。您可以从https://keras.io/了解更多信息。

使用以下命令安装keras-

pip install keras

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

conda install –c conda-forge keras

使用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倍的平均值和标准偏差。

图像分类器:深度学习的应用

卷积神经网络(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的程序包是将所有所得2D数组转换为单个长连续线性向量的过程。

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'