TensorFlow 中的卷积网络

TensorFlow 中的卷积网络

是时候看一下 TensorFlow 中的卷积神经网络的例子了。

网络的结构跟经典的 CNNs 结构一样,是卷积层,最大池化层和全链接层的混合。

这里你看到的代码与你在 TensorFlow 深度神经网络的代码类似,我们按 CNN 重新组织了结构。

如那一节一样,这里你将会学习如何分解一行一行的代码。你还可以下载代码自己运行。

感谢 Aymeric Damien 提供了这节课的原始 TensorFlow 模型。

现在开看下!

数据集

你从之前的课程中见过这节课的代码。这里我们导入 MNIST 数据集,用一个方便的函数完成对数据集的 batch,缩放和独热编码。

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets(".", one_hot=True, reshape=False)

import tensorflow as tf

# Parameters
# 参数
learning_rate = 0.00001
epochs = 10
batch_size = 128

# Number of samples to calculate validation and accuracy
# Decrease this if you‘re running out of memory to calculate accuracy
# 用来验证和计算准确率的样本数
# 如果内存不够,可以调小这个数字
test_valid_size = 256

# Network Parameters
# 神经网络参数
n_classes = 10  # MNIST total classes (0-9 digits)
dropout = 0.75  # Dropout, probability to keep units

Weights and Biases

# Store layers weight & bias
weights = {
    ‘wc1‘: tf.Variable(tf.random_normal([5, 5, 1, 32])),
    ‘wc2‘: tf.Variable(tf.random_normal([5, 5, 32, 64])),
    ‘wd1‘: tf.Variable(tf.random_normal([7*7*64, 1024])),
    ‘out‘: tf.Variable(tf.random_normal([1024, n_classes]))}

biases = {
    ‘bc1‘: tf.Variable(tf.random_normal([32])),
    ‘bc2‘: tf.Variable(tf.random_normal([64])),
    ‘bd1‘: tf.Variable(tf.random_normal([1024])),
    ‘out‘: tf.Variable(tf.random_normal([n_classes]))}

卷积

3×3 卷积滤波器。来源:http://deeplearning.stanford.edu/wiki/index.php/Feature_extraction_using_convolution

这是一个 3x3 的卷积滤波器的示例。以 stride 为 1 应用到一个范围在 0 到 1 之间的数据上。每一个 3x3 的部分与权值 [[1, 0, 1], [0, 1, 0], [1, 0, 1]] 做卷积,把偏置加上后得到右边的卷积特征。这里偏置是 0 。TensorFlow 中这是通过 tf.nn.conv2d() 和 tf.nn.bias_add() 来完成的。

def conv2d(x, W, b, strides=1):
    x = tf.nn.conv2d(x, W, strides=[1, strides, strides, 1], padding=‘SAME‘)
    x = tf.nn.bias_add(x, b)
    return tf.nn.relu(x)

tf.nn.conv2d() 函数与权值 W 做卷积。

在 TensorFlow 中,strides 是一个4个元素的序列;第一个位置表示 stride 的 batch 参数,最后一个位置表示 stride 的特征(feature)参数。最好的移除 batch 和特征(feature)的方法是你直接在数据集中把他们忽略,而不是使用 stride。要使用所有的 batch 和特征(feature),你可以把第一个和最后一个元素设成1。

中间两个元素指纵向(height)和横向(width)的 stride,之前也提到过 stride 通常是正方形,height = width。当别人说 stride 是 3 的时候,他们意思是 tf.nn.conv2d(x, W, strides=[1, 3, 3, 1])

为了更简洁,这里的代码用了tf.nn.bias_add() 来添加偏置。 tf.add() 这里不能使用,因为 tensors 的维度不同。

最大池化

带有 2x2 滤波器 和 stride 为 2 的最大池化。来源:

上面是一个最大池化的示例。滤波器大小是 2x2,stride 是 2。左边是输入,右边是输出。 四个 2x2 的颜色代表每一次滤波器应用在左侧来构建右侧的最大结果。例如。[[1, 1], [5, 6]] 变成 6,[[3, 2], [1, 2]] 变成 3。

def maxpool2d(x, k=2):
    return tf.nn.max_pool(
        x,
        ksize=[1, k, k, 1],
        strides=[1, k, k, 1],
        padding=‘SAME‘)

tf.nn.max_pool() 函数做的与你期望的一样,它通过设定 ksize 参数来设定滤波器大小,从而实现最大池化。

模型

Image from Explore The Design Space video

