什么是卷积神经网络(CNN)以及卷积神经网络背后的 体系结构–旨在解决 图像识别系统和分类问题。卷积神经网络在图像和视频识别,推荐系统和天然语言处理中具备普遍的应用。神经网络相关内容可参考本公众号的文章:javascript
本文相关内容目录:nginx
计算机如何读取图像?git
为何不彻底链接网络?算法
什么是卷积神经网络?编程
卷积神经网络的起源微信
卷积神经网络如何工做?网络
卷积神经网络示例session
图像的卷积app
ReLu层
池化层
堆叠层
使用卷积神经网络预测图像
用例:CIFAR10图像分类器 训练一个网络
参考文献
计算机如何读取图像?
考虑一下纽约天际线的图像,乍一看,您会看到不少建筑物和色彩。那么计算机如何处理该图像?
纽约天际线
图像被分解成3个颜色通道,其是红,绿和蓝。这些颜色通道中的每个都映射到图像的像素。
图像处理
而后,计算机识别与每一个像素关联的值并肯定图像的大小。
然而,对于黑白图像,只有一个信道和所述概念是同样的。
为何不彻底链接网络?
关于卷积神经网络,咱们没法利用彻底链接的网络,这就是缘由!
考虑下图:
卷积神经网络
在这里,咱们已经考虑了输入与尺寸图像的28x28x3像素。若是将其输入到卷积神经网络,则第一个隐藏层自己将具备约2352个权重。
可是这种状况不切实际。如今,看看这个:

卷积神经网络2

