深度卷积神经网络TensorFlow GPU实现

2023-05-16

深度卷积神经网络TensorFlow GPU实现

Deep Learning CNN’s in Tensorflow with GPUs

Taylor Guo, 2017年6月11日

这里写图片描述

本文讲解卷积神经网络架构,如何在tensorflow中创建卷积神经网络,如何在图像标注上做预测。最后是如何在GPU上运行模型,这样就可以节省时间来创建更好的模型,而不是等待它们收敛。


主要内容:

  • 卷积神经网络介绍

  • 创建卷积神经网络 并 在CPU上训练

  • GPU上训练


先决条件:

  • 基本的机器学习知识

  • 基本的TensorFlow知识

  • AWS账号 (GPU)


卷积神经网络

卷积神经网络是目前图像分类的最新架构。广泛地应用于人脸识别,自动驾驶,物体识别。

基本架构

卷积神经网络的基本架构由3部分组成:卷积,池化 和 全连接。这些组件一起作用,学习输入图像的稠密特征表示。

卷积

这里写图片描述

卷积主要是由卷积核组成(最上面的绿色部分),也称为滤波器,是用一个滑动窗口从输入图像中提取特征。滤波器在输入图像上平移的位移称为步长。每次移动都会计算卷积核和当前输入图像区域的矩阵乘法。可以用多个滤波器堆叠来创建输入图像的高维表示。

如果滤波器没有均匀地与输入图像大小相映射会出现什么状况?

有两种方法处理滤波器大小和输入图像大小尺寸不同,same padding 和 valid padding。Same padding在输入图像的边界外补零(如上图所示)来保留输入图像的长宽。Valid padding不补边缘,在卷积时不会超过输入图像的边界。

通常都会使用same padding 或者 快速降低输入图像的维度。

最后是激活函数(通常是ReLU),对卷积后的结果进行非线性处理。ReLU和其他的激活函数不同,比如sigmoid和tanh,ReLU只有一边,是非对称的。这种一边的形式的激活特性可以让网络创建稀疏表示(隐藏单元是0值),可以增加计算效率。

这里写图片描述

池化

池化操作为了降低维度。它用一个函数对相邻元素数值进行求和。两个常用的函数是最大池化和平均池化。通过计算输入图像区域的最大值,输出图像将这个区域内的亮度值求和,(进行最大或平均)。

池化层也有一个内核,padding沿着步长移动。为了计算池化操作的输出图像的大小,可以用以下公式计算:

(输入图像宽度 - 内核宽度 + 2*padding) / 步长 + 1

这里写图片描述

全连接层

全连接层与神经网络比较类似。输入部分的每个神经元都和输出部分的每个神经元相连接;完全连接起来。因为这种连接,输出部分的每个神经元都只使用一次。

这里写图片描述

在卷积神经网络中,输入层通过池化后填入全连接层。根据不同的任务,用回归或分类算法创建想要的输出。

回顾

上面是卷积神经网络的构建。将输入图像传入卷积网络,提取高维特征。池化总结了图像中的空间特征,减小了维度。最后,这个特征表示传入全连接层给 分类器 或者 回归器。

这里写图片描述


TensorFlow 创建 卷积神经网络

现在已经了解了卷积神经网络,可以在TensorFlow中创建卷积神经网络了。

创建卷积神经网络训练 MNIST 数据集(手写数字图像集)。训练之后,可以获得~98.0%精确度,大概10K次迭代。

搭建环境

Anaconda

非Anaconda

$ pip install tensorflow

数据

这里写图片描述

需要创建3个分离的输入;训练集,验证集,测试集。
验证集提供了更多的数据来调参,可以更好地训练模型。

下载数据

数据可以用如下命令下载:

$ curl https://pjreddie.com/media/files/mnist_train.csv -o data/mnist_train.csv # 104 MB

$ curl https://pjreddie.com/media/files/mnist_test.csv -o data/mnist_test.csv # 17.4 MB

Python Code

import numpy as np

IMAGE_SIZE = 28


