人工神经网络(ANN)是一种高效的计算系统,其核心主题来源于生物神经网络的类比。神经网络是机器学习的一种模型。在20世纪80年代中期至90年代初期,神经网络架构有了很多重要的进步。在本章中,您将了解更多关于深度学习的知识,这是一种人工智能的方法。
深度学习随着过去十年计算能力的爆炸性增长而成为该领域的有力竞争者。因此,深度学习是一种特别的机器学习方法,其算法受到人脑结构和功能的启发。
机器学习对比深度学习
深度学习目前是最强大的机器学习技术。它之所以强大是因为它们能够在学习解决问题的同时学习最佳的问题表示方式。以下是深度学习和机器学习之间的比较:
对比项 |
深度学习(DL) |
机器学习(ML) |
数据依赖 |
当数据量大时,深度学习算法表现优异。 |
数据量增加对性能影响不大。 |
计算机依赖 |
需要高端机器才能完美运行。 |
可以在低端机器上运行。 |
特征提取 |
可以提取高级特征并从中学习。 |
需要有专家来识别大部分由机器学习提取的特征。 |
执行时间 |
由于参数更多,深度学习算法的执行时间更长,特别是训练时间。但测试时间少于机器学习算法。 |
参数较少,执行时间短。 |
解决问题的方式 |
深度学习解决端到端的问题。 |
机器学习采用传统的分解问题的方式来解决问题。 |
卷积神经网络(CNN)
卷积神经网络与普通神经网络相同,因为它们也由具有可学习权重和偏置的神经元组成。普通神经网络忽略了输入数据的结构,所有的数据都被转化为一维数组输入网络。这种方法适用于常规数据,但如果数据包含图像,则可能会变得繁琐。
CNN轻松解决了这一问题。当处理图像时,CNN考虑到了图像的二维结构,这使它们能够提取图像特有的属性。这样,CNN的主要目标就是从输入层的原始图像数据到输出层的正确类别。普通NN和CNN之间的唯一区别在于对输入数据的处理方式和层的类型。
CNN架构概述
在架构方面,普通神经网络接收输入并通过一系列隐藏层对其进行转换。每一层都通过神经元连接到另一层。普通神经网络的主要缺点是不能很好地扩展到完整的图像。
CNN的架构中的神经元按照宽度、高度和深度三个维度排列。当前层的每个神经元都连接到前一层输出的一小部分。这类似于在输入图像上叠加一个??×??的滤镜。使用??个滤镜是为了确保捕捉到所有的细节。这些??个滤镜是特征提取器,可以提取边缘、角落等特征。
构建CNN的层
以下层用于构建CNN:
-
-
卷积层 —— 这是CNN的核心组件,执行大部分计算。该层计算神经元与输入中的各种补丁之间的卷积。
-
修正线性单元层(ReLU) —— 对前一层的输出应用激活函数。它在网络中添加非线性元素,使其能够泛化任何类型的函数。
-
池化层 —— 帮助我们在网络中保留重要部分。池化层独立地对输入的每一个深度切片进行操作,并对其进行空间上的重新调整大小。它使用MAX函数。
-
全连接层/输出层 —— 计算最后一层的输出分数。最终输出的大小为1×1×?? ,其中?? 是训练数据集类别的数量。
安装有用的Python包
您可以使用Keras,这是一个用Python编写的高级神经网络API,可以在TensorFlow,CNTK或Theano之上运行。它支持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封装对象
estimator = KerasRegressor(build_fn=baseline_model, epochs=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个折叠的平均值和标准差。
图像分类器:深度学习的应用
卷积神经网络(CNNs)解决的是图像分类问题,即确定输入图像属于哪个类别。你可以使用 Keras 深度学习库。注意,我们使用的训练和测试数据集来自以下链接的猫和狗的图像:https://www.kaggle.com/c/dogs-vs-cats/data。
导入 Keras 库和包
首先,导入必要的 Keras 库和包:
from keras.models import Sequential
from keras.layers import Conv2D
from keras.layers import MaxPooling2D
from keras.layers import Flatten
from keras.layers import Dense
初始化神经网络
接下来,创建一个 Sequential
类的对象:
classifier = Sequential()
添加卷积层
然后,编写卷积部分的代码:
classifier.add(Conv2D(32, (3, 3), input_shape=(64, 64, 3), activation='relu'))
这里 relu
是整流函数。
添加池化层
接着,在卷积部分之后对结果特征图执行池化操作:
classifier.add(MaxPooling2D(pool_size=(2, 2)))
展平层
然后,使用展平将所有池化的图像转换成一个连续的向量:
classifier.add(Flatten())
添加全连接层
创建一个全连接层:
classifier.add(Dense(units=128, activation='relu'))
这里的 128
是隐藏单元的数量。通常定义隐藏单元的数量为 2 的幂次方。
初始化输出层
初始化输出层:
classifier.add(Dense(units=1, activation='sigmoid'))
编译 CNN
编译刚刚建立的 CNN:
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'