- 神经网络的层:
第一层称为输入层,节点数量取决于数据集中存在的特征数量
最后一层称为输出层,数量取决于要预测的内容,对于回归和二元分类任务可以使用单个节点;对于多类问题,将使用多个节点,具体取决于类的数量
中间的层称为隐藏层,隐藏层可以任意深或宽,计算时间会随深入而增加
- 权重与偏差:
权重:衡量某个特征对预测的贡献程度的确定程度
偏差:预测必须从其开始的基值
- 激活函数:
激活函数由神经网络隐藏层中的每个节点计算
输出层计算的结果不是通过另一个激活函数传递,而是通过输出函数传递,取决于要预测的内容
- 损失函数:
损失函数是一种衡量模型预测好坏的方法,可以调整权重和偏差
必须正确设计损失函数,以便可以正确地惩罚错误的模型奖励正确的模型,这意味着希望损失表明所做的预测是远离还是接近真实预测。损失函数取决于任务,对于分类问题可以使用交叉熵损失。
- 前进:前向传播
前向传播是神经网络在做出预测之前执行的一系列计算的名称
- 反向传播:
反向传播是通过更新其权重和偏差来训练神经网络的过程的名称
神经网络通过不断尝试不同的权重然后比较损失来学习预测正确的值,如果损失函数减少,那么当前的权重比之前的要好,反之亦然。这意味着神经网络必须经过多次训练和更新循环才能获得最佳权重和偏差。这个循环就是训练阶段,寻找合适的权重的过程就是优化。
- 训练和测试网络:
将数据拆分为训练集和测试集
对其进行标准化
初始化一个模型
使用模型进行训练和预测
卷积神经网络(CNN)
- CNN是如何工作的?
1、图像由像素组成,每个像素由0~255之间的数字表示,这是计算机处理图像的方式。
卷积过程中需要三个重要的项目:输入图像、特征检测器和特征图。输入图像是被检测的图像,特征检测器是一个矩阵,也称为内核或过滤器。直观地说,输入图像的矩阵表示与特征检测器逐元素相乘以产生特征图,也称为卷积特征或激活图。此步骤目的是为了减少图像大小并处理更快、更容易,在此步骤中丢失了图像的一些特征。
2、在此步骤中应用整流函数(Relu)来增加CNN中的非线性,图像由彼此非线性的不同对象组成。
3、池化
由于物体的空间不变性,即一个物体在图像中的位置不会影响神经网络检测其特定特征的能力。池化使CNN能够检测各种图像中的特征,而不考虑图像中的照明差异和图像的不同角度。
由不同类型的池化:如最小池化和最大池化。最大池化的工作原理是在特征图上放置一个2*2矩阵,并在该框中挑选最大的值,然后从左向右移动,穿过整个特征图,每次挑选最大的值。
这些值最后形成一个新的矩阵,成为池化特征图,作用是保留主要特征,同时减少图像大小,这有助于减少过度拟合。
4、展平
将整个池化特征图矩阵转换为单个列,然后将其馈送到神经网络中进行处理。
5、全连接
这一步由输入层、全连接层和输出层组成,全连接层相当于人工神经网络中的隐藏层,但它是全连接的。
- 使用TensorFlow的Keras库实现卷积神经网络
1、导入需要的包:
1 | from keras.models import Sequential |
Sequential:初始化神经网络
Convolution2D:用于制作处理图像的卷积网络
MaxPooling2D:用于添加池化层
Flatten:将池化特征图转换为单个列并传递给全连接层的函数
Dense:将全连接层添加到神经网络
2、初始化神经网络
1 | classifier = Sequential() |
3、卷积
1 | classifier.add(Convolution2D(32, 3, 3, input_shape = (256, 256, 3), activation=’relu’)) |
添加卷积层,第一个参数是想要创建的特征检测器的数量,通常是以32个开始,第二和第三个参数是特征检测器矩阵的尺寸。input_shape是输入图形的形状,黑白图像转换为二维数组,彩色转换为三维数组。最后一个参数是激活函数,图像分类是一个非线性问题,使用relu函数可以确保在计算过程中没有负数像素值。
4、池化
1 | classifier.add(MaxPooling2D(pool_size=(2,2))) |
通常创建一个2*2的池大小。
5、展平
1 | classifier.add(Flatten()) |
6、全连接
1 | classifier.add(Dense(output_dim = 128, activation=’relu’)) |
通过使用Dense函数将上面得到的向量作为神经网络的输入,第一个参数是全连接层的节点数,维数越多,拟合模型所需要的计算资源越多,一般选择2的幂。第二个函数时激活函数。
1 | classifier.add(Dense(output_dim=1, activation=’sigmoid’)) |
添加输出层。期望得到二元结果使用sigmoid函数,期望得到两个以上结果,使用softmax函数。
7、编译CNN
1 | classifier.compile(optimizer=’adam’, loss=’binary_crossentropy’,metrics=[‘accuracy’]) |
使用编译函数编译CNN,需要三个参数:优化器、损失函数和性能指标。
8、拟合CNN
进行图像增强处理防止过度拟合,是通过翻转、重新缩放、缩放和裁剪图像来进行工作的。第一个参数是确保图像被重新缩放后值介于0~1之间,
1 | from keras.preprocessing.image import ImageDataGenerator |
测试数据不需要跟训练数据一样采用图像增强。接下来是创建训练集和测试集:
1 | training_set = train_datagen.flow_from_directory(‘training_set’, target_size=(256, 256), batch_size=32, class_mode=’binary’) |
第一个参数是训练集的路径,第二个参数是CNN期望的图像大小。btach_size是在权重更新之前通过网路的图像数量,class_mode指示分类是否是二进制。
1 | classifier.fit_generator(training_set, steps_per_epoch=5000, epochs=25, validation_data=test_set, nb_val_samples=1000) |
最后调用拟合函数并使用测试集测试其性能,第一个参数是训练集,第二个参数是训练集中的参数数量,第三个参数是训练的次数,第四个参数是测试集,最后一个参数是测试集的参数数量。
9、进行单一预测
1 | import numpy as np |
使用预测函数使用新图像进行预测,在这之前需要对其进行预处理。
1 | test_image = image.load_img(‘brain_image1.jpg’, target_size=(256, 256)) |
加载想要预测的图像,第一个参数是图像的路径,第二个参数是图像的大小,应与训练过程中的大小相同。
1 | test_image = image.img_to_array(test_image) |
使用彩色图像则将图像转换为一个三维数组。
1 | test_image = np.expand_dims(test_image, axis=0) |
预测需要四个维度,第四个维度对应批量大小,这是因为在神经网络中要预测的数据通常作为批次传入。使用np.expand_dims函数添加这个维度,最后使用predict预测图像。