- Python人工智能教程
- 主页
- Python人工智能——基础概念
- Python人工智能——入门
- Python人工智能——机器学习
- Python人工智能——数据准备
- 监督学习:分类
- 监督学习:回归
- Python人工智能——逻辑编程
- 无监督学习:聚类
- 自然语言处理
- Python人工智能——NLTK包
- 时间序列数据分析
- Python人工智能——语音识别
- Python人工智能——启发式搜索
- Python人工智能——游戏
- Python人工智能——神经网络
- 强化学习
- Python人工智能——遗传算法
- Python人工智能——计算机视觉
- Python人工智能——深度学习
- Python人工智能资源
- Python人工智能——快速指南
- Python人工智能——有用资源
- Python人工智能——讨论
Python人工智能——深度学习
人工神经网络(ANN)是一种高效的计算系统,其核心思想借鉴了生物神经网络的类比。神经网络是机器学习的一种模型。在20世纪80年代中期和90年代初期,神经网络在架构方面取得了许多重要的进展。本章将详细介绍人工智能的一种方法——深度学习。
深度学习源于过去十年计算能力的爆炸式增长,成为该领域一个强有力的竞争者。因此,深度学习是一种特殊的机器学习,其算法受到人脑结构和功能的启发。
机器学习与深度学习
深度学习是目前最强大的机器学习技术。它之所以如此强大,是因为它在学习如何解决问题的同时,也学习了表示问题的最佳方法。以下是深度学习和机器学习的比较:
数据依赖性
第一个区别在于,当数据规模增加时,深度学习和机器学习的性能表现不同。当数据量很大时,深度学习算法的性能非常好。
机器依赖性
深度学习算法需要高端机器才能完美运行。另一方面,机器学习算法也可以在低端机器上运行。
特征提取
深度学习算法可以提取高级特征并尝试从中学习。另一方面,需要专家来识别机器学习提取的大部分特征。
执行时间
执行时间取决于算法中使用的众多参数。深度学习的参数比机器学习算法多。因此,深度学习算法的执行时间,特别是训练时间,比机器学习算法长得多。但深度学习算法的测试时间比机器学习算法短。
解决问题的方法
深度学习端到端地解决问题,而机器学习则采用传统的方式解决问题,即将问题分解成多个部分。
卷积神经网络 (CNN)
卷积神经网络与普通神经网络相同,因为它们也由具有可学习权重和偏差的神经元组成。普通神经网络忽略输入数据的结构,所有数据在馈送到网络之前都转换为一维数组。此过程适合常规数据,但是如果数据包含图像,则此过程可能会很麻烦。
CNN 可以轻松解决这个问题。它在处理图像时会考虑图像的二维结构,这使得它能够提取图像特有的属性。这样,CNN 的主要目标是从输入层中的原始图像数据到输出层中的正确类别。普通神经网络和 CNN 之间的唯一区别在于输入数据的处理方式和层类型。
CNN 的架构概述
从架构上讲,普通神经网络接收输入并通过一系列隐藏层对其进行转换。每一层都通过神经元连接到另一层。普通神经网络的主要缺点是它们不能很好地扩展到完整的图像。
CNN 的架构具有排列在三维空间(宽度、高度和深度)中的神经元。当前层中的每个神经元都连接到前一层输出的一小部分。这类似于将N×N 过滤器叠加在输入图像上。它使用M 个过滤器来确保获取所有细节。这M 个过滤器是特征提取器,它们提取边缘、角点等特征。
用于构建 CNN 的层
构建 CNN 使用以下几层:
输入层 - 它按原样获取原始图像数据。
卷积层 - 这一层是 CNN 的核心构建块,它执行大部分计算。此层计算神经元与输入中各个区块之间的卷积。
整流线性单元层 - 它将激活函数应用于前一层的输出。它为网络添加非线性,以便它可以很好地泛化到任何类型的函数。
池化层 - 池化有助于我们在网络发展过程中只保留重要的部分。池化层独立地对输入的每个深度切片进行操作并对其进行空间调整大小。它使用 MAX 函数。
全连接层/输出层 - 此层计算最后一层的输出分数。生成的输出大小为1×1×L,其中 L 是训练数据集的类别数。
安装有用的 Python 包
您可以使用Keras,这是一个高级神经网络 API,用 Python 编写,可以在 TensorFlow、CNTK 或 Theano 之上运行。它与 Python 2.7-3.6 兼容。您可以从https://keras.org.cn/了解更多信息。
使用以下命令安装 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 库和包,如下所示:
以下名为 sequential 的包将初始化神经网络作为顺序网络。
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'])
这里的 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'