在下面的代码中,我们创建了 3 层来实现卷积,最大池化以及全链接层和输出层。每一层对维度的改变都写在注释里。例如第一层在卷积部分把图片从 28x28x1 变成了 28x28x32。后面应用了最大池化,每个样本变成了 14x14x32。从 conv1 经过多层网络,最后到 output 生成 10 个分类。

def conv_net(x, weights, biases, dropout):
    # Layer 1 - 28*28*1 to 14*14*32
    conv1 = conv2d(x, weights[‘wc1‘], biases[‘bc1‘])
    conv1 = maxpool2d(conv1, k=2)

    # Layer 2 - 14*14*32 to 7*7*64
    conv2 = conv2d(conv1, weights[‘wc2‘], biases[‘bc2‘])
    conv2 = maxpool2d(conv2, k=2)

    # Fully connected layer - 7*7*64 to 1024
    fc1 = tf.reshape(conv2, [-1, weights[‘wd1‘].get_shape().as_list()[0]])
    fc1 = tf.add(tf.matmul(fc1, weights[‘wd1‘]), biases[‘bd1‘])
    fc1 = tf.nn.relu(fc1)
    fc1 = tf.nn.dropout(fc1, dropout)

    # Output Layer - class prediction - 1024 to 10
    out = tf.add(tf.matmul(fc1, weights[‘out‘]), biases[‘out‘])
    return out

Session

现在让我们开始运行神经网络!

# tf Graph input
x = tf.placeholder(tf.float32, [None, 28, 28, 1])
y = tf.placeholder(tf.float32, [None, n_classes])
keep_prob = tf.placeholder(tf.float32)

# Model
logits = conv_net(x, weights, biases, keep_prob)

# Define loss and optimizer
cost = tf.reduce_mean(    tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=y))
optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate)    .minimize(cost)

# Accuracy
correct_pred = tf.equal(tf.argmax(logits, 1), tf.argmax(y, 1))
accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))

# Initializing the variables
init = tf. global_variables_initializer()