def load_train_data(data_path, validation_size=500):
    """
    Load mnist data. Each row in csv is formatted (label, input)
    :return: 3D Tensor input of train and validation set with 2D Tensor of one hot encoded image labels
    """
    # Data format: 1 byte label, 28 * 28 input
    train_data = np.genfromtxt(data_path, delimiter=',', dtype=np.float32)
    x_train = train_data[:, 1:]

    # Get label and one-hot encode
    y_train = train_data[:, 0]
    y_train = (np.arange(10) == y_train[:, None]).astype(np.float32)

    # get a validation set and remove it from the train set
    x_train, x_val, y_train, y_val = x_train[0:(len(x_train) - validation_size), :], x_train[(
        len(x_train) - validation_size):len(x_train), :], \
                                     y_train[0:(len(y_train) - validation_size), :], y_train[(
        len(y_train) - validation_size):len(y_train), :]

    # reformat the data so it's not flat
    x_train = x_train.reshape(len(x_train), IMAGE_SIZE, IMAGE_SIZE, 1)
    x_val = x_val.reshape(len(x_val), IMAGE_SIZE, IMAGE_SIZE, 1)

    return x_train, x_val, y_train, y_val


def load_test_data(data_path):
    """
    Load mnist test data
    :return: 3D Tensor input of train and validation set with 2D Tensor of one hot encoded image labels
    """
    test_data = np.genfromtxt(data_path, delimiter=',', dtype=np.float32)
    x_test = test_data[:, 1:]

    y_test = np.array(test_data[:, 0])
    y_test = (np.arange(10) == y_test[:, None]).astype(np.float32)

    x_test = x_test.reshape(len(x_test), IMAGE_SIZE, IMAGE_SIZE, 1)

    return x_test, y_test

架构

可以用更有帮助的函数创建网络。这些函数用以创建之前讨论的单个组件。

模型定义:

import tensorflow as tf


class Model(object):
    def __init__(self, batch_size=128, learning_rate=1e-4, num_labels=10):
        self._batch_size = batch_size
        self._learning_rate = learning_rate
        self._num_labels = num_labels

    def inference(self, images, keep_prob):
        pass

    def train(self, loss, global_step):
        pass

    def loss(self, logits, labels):
        pass

    def accuracy(self, logits, labels):
        pass

    def _create_conv2d(self, x, W):
        return tf.nn.conv2d(input=x,
                            filter=W,
                            strides=[1, 1, 1, 1],
                            padding='SAME')

    def _create_max_pool_2x2(self, input):
        return tf.nn.max_pool(value=input,
                              ksize=[1, 2, 2, 1],
                              strides=[1, 2, 2, 1],
                              padding='SAME')

    def _create_weights(self, shape):
        return tf.Variable(tf.truncated_normal(shape=shape, stddev=0.1, dtype=tf.float32))

    def _create_bias(self, shape):
        return tf.Variable(tf.constant(1., shape=shape, dtype=tf.float32))

    def _activation_summary(self, x):
        tensor_name = x.op.name
        tf.summary.histogram(tensor_name + '/activations', x)
        tf.summary.scalar(tensor_name + '/sparsity', tf.nn.zero_fraction(x))

模型的TensorFlow 图 表示

这里写图片描述

下面是训练模型的代码。有3个主要的函数:


import tensorflow as tf


