https://www.toutiao.com/a6646310796697534989/

2019-01-14 19:20:20

在机器学习方面,人工神经网络表现非常好。由于人工神经网络是非线性函数,它可以应用于求解问题中许多模式的运算。我们将人工神经网络(ANN)用于图像、音频、单词等各种分类任务中,也可用于时间序列等各种回归分析中。不同的人工神经网络有不同的用途,例如为了找到句子中的下一个序列词,我们使用了循环神经网络(RNN) LSTM,对于图像分类,我们使用卷积神经网络(CNN)。

但是在深入研究卷积神经网络之前让我们看一下神经网络的基本组成部分。

神经网络基本上由三层组成:

  • 输入层 :它是我们为机器学习模型提供输入的层。该层中的神经元数量等于我们数据中的特征总数(图像的像素数)。
  • 隐藏层:来自输入层的输入被输入到隐藏层。根据我们的模型和数据大小,可以有许多隐藏层。每个隐藏层可以有不同数量的神经元,这些神经元的数量通常大于特征的数量。每一层的输出由上一层的输出与该层的可学习权重的矩阵乘法来计算,然后加上可学习的偏差,再加上使网络非线性的激活函数。
  • 输出层:隐藏层的输出然后被输入逻辑函数,如sigmoid或softmax,它将每个类的输出转换为每个类的概率分数。

FeedForward和BackPropagation

具有2个隐藏层的神经网络的基本python代码如下:

activation_function = lambda x: 1.0/(1.0 + np.exp(-x))
input = np.random.randn(3,1)
W1 = np.random.randn(None, 1)
W2 = np.random.randn(None,1)
W3 = np.random.randn(None,1)
b1 = np.zeros(1)
b2 = np.zeros(1)
b3 = np.zeros(1)
hidden_1 = activation(np.dot(W1, input) + b1)
hidden_2 = activation(np.dot(W2, W1) + b2)
output = np.dot(W3, W2) + b3

W1,W2,W3,b1,b2,b3是使用Gradient Descent的可学习参数

卷积神经网络

卷积神经网络或covnets是共享它们的参数的神经网络。想象你有一个图像。它可以表示为一个长方体,有它的长度、宽度(图像的尺寸)和高度(图像通常有红色、绿色和蓝色通道)。

现在想象一下这个图像的一小部分(patch)并在其上运行一个小的神经网络。现在将神经网络滑过整个图像,结果,我们将得到另一个具有不同宽度,高度和深度的图像。现在我们有更多的通道,但宽度和高度更小,而不仅仅是R,G和B通道。他的运算叫做卷积。如果patch大小与图像大小相同,则它将是常规神经网络。由于这个小patch,我们有更少的权重。

现在让我们谈谈整个卷积过程中涉及的一些数学。

  • 卷积层由一组可学习的filters 组成(上图中的patch)。每个filter都具有较小的宽度和高度,深度与输入volume 相同(如果输入层是图像输入,则为3)。例如,如果我们必须在尺寸为34x34x3的图像上运行卷积。filters 的可能尺寸可以是axax3,其中'a'可以是3,5,7等(优选是奇数)但是与图像尺寸相比较小。
  • 在forward pass间,我们逐步在整个输入volume 上滑动每个filter,其中每个步骤称为stride (对于高维图像可以具有值2或3或甚至4),并计算filters 的权重与输入volume的patch之间的点积。
  • 当我们滑动filters 时,我们将为每个filter获得2-D输出,我们将它们堆叠在一起,因此,我们将得到深度等于filters 数量的输出volume 量。网络将学习所有filters 。

用于构建ConvNet的层

让我们通过运行尺寸为32 x 32 x 3的图像的covnets来举个例子。

  • 输入层:此层保存图像的原始输入,宽度为32,高度为32,深度为3。
  • 卷积层:此层通过计算所有filters 和图像patch之间的点积来计算输出volume 。假设我们对此图层使用总共12个filters ,我们将获得尺寸为32 x 32 x 12的输出volume 。
  • 激活函数层:该层将元素激活函数应用于卷积层的输出。一些常见的激活函数是RELU:max(0,x),Sigmoid:1 /(1 + e ^ -x),Tanh,Leaky RELU等。volume保持不变,因此输出volume将具有32 x 32 x 12的尺寸。
  • 池化层:该层周期性地插入到covnets中,其主要功能是减小volume的大小,使计算快速减少内存并防止过度拟合。两种常见类型的池化层是最大池化和平均池化。如果我们使用具有2 x 2 filters 和stride 2的最大池,则生成的volume将为16x16x12。