任何通用的输入图像将ATLEAST有200x200x3像素大小。第一个隐藏层的大小高达120,000。若是这只是第一个隐藏层,请想象处理整个复杂图像集所需的神经元数量****。
这会致使过分拟合,并且不切实际。所以,咱们没法利用彻底链接的网络。
什么是卷积神经网络?
与神经网络同样,卷积神经网络由具备可学习的****权重和误差的神经元组成。每一个神经元接收几个输入,对它们进行加权求和,将其传递给激活****函数,而后以输出进行响应。
整个网络具备损失 功能,咱们为神经网络开发的全部提示和技巧仍然适用于卷积神经网络。
很简单吧?
顾名思义,神经网络是一种以大脑结构为模型的机器学习技术。它由称为神经元的学习单元网络组成。
这些神经元学习如何将 输入信号 (例如猫的照片)转换为相应的 输出信号 (例如标签“猫”),从而造成自动识别的基础。
让咱们以自动图像识别为例。的过程当中肯定一个是否图片包含猫涉及一个 激活功能。若是图片相似于神经元以前见过的先前的猫图像,则标签“猫”将被激活。
所以,将更多的标记图像中的神经元被暴露于,更好的是学会如何识别其余未标记的图像。咱们称其为训练 神经元的过程 。
卷积神经网络的起源
神经网络的智能是难以想象的。虽然人工神经网络进行了研究,早在20世纪60年代由罗森布拉特,那也只是在末21世纪初,当用神经网络深度学习起飞。关键的推进者是规模计算能力和数据集与谷歌开创性研究深度学习。2012年7月,Google的研究人员将高级神经网络暴露于YouTube切片的一系列未标记的静态图像 视频。
令他们惊讶的是,他们发现神经网络自行****学习了一种检测猫的神经元,从而支持了流行的说法,即“互联网是由猫组成的”。
猫图像处理
当即查看即将发布的AI和深度学习课程批次! 如今读
卷积神经网络如何工做?
有4个分层的 概念, 咱们应该在卷积神经网络的理解:
卷积,
ReLu,
聚集和
彻底链接(彻底链接层)。
让咱们从检查一个简单的示例开始:
CNN示例:
考虑下图:
卷积神经网络-Edureka
这里,有X和O的多种形式。这使计算机难以识别。但目标是,若是输入信号看起来像之前看到的先前图像,则“图像”参考信号将混入或卷积到输入信号中。而后将所得的输出信号传递到下一层。
卷积神经网络-Edureka
所以,计算机能够理解每一个像素。在这种状况下,白色像素被认为是-1,而黑色的有1.这仅仅是咱们实现的方式区分像素的基本二元分类。
卷积神经网络-Edureka
如今,若是咱们只是正常搜索和比较的值正常图像和彼此之间的“x”翻译,咱们会获得一个很大的缺失像素。
那么,咱们该如何解决呢?
卷积神经网络-Edureka
咱们将称为滤镜的像素小块尝试匹配 他们在附近相应的位置,看看是否能找到比赛。经过这样作,卷积神经网络在看到类似性方面比直接尝试匹配整个图像要好得多****。
图像的卷积
卷积具备平移不变的良好特性 。直观上,这意味着每一个卷积滤波器表明一个感兴趣的特征(例如,字母中的像素),而卷积神经网络算法将了解哪些特征构成了最终的参考(即字母)。
咱们有4个卷积步骤:
排列特征和图像
将每一个图像像素乘以相应的特征像素
添加值,并找到总和
将总和除以****特征中的像素总数
卷积神经网络-Edureka
卷积神经网络-Edureka
考虑上图-如您所见,咱们完成了前两个步骤。咱们考虑了一个特征图像及其一个像素。咱们将此乘以****现有图像,而后将乘积存储在另外一个缓冲区特征图像中。
卷积神经网络-Edureka
使用此图像,咱们完成了至少2个步骤。咱们将致使相加的值****相加。而后咱们,除以这个数字由总的像素数特征图像。完成此操做后,将得到的最终值放置在滤波图像的中心,以下所示:
卷积神经网络-Edureka
如今,咱们能够移动该 滤镜,并在图像中的任何像素处执行相同操做。为了更清楚,让咱们考虑另外一个示例:
卷积神经网络-Edureka
如您所见,在执行了前4个步骤以后,咱们获得的值为0.55!咱们采用此值并将其放置在图像中,如前所述。以下图所示:
卷积神经网络-Edureka
一样,咱们将特征移动到图像中的每一个其余位置,而后查看特征如何与该区域匹配。所以,执行此操做后,咱们将得到如下输出:
卷积神经网络-Edureka
在这里,咱们只考虑了一个过滤器。相似地,咱们将与其余全部滤镜执行相同的卷积运算以得到该滤镜的卷积。
的输出信号强度不依赖于其中的特征的位置,但只是是否特征是存在。所以,一个字母可能坐在不一样的位置 和卷积神经网络算法仍然可以认出它。
ReLU层
ReLU是激活功能。可是,什么是激活功能?
整流线性单位(ReLU)变换功能仅在输入大于必定量时激活节点,而输入小于零时输出为零,可是当输入大于某个阈值时,它与线性关系具备线性关系。因变量。
考虑如下示例:
ReLU层
咱们已经考虑了一个具备上述值的简单函数。所以,该函数仅在该值由因变量得到的状况下才执行操做。对于此示例,将得到如下值:
ReLU功能
为何咱们在这里须要ReLU?
卷积神经网络-Edureka
主要目的是消除卷积中的全部负值。全部正值均保持不变,但全部负值均变为零,以下所示:
卷积神经网络-Edureka
所以,在处理了此特定功能以后,咱们将得到如下输出:
卷积神经网络-Edureka
如今,相似地,咱们对全部其余特征图像也执行相同的过程:
卷积神经网络-Edureka
输入从卷积层能够被“平滑”,以减小的敏感性的的过滤器,以噪声和变化。 这种平滑化处理被称为 子采样,而且能够实现经过取平均或取最大过样品的信号。
池化层
在这一层中,咱们将图像堆栈缩小为较小的尺寸。****在经过激活层以后进行合并。为此,咱们执行如下4个步骤:
选择一个窗口大小(一般为2或3)
选择一个步幅(一般为2)
走你的窗口对面的过滤图像
从每个窗口,取最高值
让咱们经过一个例子来理解这一点。考虑在窗口大小为2且跨度为2的状况下执行合并。
卷积神经网络-Edureka
所以,在这种状况下,咱们将窗口大小设为2,而后从4个 值中进行选择。从这些4个值,该最大值有1因此咱们选择1。此外,须要注意的是,咱们开始了一个7×7矩阵,但如今后的同一矩阵池归结为4×4。
但咱们须要移动的整个窗口的整个图像。该过程与上面的过程彻底相同,咱们须要对整个图像重复该过程。
卷积神经网络-Edureka
请注意,这是针对一个过滤器的。咱们还须要为另外2个过滤器执行此操做。完成后,咱们获得如下结果:
卷积神经网络-Edureka
好了,这个过程的简单部分已经结束。接下来,咱们须要堆叠全部这些层!
堆叠各层
所以,为了得到一张图片中的时间范围,咱们将输入通过3层(卷积,ReLU和Pooling)传递后,从7×7矩阵获得4×4矩阵,以下所示:
卷积神经网络-Edureka
可是咱们能够进一步将图像从4×4****缩小到较小的程度吗?
咱们能够!在第一遍以后,咱们须要在迭代中执行这3个操做。所以,第二遍以后,咱们将得出一个2×2矩阵,以下所示:
卷积神经网络-Edureka
网络中的最后层彻底链接,这意味着前层的神经元被链接到每一个神经元在后续的层。
这模仿了高级推理,其中考虑了从输入到输出的全部可能路径。
一样,彻底链接的层是最终发生分类的最后一层。在这里,咱们将通过过滤和缩小的图像放入一个列表中,以下所示:
卷积神经网络-Edureka
所以,接下来,当咱们输入“ X”和“ O”时,向量中将有一些元素****很高。考虑下面的图片,你能够看到“X”也有不一样的元素是高和一样,对于“O”,咱们有不一样的元素是高:
卷积神经网络-Edureka
好了,咱们从以上图像中****了解了什么?
当第1,第4,第5,第10和第11值较高时,咱们能够将图像分类为“ x”。 其余字母的概念也类似–当某些值****按其原样排列时,它们能够映射为实际的字母或咱们须要的数字****,简单吗?
使用卷积神经网络预测图像–全链接层
此时,咱们已经完成了对网络的培训,咱们能够开始预测和检查****分类器的工做了。让咱们看一个简单的例子:
卷积神经网络-Edureka
在上面的图像,咱们有一个12元件以后得到向量传递的输入a的随机信经过全部的层提供了网络。
可是,咱们如何检查以了解咱们所得到的是对仍是错?
经过将得到的值与“ x”和“ o”的列表进行比较,咱们将基于输出数据进行预测!
卷积神经网络-Edureka
好吧,这真的很容易。咱们只添加了从X的向量表中发现的高值(第1,第4,第5,第10和第11),咱们得出的总和为5。咱们对输入图像进行了彻底相同的操做,获得了一个值4.56。
当咱们分开的价值,咱们有一个几率匹配是0.91!让咱们作一样的用量表的“O”如今:
卷积神经网络-Edureka
该表的输出为0.51。好吧,几率为0.51小于0.91,不是吗?
所以咱们能够得出结论,输入的图像为'x'!
用例:使用TensorFlow经过卷积神经网络实现CIFAR10
让咱们训练一个网络,使用TensorFlow内置的卷积神经网络对来自CIFAR10数据集的图像进行分类。
CIFAR10数据集
考虑如下流程图,以了解用例的工做原理:
CIFAR10数据集流程图
安装必要的软件包:
pip3 install numpy tensorflow pickle
训练网络:
import numpy as npimport tensorflow as tffrom time import timeimport math from include.data import get_data_setfrom include.model import model, lr train_y = get_data_set("train") test_y = get_data_set("test") tf.set_random_seed(21)y, output, y_pred_cls, global_step, learning_rate = model() global_accuracy = 0epoch_start = 0 # PARAMS_BATCH_SIZE = 128_EPOCH = 60_SAVE_PATH = "./tensorboard/cifar-10-v1.0.0/" # LOSS AND OPTIMIZERloss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=output, labels=y))optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate, beta1=0.9, beta2=0.999, epsilon=1e-08).minimize(loss, global_step=global_step) # PREDICTION AND ACCURACY CALCULATIONcorrect_prediction = tf.equal(y_pred_cls, tf.argmax(y, axis=1))accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) # SAVERmerged = tf.summary.merge_all()saver = tf.train.Saver()sess = tf.Session()train_writer = tf.summary.FileWriter(_SAVE_PATH, sess.graph) try: print("Trying to restore last checkpoint ...") last_chk_path = tf.train.latest_checkpoint(checkpoint_dir=_SAVE_PATH) save_path=last_chk_path) checkpoint from:", last_chk_path) except ValueError: print("Failed to restore checkpoint. Initializing variables instead.") sess.run(tf.global_variables_initializer()) def train(epoch): global epoch_start epoch_start = time() batch_size = int(math.ceil(len(train_x) / _BATCH_SIZE)) i_global = 0 for s in range(batch_size): batch_xs = train_x[s*_BATCH_SIZE: (s+1)*_BATCH_SIZE] batch_ys = train_y[s*_BATCH_SIZE: (s+1)*_BATCH_SIZE] start_time = time() _, batch_loss, batch_acc = sess.run( optimizer, loss, accuracy], feed_dict={x: batch_xs, y: batch_ys, learning_rate: lr(epoch)}) duration = time() - start_time if s % 10 == 0: percentage = int(round((s/batch_size)*100)) bar_len = 29 filled_len = int((bar_len*int(percentage))/100) bar = '=' * filled_len + '>' + '-' * (bar_len - filled_len) msg = "Global step: {:>5} - [{}] {:>3}% - acc: {:.4f} - loss: {:.4f} - {:.1f} sample/sec" bar, percentage, batch_acc, batch_loss, _BATCH_SIZE / duration)) epoch) def test_and_save(_global_step, epoch): global global_accuracy global epoch_start i = 0 predicted_class = np.zeros(shape=len(test_x), dtype=np.int) while i < len(test_x): j = min(i + _BATCH_SIZE, len(test_x)) batch_xs = test_x[i:j, :] batch_ys = test_y[i:j, :] predicted_class[i:j] = sess.run( y_pred_cls, feed_dict={x: batch_xs, y: batch_ys, learning_rate: lr(epoch)} ) i = j correct = (np.argmax(test_y, axis=1) == predicted_class) acc = correct.mean()*100 correct_numbers = correct.sum() hours, rem = divmod(time() - epoch_start, 3600) minutes, seconds = divmod(rem, 60) mes = " Epoch {} - accuracy: {:.2f}% ({}/{}) - time: {:0>2}:{:0>2}:{:05.2f}" acc, correct_numbers, len(test_x), int(hours), int(minutes), seconds)) if global_accuracy != 0 and global_accuracy < acc: summary = tf.Summary(value=[ tf.Summary.Value(tag="Accuracy/test", simple_value=acc), ]) train_writer.add_summary(summary, _global_step) saver.save(sess, save_path=_SAVE_PATH, global_step=_global_step) mes = "This epoch receive better accuracy: {:.2f} > {:.2f}. Saving session..." global_accuracy)) global_accuracy = acc elif global_accuracy == 0: global_accuracy = acc print("###########################################################################################################") def main(): train_start = time() for i in range(_EPOCH): print("Epoch: {}/{}_EPOCH)) train(i) rem = divmod(time() - train_start, 3600) seconds = divmod(rem, 60) mes = "Best accuracy pre session: {:.2f}, time: {:0>2}:{:0>2}:{:05.2f}" int(hours), int(minutes), seconds)) if __name__ == "__main__": main() sess.close()
卷积神经网络是一种流行的深度学习技术,用于当前的 视觉识别任务。像全部深度学习技术同样,卷积神经网络很是依赖于训练数据的大小和质量。
有了充分准备的数据集,卷积神经网络 在视觉识别任务上就能超越人类。可是,它们仍然没法抵抗****人类可以应付的视觉伪影,例如眩光和噪音。
卷积神经网络的理论****仍在发展中,研究人员正在努力赋予它积极主动的注意力和在线记忆等属性,从而使卷积神经网络可以评估与他们所接受的培训迥然不一样的新项目。
Ť他更好地模拟了哺乳动物的视觉系统,从而走向一个更聪明的人工视觉识别系统。
在测试数据集上运行网络
import numpy as npimport tensorflow as tf from include.data import get_data_setfrom include.model import model test_y = get_data_set("test") y, output, y_pred_cls, global_step, learning_rate = model() _BATCH_SIZE = 128_CLASS_SIZE = 10_SAVE_PATH = "./tensorboard/cifar-10-v1.0.0/" saver = tf.train.Saver()sess = tf.Session() try: print("Trying to restore last checkpoint ...") last_chk_path = tf.train.latest_checkpoint(checkpoint_dir=_SAVE_PATH) save_path=last_chk_path) checkpoint from:", last_chk_path) except ValueError: print("Failed to restore checkpoint. Initializing variables instead.") sess.run(tf.global_variables_initializer()) def main(): i = 0 predicted_class = np.zeros(shape=len(test_x), dtype=np.int) while i < len(test_x): j = min(i + _BATCH_SIZE, len(test_x)) batch_xs = test_x[i:j, :] batch_ys = test_y[i:j, :] j] = sess.run(y_pred_cls, feed_dict={x: batch_xs, y: batch_ys}) : i = j correct = (np.argmax(test_y, axis=1) == predicted_class) acc = correct.mean() * 100 correct_numbers = correct.sum() print() on Test-Set: {0:.2f}% ({1} / {2})".format(acc, correct_numbers, len(test_x))) if __name__ == "__main__": main() sess.close()
output:
Trying to restore last checkpoint ...
Restored checkpoint from: ./tensorboard/cifar-10-v1.0.0/-23460
Accuracy on Test-Set: 78.81% (7881 / 10000)
Training Time
Here you can see how much time takes 60 epoch:
本文应该掌握的结果:
卷积神经网络是一种流行的深度学习技术,用于当前的 视觉识别任务。像全部深度学习技术同样,卷积神经网络很是依赖于训练数据的大小和质量。
有了充分准备的数据集,卷积神经网络 在视觉识别任务上就能超越人类。可是,它们仍然没法抵抗人类可以应付的视觉伪影,例如眩光和噪音。
卷积神经网络的理论仍在发展中,研究人员正在努力赋予它积极主动的注意力和在线记忆等属性,从而使卷积神经网络可以评估与他们所接受的培训迥然不一样的新项目。
参考文献
https://zhuanlan.zhihu.com/p/339390037https://www.edureka.co/https://zhuanlan.zhihu.com/p/339384769https://www.jianshu.com/u/b8ef22aa8878
本文分享自微信公众号 - AI科技与算法编程(kangsinx)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。