class Model(object):
    def __init__(self, batch_size=128, learning_rate=1e-4, num_labels=10):
        self._batch_size = batch_size
        self._learning_rate = learning_rate
        self._num_labels = num_labels

    def inference(self, images, keep_prob):
        with tf.variable_scope('conv1') as scope:
            kernel = self._create_weights([5, 5, 1, 32])
            conv = self._create_conv2d(images, kernel)
            bias = self._create_bias([32])
            preactivation = tf.nn.bias_add(conv, bias)
            conv1 = tf.nn.relu(preactivation, name=scope.name)
            self._activation_summary(conv1)

        # pool 1
        h_pool1 = self._create_max_pool_2x2(conv1)

        with tf.variable_scope('conv2') as scope:
            kernel = self._create_weights([5, 5, 32, 64])
            conv = self._create_conv2d(h_pool1, kernel)
            bias = self._create_bias([64])
            preactivation = tf.nn.bias_add(conv, bias)
            conv2 = tf.nn.relu(preactivation, name=scope.name)
            self._activation_summary(conv2)

        # pool 2
        h_pool2 = self._create_max_pool_2x2(conv2)

        with tf.variable_scope('local1') as scope:
            reshape = tf.reshape(h_pool2, [-1, 7 * 7 * 64])
            W_fc1 = self._create_weights([7 * 7 * 64, 1024])
            b_fc1 = self._create_bias([1024])
            local1 = tf.nn.relu(tf.matmul(reshape, W_fc1) + b_fc1, name=scope.name)
            self._activation_summary(local1)

        with tf.variable_scope('local2_linear') as scope:
            W_fc2 = self._create_weights([1024, self._num_labels])
            b_fc2 = self._create_bias([self._num_labels])
            local1_drop = tf.nn.dropout(local1, keep_prob)
            local2 = tf.nn.bias_add(tf.matmul(local1_drop, W_fc2), b_fc2, name=scope.name)
            self._activation_summary(local2)
        return local2

    def train(self, loss, global_step):
        tf.summary.scalar('learning_rate', self._learning_rate)
        train_op = tf.train.AdamOptimizer(self._learning_rate).minimize(loss, global_step=global_step)
        return train_op

    def loss(self, logits, labels):
        with tf.variable_scope('loss') as scope:
            cross_entropy = tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=labels)
            cost = tf.reduce_mean(cross_entropy, name=scope.name)
            tf.summary.scalar('cost', cost)

        return cost

    def accuracy(self, logits, labels):
        with tf.variable_scope('accuracy') as scope:
            accuracy = tf.reduce_mean(tf.cast(tf.equal(tf.argmax(logits, 1), tf.argmax(labels, 1)), 
            dtype=tf.float32), name=scope.name)
            tf.summary.scalar('accuracy', accuracy)
        return accuracy

    def _create_conv2d(self, x, W):
        return tf.nn.conv2d(input=x,
                            filter=W,
                            strides=[1, 1, 1, 1],
                            padding='SAME')

    def _create_max_pool_2x2(self, input):
        return tf.nn.max_pool(value=input,
                              ksize=[1, 2, 2, 1],
                              strides=[1, 2, 2, 1],
                              padding='SAME')

    def _create_weights(self, shape):
        return tf.Variable(tf.truncated_normal(shape=shape, stddev=0.1, dtype=tf.float32))

    def _create_bias(self, shape):
        return tf.Variable(tf.constant(1., shape=shape, dtype=tf.float32))

    def _activation_summary(self, x):
        tensor_name = x.op.name
        tf.summary.histogram(tensor_name + '/activations', x)
        tf.summary.scalar(tensor_name + '/sparsity', tf.nn.zero_fraction(x))

代码在这里

Inference 这个函数创建对输入表示创建一个预测。它对每个输入返回一个 1×10的张量。张量中的值会传递给损失函数,计算这个预测与基准相差多少。

根据参数batch_size,每次需要处理128个图像。这个技术称为mini-batch。
在更小的数据集上batch上处理输入数据,而不是整个数据集,这样就可以有效使用内存。
因为是在每个小型数据集上更新权重,而不是处理所有样本,模型也能够更快收敛。

Loss 可以用softmax cross entropy 函数执行N路分类。Softmax可以归一化(将tensor加成1个数值)从inference函数产生的输入数据。

张量归一化后,Cross entropy 计算编码标注。cross entropy计算预测值与基准值之间的差异。每次迭代,优化器都最小化cross entropy的值。

Cross Entropy : ylogpred

Loss after Training

训练 和 评估

10k次迭代训练模型。
每1000次迭代,测试验证集上的模型,设置理想的精度。
最后,在测试集上评估训练好的模型,得到测量精度。
经过10k次迭代,精度大概在98.0%。

运行下面的命令,执行代码:

$ python3 mnist_conv2d_medium_tutorial/train.py

import tensorflow as tf

import mnist_conv2d_medium_tutorial.mnist as mnist
from mnist_conv2d_medium_tutorial.model import Model

FLAGS = tf.app.flags.FLAGS
NUM_LABELS = 10