# Launch the graph
with tf.Session() as sess:
    sess.run(init)

    for epoch in range(epochs):
        for batch in range(mnist.train.num_examples//batch_size):
            batch_x, batch_y = mnist.train.next_batch(batch_size)
            sess.run(optimizer, feed_dict={
                x: batch_x,
                y: batch_y,
                keep_prob: dropout})

            # Calculate batch loss and accuracy
            loss = sess.run(cost, feed_dict={
                x: batch_x,
                y: batch_y,
                keep_prob: 1.})
            valid_acc = sess.run(accuracy, feed_dict={
                x: mnist.validation.images[:test_valid_size],
                y: mnist.validation.labels[:test_valid_size],
                keep_prob: 1.})

            print(‘Epoch {:>2}, Batch {:>3} -‘
                  ‘Loss: {:>10.4f} Validation Accuracy: {:.6f}‘.format(
                epoch + 1,
                batch + 1,
                loss,
                valid_acc))

    # Calculate Test Accuracy
    test_acc = sess.run(accuracy, feed_dict={
        x: mnist.test.images[:test_valid_size],
        y: mnist.test.labels[:test_valid_size],
        keep_prob: 1.})
    print(‘Testing Accuracy: {}‘.format(test_acc))

原文地址:https://www.cnblogs.com/fuhang/p/9264965.html

时间: 2024-12-08 00:17:20

TensorFlow 中的卷积网络的相关文章

第十四节,TensorFlow中的反卷积,反池化操作以及gradients的使用

反卷积是指,通过测量输出和已知输入重构未知输入的过程.在神经网络中,反卷积过程并不具备学习的能力,仅仅是用于可视化一个已经训练好的卷积神经网络,没有学习训练的过程.反卷积有着许多特别的应用,一般可以用于信道均衡.图像恢复.语音识别.地震学.无损探伤等未知输入估计和过程辨识方面的问题. 在神经网络的研究中,反卷积更多的是充当可视化的作用,对于一个复杂的深度卷积网络,通过每层若干个卷积核的变换,我们无法知道每个卷积核关注的是什么,变换后的特征是什么样子.通过反卷积的还原,可以对这些问题有个清晰的可视

CNN中的卷积核及TensorFlow中卷积的各种实现

声明: 1. 我和每一个应该看这篇博文的人一样,都是初学者,都是小菜鸟,我发布博文只是希望加深学习印象并与大家讨论. 2. 我不确定的地方用了"应该"二字 首先,通俗说一下,CNN的存在是为了解决两个主要问题: 1. 权值太多.这个随便一篇博文都能解释 2. 语义理解.全连接网络结构处理每一个像素时,其相邻像素与距离很远的像素无差别对待,并没有考虑图像内容的空间结构.换句话说,打乱图像像素的输入顺序,结果不变. 然后,CNN中的卷积核的一个重要特点是它是需要网络自己来学习的.这一点很简

一文带你了解卷积网络中的几何学

文章发布于公号[数智物语] (ID:decision_engine),关注公号不错过每一篇干货. 原标题 | An Easy Guide to Gauge Equivariant Convolutional Networks 作者 | Michael Kissner 译者 | AI小山(工程师).Mr-UC(中国科学院大学) 几何深度学习是个很令人兴奋的新领域,但是它的数学运算逐渐转移到代数拓朴和理论物理的范围. 在Cohen等人的论文<规范等变卷积网络和二十面体CNN>中,这种现象尤其明显.

卷积网络中的几何学你了解多少?

几何深度学习是个很令人兴奋的新领域,但是它的数学运算逐渐转移到代数拓朴和理论物理的范围. 在Cohen等人的论文<规范等变卷积网络和二十面体CNN>中,这种现象尤其明显.这篇论文也正是本文要探讨的对象.论文中使用了规范场理论的用辞,那些喜欢把“量子”和“场”两个词合起来使用的所有的物理学当中,规范场理论居于中心地位.论文承诺对规范场理论的基础知识提供一个直观的解读,其实,我也不得不承认,它做到了,而且它也许是目前我看到的最棒的入门介绍.然而,它终究是个很难的学科. 我在这里想做的,是纯直观的解

【深度学习系列】用PaddlePaddle和Tensorflow实现经典CNN网络Vgg

上周我们讲了经典CNN网络AlexNet对图像分类的效果,2014年,在AlexNet出来的两年后,牛津大学提出了Vgg网络,并在ILSVRC 2014中的classification项目的比赛中取得了第2名的成绩(第一名是GoogLeNet,也是同年提出的).在论文<Very Deep Convolutional Networks for Large-Scale Image Recognition>中,作者提出通过缩小卷积核大小来构建更深的网络. Vgg网络结构 VGGnet是Oxford的

第二十二节,TensorFlow中RNN实现一些其它知识补充

一 初始化RNN 上一节中介绍了 通过cell类构建RNN的函数,其中有一个参数initial_state,即cell初始状态参数,TensorFlow中封装了对其初始化的方法. 1.初始化为0 对于正向或反向,第一个cell传入时没有之前的序列输出值,所以需要对其进行初始化.一般来讲,不用刻意取指定,系统会默认初始化为0,当然也可以手动指定其初始化为0. initial_state = lstm_cell.zero_state(batch_size, dtype=tf.float32) 2.初

【TensorFlow实战】TensorFlow实现经典卷积神经网络之VGGNet

VGGNet VGGNet是牛津大学计算机视觉组与Google DeepMind公司的研究员一起研发的深度卷积神经网络.VGGNet探索了卷积神经网络的深度与其性能之间的关系,通过反复堆叠3*3的小型卷积核核2*2的最大池化层,VGGNet成功地构建了16~19层的卷积神经网络.VGGNet相比于之前state-of-the-art网络结构,错误率大幅下降,并取得了ILSVRC 2014比赛分类项目的第二名和定位项目的第一名.VGGNet的结构非常简洁,整个网络都是使用了同样大小的卷积尺寸3*3

【TensorFlow实战】TensorFlow实现经典卷积神经网络之Google Inception Net

Google Inception Net 0.前言 Google Inception Net首次出现在ILSVRC 2014比赛中,就以较大优势获得第一名.那届的Inception Net被称为Inception Net V1,它最大的特点就是控制了计算量和参数量的同时,获得了非常好的分类性能--top-5错误率6.67%,只有AlexNet的一半不到.Inception Net V1有22层深,比AlexNet的8层或者VGGNet的19层还要更深.但其计算量只有15亿次浮点运算,同时只有50

语义分割--全卷积网络FCN详解

语义分割--全卷积网络FCN详解 1.FCN概述 CNN做图像分类甚至做目标检测的效果已经被证明并广泛应用,图像语义分割本质上也可以认为是稠密的目标识别(需要预测每个像素点的类别). 传统的基于CNN的语义分割方法是:将像素周围一个小区域(如25*25)作为CNN输入,做训练和预测.这样做有3个问题: - 像素区域的大小如何确定 - 存储及计算量非常大 - 像素区域的大小限制了感受野的大小,从而只能提取一些局部特征 为什么需要FCN? 我们分类使用的网络通常会在最后连接几层全连接层,它会将原来二