使用 Python 的 AI – 深度学习
人工神经网络 (ANN) 是一种高效的计算系统,其核心主题借鉴了生物神经网络的类比。神经网络是机器学习的一种模型。在 20 世纪 80 年代中期和 90 年代初期,神经网络取得了许多重要的架构进步。在本章中,您将了解有关人工智能方法深度学习的更多信息。
深度学习是十年爆炸式计算增长的产物,是该领域的有力竞争者。因此,深度学习是一种特殊的机器学习,其算法受到人脑结构和功能的启发。
机器学习与深度学习
深度学习是当今最强大的机器学习技术。它如此强大,是因为他们在学习如何解决问题的同时,学习了表示问题的最佳方式。下面给出了深度学习和机器学习的比较 −
数据依赖性
第一个区别点是基于数据规模增加时 DL 和 ML 的性能。当数据量很大时,深度学习算法表现非常好。
机器依赖性
深度学习算法需要高端机器才能完美运行。另一方面,机器学习算法也可以在低端机器上运行。
特征提取
深度学习算法可以提取高级特征并尝试从中学习。另一方面,需要专家来识别机器学习提取的大多数特征。
执行时间
执行时间取决于算法中使用的众多参数。深度学习比机器学习算法具有更多参数。因此,DL 算法的执行时间,特别是训练时间,比 ML 算法要多得多。但是 DL 算法的测试时间比 ML 算法要短。
解决问题的方法
深度学习以端到端的方式解决问题,而机器学习则使用传统的解决问题的方式,即将问题分解为多个部分。
卷积神经网络 (CNN)
卷积神经网络与普通神经网络相同,因为它们也是由具有可学习权重和偏差的神经元组成。普通神经网络会忽略输入数据的结构,所有数据在输入网络之前都会转换为一维数组。此过程适合常规数据,但如果数据包含图像,则该过程可能很麻烦。
CNN 可以轻松解决这个问题。它在处理图像时会考虑图像的二维结构,从而可以提取特定于图像的属性。这样,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 库和包,如图所示 −
以下名为 Sequenced 的包将把神经网络初始化为 Sequenced 网络。
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())
Next, create a fully connected layer.
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'])
这里的 optimizer 参数用于选择随机梯度下降算法,loss 参数用于选择损失函数,metrics 参数用于选择性能指标。
现在,执行图像增强,然后将图像拟合到神经网络中 −
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'