def train():
    model = Model()

    with tf.Graph().as_default():
        images, val_images, labels, val_labels = mnist.load_train_data(FLAGS.train_data)

        x = tf.placeholder(shape=[None, mnist.IMAGE_SIZE, mnist.IMAGE_SIZE, 1], dtype=tf.float32, name='x')
        y = tf.placeholder(shape=[None, NUM_LABELS], dtype=tf.float32, name='y')
        keep_prob = tf.placeholder(tf.float32, name='dropout_prob')
        global_step = tf.contrib.framework.get_or_create_global_step()

        logits = model.inference(x, keep_prob=keep_prob)
        loss = model.loss(logits=logits, labels=y)

        accuracy = model.accuracy(logits, y)
        summary_op = tf.summary.merge_all()
        train_op = model.train(loss, global_step=global_step)

        init = tf.global_variables_initializer()
        saver = tf.train.Saver()

        with tf.Session(config=tf.ConfigProto(log_device_placement=True)) as sess:
            writer = tf.summary.FileWriter(FLAGS.summary_dir, sess.graph)
            sess.run(init)
            for i in range(FLAGS.num_iter):
                offset = (i * FLAGS.batch_size) % (len(images) - FLAGS.batch_size)
                batch_x, batch_y = images[offset:(offset + FLAGS.batch_size), :], labels[
                                                                                  offset:(offset + FLAGS.batch_size), :]

                _, cur_loss, summary = sess.run([train_op, loss, summary_op],
                                                feed_dict={x: batch_x, y: batch_y, keep_prob: 0.5})
                writer.add_summary(summary, i)
                print(i, cur_loss)
                if i % 1000 == 0:
                    validation_accuracy = accuracy.eval(feed_dict={x: val_images, y: val_labels, keep_prob: 1.0})
                    print('Iter {} Accuracy: {}'.format(i, validation_accuracy))

                if i == FLAGS.num_iter - 1:
                    saver.save(sess, FLAGS.checkpoint_file_path, global_step)


def main(argv=None):
    train()


if __name__ == '__main__':
    tf.app.flags.DEFINE_integer('batch_size', 128, 'size of training batches')
    tf.app.flags.DEFINE_integer('num_iter', 10000, 'number of training iterations')
    tf.app.flags.DEFINE_string('checkpoint_file_path', 'checkpoints/model.ckpt-10000', 'path to checkpoint file')
    tf.app.flags.DEFINE_string('train_data', 'data/mnist_train.csv', 'path to train and test data')
    tf.app.flags.DEFINE_string('summary_dir', 'graphs', 'path to directory for storing summaries')

    tf.app.run()

模型训练好后,就可以在测试集上评估了。

import tensorflow as tf

from mnist_conv2d_medium_tutorial import mnist
from mnist_conv2d_medium_tutorial.model import Model

FLAGS = tf.app.flags.FLAGS


def evaluate():
    with tf.Graph().as_default():
        images, labels = mnist.load_test_data(FLAGS.test_data)
        model = Model()

        logits = model.inference(images, keep_prob=1.0)
        accuracy = model.accuracy(logits, labels)

        saver = tf.train.Saver()

        with tf.Session() as sess:
            tf.global_variables_initializer().run()
            saver.restore(sess, FLAGS.checkpoint_file_path)

            total_accuracy = sess.run([accuracy])
            print('Test accuracy: {}'.format(total_accuracy))


def main(argv=None):
    evaluate()


if __name__ == '__main__':
    tf.app.flags.DEFINE_string('checkpoint_file_path', 'checkpoints/model.ckpt-10000', 'path to checkpoint file')
    tf.app.flags.DEFINE_string('test_data', 'data/mnist_test.csv', 'path to test data')

    tf.app.run()

$ python3 mnist_conv2d_medium_tutorial/evaluate.py

运行以下命令,可视化结果:

$ tensorboard –logdir=graphs/ –port=6006 navigate in browser: localhost:6006

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深度卷积神经网络TensorFlow GPU实现 的相关文章