降维公式

  • 全连接层:该层是常规神经网络层,它从前一层获取输入并计算类得分并输出大小等于类数的1-D数组。

VGGNet

VGGNet的结构

现在VGGNet是经典的卷积神经网络之一。为了尝试一些实验,我创建了一个与VGGNet在架构上几乎相似的模型。现在,因为我已经在CIFAR-10数据集上进行了训练,因此我删除了卷积的最后一层,因此我的模型只比原始VGGNet-16模型少了一个卷积层。

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
cifar_data = tf.keras.datasets.cifar10
(x_train, y_train), (x_test, y_test) = cifar_data.load_data()
print(x_train.shape)
keep_rate = 0.8
keep_prob = tf.placeholder(tf.float32)
n_classes = 10
batch_sz = 1000
x = tf.placeholder("float", [None, 3072])
y = tf.placeholder("float", [None, n_classes])
def oneHotencode(Y):one_hot_ = np.zeros([Y.shape[0], n_classes])for i in range(Y.shape[0]):one_hot_[i, Y[i]] = 1.return one_hot_
def conv2d(x, W):return tf.nn.conv2d(x, W, strides = [1,1,1,1], padding = 'SAME')
def maxpool2d(x):return tf.nn.max_pool(x, ksize = [1,2,2,1], strides = [1,2,2,1], padding = 'SAME')
def convolutional_neural_network(x):weights = {'W_conv1' : tf.Variable(tf.random_normal([3,3,3,64])),'W_conv2' : tf.Variable(tf.random_normal([3,3,64,64])),'W_conv3' : tf.Variable(tf.random_normal([3,3,64,128])),'W_conv4' : tf.Variable(tf.random_normal([3,3,128,128])),'W_conv5': tf.Variable(tf.random_normal([3,3,128,256])),'W_conv6' : tf.Variable(tf.random_normal([3,3,256,256])),'W_conv7' : tf.Variable(tf.random_normal([3,3,256,256])),'W_conv8' : tf.Variable(tf.random_normal([3,3,256,512])),'W_conv9' : tf.Variable(tf.random_normal([3,3,512,512])),'W_conv10' : tf.Variable(tf.random_normal([3,3,512,512])),'W_fc1' : tf.Variable(tf.random_normal([2*2*512, 1024])),'W_fc2' : tf.Variable(tf.random_normal([1024, 1024])),'W_fc3' : tf.Variable(tf.random_normal([1024, n_classes]))}biases = {'b_conv1' : tf.Variable(tf.random_normal([64])),'b_conv2' : tf.Variable(tf.random_normal([64])),'b_conv3' : tf.Variable(tf.random_normal([128])),'b_conv4' : tf.Variable(tf.random_normal([128])),'b_conv5' : tf.Variable(tf.random_normal([256])),'b_conv6' : tf.Variable(tf.random_normal([256])),'b_conv7' : tf.Variable(tf.random_normal([256])),'b_conv8' : tf.Variable(tf.random_normal([512])),'b_conv9' : tf.Variable(tf.random_normal([512])),'b_conv10' : tf.Variable(tf.random_normal([512])),'b_fc1' : tf.Variable(tf.random_normal([1024])),'b_fc2' : tf.Variable(tf.random_normal([1024])),'b_fc3' : tf.Variable(tf.random_normal([n_classes]))}x = tf.reshape(x, [-1, 32, 32, 3])# Conv1conv1 = tf.nn.relu(conv2d(x, weights['W_conv1']) + biases['b_conv1'])# Conv2conv2 = tf.nn.relu(conv2d(conv1, weights['W_conv2']) + biases['b_conv2'])# Max poolconv2 = maxpool2d(conv2)# Conv3conv3 = tf.nn.relu(conv2d(conv2, weights['W_conv3']) + biases['b_conv3'])# Conv4conv4 = tf.nn.relu(conv2d(conv3, weights['W_conv4']) + biases['b_conv4'])# maxpoolconv4 = maxpool2d(conv4)# Conv5conv5 = tf.nn.relu(conv2d(conv4, weights['W_conv5']) + biases['b_conv5'])#Conv6conv6 = tf.nn.relu(conv2d(conv5, weights['W_conv6']) + biases['b_conv6'])#Conv 7conv7 = tf.nn.relu(conv2d(conv6, weights['W_conv7']) + biases['b_conv7'])# max pool conv7 = maxpool2d(conv7)#Conv 8conv8 = tf.nn.relu(conv2d(conv7, weights['W_conv8']) + biases['b_conv8'])#Conv9conv9 = tf.nn.relu(conv2d(conv8, weights['W_conv9']) + biases['b_conv9'])#Conv10conv10 = tf.nn.relu(conv2d(conv9, weights['W_conv10']) + biases['b_conv10'])# max poolconv10 = maxpool2d(conv10)#fc1 fc1 = tf.reshape(conv10, [-1, 2*2*512])fc1 = tf.nn.relu(tf.matmul(fc1, weights['W_fc1']) + biases['b_fc1'])fc1 = tf.nn.dropout(fc1, keep_rate)#fc2 fc2 = tf.nn.relu(tf.matmul(fc1, weights['W_fc2']) + biases['b_fc2'])fc2 = tf.nn.dropout(fc2, keep_rate)#Output Layeroutput = tf.nn.softmax(tf.matmul(fc2, weights['W_fc3']) + biases['b_fc3'])return output
def CNN(trainX, trainY, testX, testY):prediction = convolutional_neural_network(x)cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits= prediction,labels = y))optimizer = tf.train.AdamOptimizer().minimize(cost)n_epochs = 5n_batches = trainX.shape[0] // batch_sztrain_cost = []config = tf.ConfigProto()config.gpu_options.allocator_type = 'BFC'sess = tf.InteractiveSession(config=config)sess.run(tf.global_variables_initializer())for i in range(n_epochs):epoch_loss = 0print("Epoch : {}".format(i))for j in range(n_batches):batchX, batchY = trainX[j * batch_sz : (j+1) * batch_sz], trainY[j * batch_sz : (j+1) * batch_sz]_,c = sess.run([optimizer, cost], feed_dict = {x: batchX, y: batchY})epoch_loss += cif j % batch_sz == 0:print("Batch : {} , Loss : {:.3f}".format(j, c))print("Epoch : {} / {} , Overall loss: {:.3f}".format(i, n_epochs, epoch_loss))train_cost.append(epoch_loss)correct = tf.equal(tf.argmax(prediction, 1), tf.argmax(y, 1))accuracy = tf.reduce_mean(tf.cast(correct, 'float'))print("Accuracy: {:.2f} %".format(accuracy.eval({x: testX, y: testY})))plt.title("Training Cost")plt.plot(train_cost)plt.show()
if __name__ == '__main__':y_train_one_hot = oneHotencode(y_train)y_test_one_hot = oneHotencode(y_test)CNN(x_train.reshape([-1, 3072]), y_train_one_hot, x_test.reshape([-1, 3072]), y_test_one_h

CNN和VGGNet-16背后的架构相关推荐

  1. 【TensorFlow-windows】(七) CNN之VGG-net的测试

    主要内容: 1.CNN之VGG-net的测试 2.该实现中的函数总结 平台: 1.windows 10 64位 2.Anaconda3-4.2.0-Windows-x86_64.exe (当时TF还不 ...

  2. 【恩墨学院】京东618大促网关承载十亿调用量背后的架构实践

    京东618大促网关承载十亿调用量背后的架构实践 王栋 京东618大促,其网关承载了几十亿的流量和调用,在这种情况下,网关系统必须保证整个系统的稳定性和高可用,保证高性能和可靠,以支撑业务.他们面临的是 ...

  3. 转:Tumblr:150亿月浏览量背后的架构挑战

    转:Tumblr:150亿月浏览量背后的架构挑战 by  唐福林  posted on  2012 年 02 月 17 日 导读:和许多新兴的网站一样,著名的轻博客服务Tumblr在急速发展中面临了系 ...

  4. Tumblr:150亿月浏览量背后的架构挑战

    Tumblr:150亿月浏览量背后的架构挑战 2013/04/08 · IT技术, 开发 · 9.9K 阅读 · HBase, Tumblr, 架构 英文原文:High Scalability,编译: ...

  5. 深度学习卷积神经网络CNN之 VGGNet模型主vgg16和vgg19网络模型详解说明(理论篇)

    1.VGG背景 2. VGGNet模型结构 3. 特点(创新.优缺点及新知识点) 一.VGG背景    VGGNet是2014年ILSVRC(ImageNet Large Scale Visual R ...

  6. 2亿QQ用户大调度背后的架构设计和高效运营(上)

    作者介绍 周小军 腾讯高级运维工程师,目前在腾讯社交负责社交业务海量NoSQL集群运维和团队管理.曾在天涯社区任运维副总监.对互联网网站架构.数据中心.云计算及自动化运维等领域有深入研究和理解,积累了 ...

  7. 微信技术总监:一亿用户背后的架构秘密

    点击上方"阿拉奇学Java",选择"置顶或者星标"  每天早晨00点00分, 与你相约! 来自:CSDN.腾讯科技.虎嗅 | 责编:乐乐 往日回顾:如何从 Wi ...

  8. 腾讯微信技术总监:十亿用户增长背后的架构秘密

    微信--腾讯战略级产品,创造移动互联网增速记录,10个月5000万手机用户,433天之内完成用户数从零到一亿的增长过程,千万级用户同时在线,摇一摇每天次数过亿...   在技术架构上,微信是如何做到的 ...

  9. ARM发布全新16纳米A72架构

    ARM近日刚刚正式对外公布了最新一代的64位移动处理器架构Cortex-A72和移动图形处理器Mali-T880. 据悉,这款最新的Cortex-A72架构与目前的Cortex-A53.A57一样,也 ...

最新文章

  1. 使用ab(apachebench)进行压力测试
  2. Order附近语法错误
  3. python基础-2
  4. html5前端实习招聘面试,2018头条春招前端实习生面试题目总结
  5. fastapi学习(二):路径参数获取与GET、POST参数获取
  6. PSIM软件学习---07 元件参数动态扫描
  7. saprk randomSplit方法
  8. 深度学习-图像数据标注工具使用(LabelImg和BBox)
  9. SOFA Weekly | Committer 聊天室、SOFAJRaft 本周发布、新手任务
  10. IB中文诗歌手法分析
  11. Android系统篇(一)——建立Android系统开发环境
  12. java软件视频教程下载 百度云盘_2018最新java夜校视频教程
  13. 浏览器工作原理:浅析HTTP请求流程
  14. EPICS应用程序开发2 -- EPICS概要
  15. 微信公众号展示页面模板
  16. Android 通过adb禁止某个应用上网
  17. css背景图片半透明效果
  18. MySQL 时间戳操作
  19. java高级过滤器、baseServlet、log4j配置使用poi实现excel导入数据库
  20. python 之 print函数的格式化输出(学习笔记)

热门文章

  1. swagger Illegal DefaultValue null for parameter type integer
  2. 冯·诺伊曼奖得主Jorge Nocedal:增强学习中零阶优化方法及其应用(附演讲视频和PPT)
  3. 日本漫画巨匠力作,看漫画就能学会Python,简直不要太轻松
  4. 【项目经理应该知道的97件事】三位一体的项目管理
  5. 在Flex控件中使用XMLListCollection
  6. 大家都能读懂的IT生活枕边书
  7. 基于TensorFlow理解三大降维技术:PCA、t-SNE 和自编码器
  8. 将 TensorFlow 移植到 Android手机,实现物体识别、行人检测和图像风格迁移详细教程
  9. 初学者指南:使用 Numpy、Keras 和 PyTorch 实现最简单的机器学习模型线性回归
  10. 机器人会模仿人类微笑了,但我总觉得这笑容……