人工神经网络(ANN)是一种高效的计算系统,其核心主题借鉴了生物神经网络的类比。神经网络是机器学习的一种模型类型。在20世纪80年代中期和90年代初,神经网络取得了许多重要的架构进步。在本章中,你将深入了解深度学习,这是一种人工智能的方法。
深度学习源自数十年计算爆炸性增长,成为该领域的有力竞争者。因此,深度学习是一种特殊的机器学习,其算法灵感来源于人脑的结构和功能。
机器学习与深度学习
深度学习是当今最强大的机器学习技术。它之所以强大,是因为他们在学习如何解决问题的同时,学会了最佳的表达问题方式。深度学习与机器学习的比较如下 −
数据依赖
第一个区别点基于数据规模增加时DL和ML的性能。当数据量很大时,深度学习算法表现非常好。
机器依赖
深度学习算法需要高端机器才能完美运行。另一方面,机器学习算法也可以在低端设备上工作。
特征提取
深度学习算法可以提取高层特征并尝试从中学习。另一方面,专家需要识别机器学习提取的大部分特征。
执行时间
执行时间取决于算法中使用的众多参数。深度学习的参数比机器学习算法更多。因此,DL算法的执行时间,尤其是训练时间,远远超过机器学习算法。但深度学习算法的测试时间比机器学习算法短。
问题解决方法
深度学习从头到尾解决问题,而机器学习则采用传统的解决问题方式,即将其拆解为多个部分。
卷积神经网络(CNN)
卷积神经网络与普通神经网络相同,因为它们同样由具有可学习权重和偏差的神经元组成。普通神经网络忽略输入数据的结构,所有数据在输入网络前都会被转换为一维数组。该过程适用于常规数据,但如果数据包含图像,过程可能会繁琐。
CNN轻松解决了这个问题。它在处理图像时考虑了图像的二维结构,从而能够提取图像特有的属性。通过这种方式,CNN的主要目标是从输入层的原始图像数据过渡到输出层的正确类别。普通神经网络和CNN的唯一区别在于输入数据的处理方式和层的类型。
CNN的架构概述
在结构上,普通神经网络接收输入并通过一系列隐藏层进行转换。每一层通过神经元的帮助与另一层相连。普通神经网络的主要缺点是它们不适合扩展到完整图像。
CNN的架构中,神经元按三维结构排列,分别是宽度、高度和深度。当前层的每个神经元都连接到上一层输出的一小块。这类似于在输入图像上叠加滤波器。它使用M 滤波器以确保获得所有细节。这些M滤波器是特征提取器,提取边缘、角点等特征。
用于构建卷积神经网络的层
以下层用于构建卷积神经网络 −
输入层 − 它直接接收原始图像数据。
卷积层 − 这一层是卷积神经网络的核心构建模块,负责大部分计算。这一层计算神经元与输入中各个片段之间的卷积。
整流线性单位层 − 它对前一层的输出应用激活函数。它为网络增加了非线性,使其能够很好地推广到任何类型的函数。
池层 − 池化帮助我们在网络中只保留重要部分。池层独立于输入的每个深度切片上工作,并在空间上调整其大小。它使用了MAX功能。
全连通层/输出层− 该层计算最后一层的输出分数。最终输出大小为 ,其中 L 是训练数据集的数量。
安装有用的 Python 包
你可以用Keras ,这是一个用Python编写的高级神经网络API,可以运行在TensorFlow、CNTK或Theno之上。它兼容 Python 2.7-3.6。你可以从 https://keras.io/ 了解更多。
使用以下命令安装keras−
python
pip install keras
在conda环境下,你可以使用以下命令 −
python
conda install c conda-forge keras
利用人工神经网络构建线性回归器
在本节中,你将学习如何利用人工神经网络构建线性回归器。你可以用KerasRegressor来实现这个目标。在这个例子中,我们使用波士顿房价数据集,其中有13个数值数据,针对波士顿的房产。该 Python 代码如下所示 −
导入所有所需软件包,如图所示 −
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
现在,加载保存在本地目录中的数据集。
python
dataframe = pandas.read_csv("/Usrrs/admin/data.csv", delim_whitespace = True, header = None)
dataset = dataframe.values
现在,将数据分为输入和输出变量,即X和Y −
python
X = dataset[:,0:13]
Y = dataset[:,13]
由于我们使用基线神经网络,定义模型−
python
def baseline_model():
现在,创建模型如下 −
python
model_regressor = Sequential()
model_regressor.add(Dense(13, input_dim = 13, kernel_initializer = 'normal',
activation = 'relu'))
model_regressor.add(Dense(1, kernel_initializer = 'normal'))
接着,编译模型−
python
model_regressor.compile(loss='mean_squared_error', optimizer='adam')
return model_regressor
现在,将随机种子固定为以下可重复性 −
python
model_regressor.compile(loss='mean_squared_error', optimizer='adam')
return model_regressor
现在,将随机种子固定为以下可重复性 −
python
seed = 7
numpy.random.seed(seed)
用于 scikit-learn 的 Keras 包装对象称为 KerasRegressor。在本节中,我们将用标准化数据集来评估该模型。
python
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的包将以顺序网络初始化神经网络。
python
from keras.models import Sequential
以下称为Conv2D的包用于执行卷积作,即CNN的第一步。
python
from keras.layers import Conv2D
以下软件包称为MaxPoling2D,用于执行池化作,这是CNN的第二步。
python
from keras.layers import MaxPooling2D
以下软件包称为Flatten,是将所有所得二维数组转换为单一长连续线性向量的过程。
python
from keras.layers import Flatten
以下称为Dense的软件包用于实现神经网络的全连接,这是CNN的第四步。
python
from keras.layers import Dense
现在,创建一个顺序类对象。
python
S_classifier = Sequential()
接下来,是编写卷积部分。
python
S_classifier.add(Conv2D(32, (3, 3), input_shape = (64, 64, 3), activation = 'relu'))
这里 relu 是整流函数。
现在,CNN的下一步是在卷积部分后对所得特征映射进行池化作。
python
S-classifier.add(MaxPooling2D(pool_size = (2, 2)))
现在,利用 恭维化 − 将所有合并的图像转换为连续向量
python
S_classifier.add(Flatten())
接下来,创建一个全连通的层。
python
S_classifier.add(Dense(units = 128, activation = 'relu'))
这里,128 是隐藏单元的数量。通常将隐藏单元数定义为2的幂次方。
现在,初始化输出层如下 −
python
S_classifier.add(Dense(units = 1, activation = 'sigmoid'))
现在,编译CNN,我们已经构建了------
python
S_classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
这里的优化参数是选择随机梯度下降算法,损失参数是选择损失函数,度量参数是选择性能指标。
现在,进行图像增强,然后将图像拟合到神经网络中------
python
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')
现在,将数据拟合到我们创建的模型------
python
classifier.fit_generator(training_set,steps_per_epoch = 8000,epochs =
25,validation_data = test_set,validation_steps = 2000)
这里steps_per_epoch训练图像的数量。
现在模型已经训练好,我们可以用它进行如下预测 −
python
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'