随机推荐

  • 《代码大全》阅读笔记-22-开发者测试

    自动化测试 xff1a http robotframework org HTTP接口测试 xff1a POSTMAN 测试 xff1a 单元测试 xff08 unit testing xff09 组件测试 xff08 component t
  • 步步为营 SharePoint 开发学习笔记系列总结

    概要 为时20多天的sharepoint开发学习笔记系列终于写完了 从基本的配置到web part开发 再到time job开发等等 其中由于自己才接触sharepoint一年的时间 很多认识还很浅 暂时先记下来 让自己能坚持学习的时候不忘
  • vue-cli 常用命令

    npm install g vue cli 安装vue cli vue init webpack 项目名 创建项目 npm run build 打包生产 npm install g serve 安装serve npm run dev npm
  • 修改数据库内存

    SQL gt conn as sysdba Connected SQL gt show parameter memory NAME TYPE VALUE hi shared memory address integer 0 memory m
  • Multi-Language IDE for Professional Developers (Komodo)

    Komodo is the professional IDE for major web languages including Python PHP Ruby Perl HTML CSS and JavaScript You 39 ll
  • mbps

    Mbps 61 Mbit s即兆比特每秒 Million bits per second的缩写 传输速率是指设备的的 数据交换能力 xff0c 也叫 带宽 xff0c 单位是Mbps xff08 兆位 秒 xff09 目前主流的集线器带宽主
  • Matplotlib中figure、subplot、axes、axis的区别

    参考链接 xff1a https blog csdn net JasonZhu csdn article details 85860963 画图板 画布 xff1a 这是一个基础载体 xff0c 类似实际的画图板 xff0c 用pyplot
  • 操作系统知识总结

    操作系统知识总结 1 简述操作系统的定义 操作系统是计算机系统的一种系统软件 xff0c 它统一管理计算机系统的资源和控制程序的执行 2 在多道程序设计技术的系统中 xff0c 操作系统怎样才会占领中央处理器 xff1f 只有当中断装置发现
  • (2016/02/19)多传感器数据融合算法---9轴惯性传感器

    2016年2月18日 传感器的原理 加速度计 xff1a 加速度计 我们可以把它想作一个圆球在一个方盒子中 假定这个盒子不在重力场中或者其他任何会影响球的位置的场中 xff0c 球处于盒子的正中央 你可以想象盒子在外太空中 xff0c 或远
  • 教你一招---如何把桌面弄到D盘

    有很多网友有个习惯 xff0c 就是桌面上有好多文件 xff0c 几乎重要的文件和工作文件都在桌面和我的文档里面 xff0c 嘿嘿 xff0c 我也是其中之一啊 xff0c 哈哈 xff0c 好几次重装了系统丢了文件 xff0c 那个着急啊
  • [转]SSH 原理和基本使用:ssh 安全配置 以及ssh key 认证登录

    一 什么是 SSH xff1f SSH全称 Secure SHell 是一种网络协议 xff0c 顾名思义就是非常安全的shell xff0c 主要用于计算机间加密传输 早期 xff0c 互联网通信都是基于明文通信 xff0c 一旦被截获
  • js如何判断小数点后有几位

    lt script gt var n 61 3 143423423 alert n toString split 34 34 1 length lt script gt js javascrip 截取小数点后几位 第一种 xff0c 利用m
  • 无效类字符串:ProgID: Excel.Application

    网上发现的方案是改注册表 xff0c 其实用不着那么麻烦 xff0c 找2种excel文件 xff1a xlsx和xls xff0c 把默认打开方式都换成你机器上有的程序就行 xff0c 比如WPS Office的WPS 表格
  • JAVA版拆分大整数为2幂的和算法

    import java util ArrayList import java util List public class StrTest public static void main String args 模拟生成一个大整数 Long
  • 使用vue时遇到的内存溢出以及处理

    业务场景 vue帮我们处理很多数据到视图 数据到事件的处理 xff0c 其中不乏许多闭包 事件处理 xff0c 因此比较容易忽视内存溢出的处理 前言 几种常见的内存溢出 1 全局变量引起的内存泄漏 2 闭包引起的内存泄漏 3 dom清空或删
  • ios 显示html标签,超链接颜色以及下划线的处理

    有的时候 xff0c 我们的app需要显示html标签的效果 xff0c 这个时候 xff0c 如果需求不是特别复杂的话 xff0c 我们都是可以使用textView来实现的 对冉Label也可以实现 xff0c 但是label很难实现超链
  • 并发用户数、吞吐量、思考时间的计算公式

    二 软件性能的几个主要术语 1 响应时间 xff1a 对请求作出响应所需要的时间 网络传输时间 xff1a N1 43 N2 43 N3 43 N4 应用服务器处理时间 xff1a A1 43 A3 数据库服务器处理时间 xff1a A2
  • 怎么获得MIUI12系统的root权限

    MIUI12系统怎么样拥有ROOT权限 xff1f 大家都知道 xff0c android手机有ROOT权限 xff0c 一旦手机拥有root相关权限 xff0c 能够实现更强的功能 xff0c 打个比方大家部门的营销部门 xff0c 使用
  • iPhone查看WiFi密码(篇章一)

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 第一章 xff1a iPhone查看那些 曾经手动连接过 的WiFi密码 1 找到 iCloud xff08 不同系统版本位置不同 xff0c 但都在设置里 xff09 进
  • 深度卷积神经网络TensorFlow GPU实现

    深度卷积神经网络TensorFlow GPU实现 Deep Learning CNN s in Tensorflow with GPUs Taylor Guo 2017年6月11日 本文讲解卷积神经网络架构 xff0c 如何在tensorf