Tensorflow实战6:Tensorflow实现AlexNet

经典卷积神经网络发展历史大盘点 关于CNN,迄今为止已经提出了各种网络结构。在1998年首次被提出的CNN元祖LeNet(读音:lei nei te),另一个是在深度学习受到关注的2012年被提出的AlexNet(读音:ai lei ke si nei te)。 1. LeNet LeNet在1998年被提出,是进行写数字识别的网络。如图7-27所示,它有连续的卷积层和池化层(正确地讲,是只“抽选元素”的子采样层),最后经全连接层输出结果。 和“现在的CNN"相比,LeNet有几个不同点。第-个不同点在于激活函数。LeNet中使. 阅读详情

算法实现过程的详细介绍

\quad 首先需要介绍一下AlexNet,2012年Hinton的学生Alex Krizhevsky提出了深度卷积神经网络模型AlexNet,它可以算是LeNet的一种更宽更深的版本。AlexNet中包含了几个技术点,也首次在CNN中成功应用了ReLU,Dropout和LRN等Trick。同时AlexNet也使用了GPU进行运算加速,作者开源了他们在GPU上训练神经网络的CUDA代码。AlexNet包含了6亿3000万个连接,6000万个参数和65万个神经元,拥有5个卷积层,其中3个卷积层后面连接了连接了最大池化层,最后还有3个全连接层。AlexNet以显著的优势赢得了竞争激烈的ILSVRC 2012的比赛,top-5的错误率降低到了16.4%,相比第二名的成绩26.2%错误率有了巨大的提升。AlexNet可以说是神经网络在低谷期后的第一次发声,确立了深度学习在计算机视觉的统治地位,同时也推动了深度学习在语音识别,自然语言处理,强化学习等领域的拓展。
\quad AlexNet将Lenet的思想发扬光大,把CNN的基本原理应用到了很深很宽的网络中。AlexNet主要用到的新技术如下:

  • 使用ReLU作为CNN的激活函数,并验证其效果在比较深的网络中超过了Sigmoid,成功解决了Sigmoid在网络比较深时的梯度弥散问题。虽然ReLU激活函数在不久之前就提出了,但是直到AlexNet的出现才将其发扬光大。
  • 训练时使用Dropout随机忽略一部分神经元,以避免模型过拟合。Dropout虽然有单独的论文论述,但是AlexNet将其实用化,通过实践证明了它的效果。在AlexNet中主要是最后几个全连接层使用了Dropout。
  • 在CNN中使用重叠的最大池化。之前CNN中普遍使用平均池化,AlexNet全部使用最大池化,避免平均池化的模糊化效果。并且AlexNet中提出让步长比池化核的尺寸小,这样池化层的输出之间有重叠和覆盖,提升了特征的丰富性。
  • 提出了LRN层,对局部神经元的活动创建竞争机制,使得其中响应比较大的变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。
  • 使用CUDA加速深度卷积网络的训练,利用GPU强大的并行计算能力,处理神经网络训练时大量的矩阵运算。AlexNet使用了两块GTX 580 GPU进行训练,单个GTX 580只有3G显存,这限制了可训练的网络的最大规模。因此,作者将AlexNet分布在两个GPU上,在每个GPU的显存中存储一半的神经元的参数。因为GPU之间的通信方便,可以互相访问显存,而不需要通过主机内存,所以同时使用多块GPU也是非常高效的。同时,AlexNet的设计让GPU之间的通信只在网络的某些层进行,控制了通信的性能损耗。
  • 数据增强,随机的人从256 × \times × 256的原始图像截取224 × \times × 224大小的区域(以及水平翻转的镜像),相当于增加了(256-224)^2$\times$2=2048倍的数据量,使用数据增强之后可以大大减轻过拟合,提升泛化能力。进行预测时,则是取图片的4个角加中间共5个位置,并进行左右翻转,一共获得10张图片,对他们进行预测并对10次结果求均值。同时,AlexNet论文中提到了会对RGB图像数据进行PCA处理,并对主成分做一个标准差为0.1的高斯扰动,增加一些噪声,这个Trick可以让错误率再下降1%
  1. 首先导入会用到的系统库,包括datetime,math和time,并载入tensorflow。
#coding=utf-8
from datetime import datetime
import math
import time
import tensorflow as tf
  1. 这里设置batch_size为32,num_batches为100,即总共测试100个batch的数据。
#设置batch_size=32,num_batches为100
batch_size = 32
num_batches = 100
  1. 定义一个用来显示网络每一层结构的函数print_actications,展示每个卷积层或池化层输出tensor的尺寸。这个函数接受一个tensor作为输入,并显示其名称(t.op.name)和tensor尺寸(t.get_shape().as_list())。
def print_activations(t):
    print(t.op.name, ' ', t.get_shape().as_list())
  1. 接下来设计AlexNet网络的结构。我们先定义函数inference,它接受images作为输入,返回最后一层pool5(第5个池化层)及parameters(AlexNet中所有需要训练的模型参数)。这个inference函数将会很大,包括多个卷积层和池化层,下面会拆分成几个小段讲解。
    \quad 首先是第一个卷积层conv1,这里使用Tensorflow中的name_scope,通过with tf.name_scope(‘conv1’) as scope可以将scope内生成的Variabler自动命名为conv1/xxx,便于区分不同卷积层之间的组件。然后定义第一个卷积层,和之前一样使用tf.truncated_normal截断的正态分布函数(标准差为0.1)初始化卷积核的参数kernel。卷积核尺寸为11 × \times × 11,颜色通道为3,卷积核尺寸为64.准备好了kernel,再使用tf.nn.conv2d对输入images完成卷积操作,我们将strides步长设置为4*4(即在图片上4 × \times × 4区域只取样一次,横向间隔是4,纵向间隔也是4,每次取样的卷积核大小都为11 × \times × 11),padding模式设为SAME。将卷积层的biases全部初始化为0,再使用tf.nn.bias_add将conv和bias加起来,并使用激活函数tf.nn.relu对结果进行非线性处理。最后使用print_activations将这一层最后输出的tensor_conv1的结构打印出来,再将这一层可训练的参数kernel,biases添加到parameters。
def inference(images):
    parameters = []
    with tf.name_scope('conv1') as scope:
        #第一个卷积层
        kernel = tf.Variable(tf.truncated_normal([11, 11, 3, 64], dtype=tf.float32, stddev=1e-1), name='weights')
        conv = tf.nn.conv2d(images, kernel, [1, 4, 4, 1], padding='SAME')
        biases = tf.Variable(tf.constant(0.0, shape=[64], dtype=tf.float32), trainable=True, name='bias')
        bias = tf.nn.bias_add(conv, biases)
        conv1 = tf.nn.relu(bias, name=scope)
        print_activations(conv1)
        parameters += [kernel, biases]

\quad 在第一个卷积层后面再添加LRN层和最大池化层。先使用tf.nn.lrn对前面输出的tensor conv1进行LRN处理,这里使用的depth_radius设为4,bias设为1,alpha为0.001/9,beta为0.75,基本都是AlexNet的论文中的推荐值,不过目前除了AlexNet,其他经典的卷积神经网络模型基本都放弃了LRN(主要是效果不明显),而我们使用LRN也会让前馈,反馈的速度大大下降(整体速度下降到1/3),读者可以自主选择是否使用LRN。下面使用tf.nn.max_pool对前面的输出lrn1进行最大池化处理,这里的池化尺寸为3 × \times × 3,即将3 × \times × 3大小的像素块降为1 × \times × 1的像素,取样的步长为2 × \times × 2,padding模式为VALID,即取样时不能超过边框,不像SAME模式那样可以填充边界外的点。最后将输出结果pool1的结构打印出来。

    #添加LRN和最大池化层
    lrn1 = tf.nn.lrn(conv1, 4, bias=1.0, alpha=0.001/9, beta=0.75, name='lrn1')
    pool1 = tf.nn.max_pool(lrn1, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1], padding='VALID', name='pool1')
    print_activations(pool1)

\quad 接下来设计第2个卷积层,卷积核的尺寸为5 × \times × 5,输入通道数(即上一层的输出通道数,也就是上一层的卷积核数量)为64,卷积核数量为192。同时,卷积的步长也全部设为1,即扫描全图像素。

#第二个卷积层
    with tf.name_scope('conv2') as scope:
        kernel = tf.Variable(tf.truncated_normal([5, 5, 64, 192], dtype=tf.float32, stddev=1e-1), name='weights')
        conv = tf.nn.conv2d(pool1, kernel, [1, 1, 1, 1], padding='SAME')
        biases = tf.Variable(tf.constant(0.0, shape=[192], dtype=tf.float32), trainable=True, name='biases')
        bias = tf.nn.bias_add(conv, biases)
        conv2 = tf.nn.relu(bias, name=scope)
        parameters += [kernel, biases]
        print_activations(conv2)

\quad 接下来对第2个卷积层的输出conv2进行处理,同样是先做LRN处理,再进行最大池化处理,参数和之前完全一样

 #对conv2处理
    lrn2 = tf.nn.lrn(conv2, 4, bias=1.0, alpha=0.001/9, beta=0.75, name='lrn2')
    pool2 = tf.nn.max_pool(lrn2, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1], padding='VALID', name='pool2')
    print_activations(pool2)

\quad 下面创建第3个卷积层,基本结构和前面两个类似,也只是参数不同。这一层的卷积核尺寸为3 × \times × 3,输入的通道数为192,卷积核数量继续扩大为384,同时卷积的步长全为1,其他地方和前面保持一致。

#第3个卷积层
    with tf.name_scope('conv3') as scope:
        kernel = tf.Variable(tf.truncated_normal([3, 3, 192, 384], dtype=tf.float32, stddev=1e-1), name='weights')
        conv = tf.nn.conv2d(pool2, kernel, [1, 1, 1, 1], padding='SAME')
        biases = tf.Variable(tf.constant(0.0, shape=[384], dtype=tf.float32), trainable=True, name='biases')
        bias = tf.nn.bias_add(conv, biases)
        conv3 = tf.nn.relu(bias, name=scope)
        parameters += [kernel, biases]
        print_activations(conv3)

\quad 第4个卷积层和之前也类似,这一层的卷积核尺寸为3 × \times × 3,输入通道数384,但是卷积核尺寸数量将为256。

	#第4个卷积层
    with tf.name_scope('conv4') as scope:
        kernel = tf.Variable(tf.truncated_normal([3, 3, 384, 256], dtype=tf.float32, stddev=1e-1), name='weights')
        conv = tf.nn.conv2d(conv3, kernel, [1, 1, 1, 1], padding='SAME')
        biases = tf.Variable(tf.constant(0.0, shape=[256], dtype=tf.float32), trainable=True, name='biases')
        bias = tf.nn.bias_add(conv, biases)
        conv4 = tf.nn.relu(bias, name=scope)
        parameters += [kernel, biases]
        print_activations(conv4)

\quad 最后的第5个卷积层同样是3 × \times × 3大小的卷积核,输入通道数为256,卷积核数量也为256。

	#第5个卷积层
    with tf.name_scope('conv5') as scope:
        kernel = tf.Variable(tf.truncated_normal([3, 3, 256, 256], dtype=tf.float32, stddev=1e-1), name='weights')
        conv = tf.nn.conv2d(conv4, kernel, [1, 1, 1, 1], padding='SAME')
        biases = tf.Variable(tf.constant(0.0, shape=[256], dtype=tf.float32), trainable=True, name='biases')
        bias = tf.nn.bias_add(conv, biases)
        conv5 = tf.nn.relu(bias, name=scope)
        parameters += [kernel, biases]
        print_activations(conv5)

\quad 在第5个卷积层之后,还有一个最大池化层,这个池化层和前两个卷积层一致,最后我们返回这个池化层的输出pool5。至此,inference函数就完成了,它可以创建AlexNet的卷积部分。在正式使用AlexNet来训练或预测时,还需要添加3个全连接层,隐含节点分别为4096,4096和1000。由于最后3个全连接层的计算量很小,所以没放到速度测评中,他们对耗时的影响很小。

 #最大池化层pool5
    pool5 = tf.nn.max_pool(conv5, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1], padding='VALID', name='pool5')
    print_activations(pool5)
    #未添加全连接层,因为对计算耗时影响小
    return pool5, parameters
  1. 开始实现一个评估AlexNet每轮计算时间的函数time_tensorflow_rn。这个函数的第一个输入是Tensorflow的Session,第二个变量是需要评测的运算因子,第三个变量是测试的名称。先定义预热轮数num_steps_burn_in=10,它的作用是给程序热身,头几轮迭代有显存加载,cache的命中等问题因此可以跳动,我们只需要考量10轮迭代之后的计算时间。同时,也记录总时间total_duratiuon和平方和total_duration_squared用以计算方差。我们进行num_batchs+num_steps_burn_in次迭代计算,使用time.time()记录时间,每次迭代通过session.run(target)执行。在初始热身的num_steps_burn_in次迭代后,每10轮迭代显示当前迭代需要的时间。同时每轮将total_duration和total_duration_squared累加,以便后面计算每轮耗时的均值和标准差。在循环结束后,计算每轮迭代的平均耗时nm和标准差sd,最后将结果显示出来。这样就完成了计算每轮迭代耗时的评测函数。
#定义AlexNet的每轮时间评估函数
def time_tensorflow_run(session, target, info_string):
    num_steps_burn_in = 10 #程序预热
    total_durations = 0.0
    total_duration_squared = 0.0
    for i in range(num_batches + num_steps_burn_in):
        start_time = time.time()
        _ = session.run(target)
        duration = time.time() - start_time
        if i >= num_steps_burn_in:
            if not i % 10:
                print('%s: step %d, duration = %.3f'%(datetime.now(), i - num_steps_burn_in, duration))
            total_durations += duration
            total_duration_squared += duration * duration
    #计算每轮迭代的平均耗时和标准差sd,最后将结果显示出来
    mn = total_durations / num_batches
    vr = total_duration_squared / num_batches - mn * mn
    sd = math.sqrt(vr)
    print('%s: %s across %d steps, %.3f +/- %.3f sec / batch'%(datetime.now(), info_string, num_batches, mn, sd))
  1. 接下来是主函数run_benchmark。首先使用with tf.Graph().as_default()定义默认的Graph方便后面使用。如前面所说,我们并不使用ImageNet数据集来训练,只使用随机图片数据测试前馈和反馈计算的耗时。我们使用tf.random_normal函数构造正态分布(标准差为0.1)的随机tensor,第一个维度是batch_size,即每轮迭代的样本数,第二个和第三个维度是图片的尺寸image_size=224,第4个维度是图片的颜色通道数。接下来,使用前面定义的inference函数构建整个AlexNet网络,得到最后一个池化层的输出pool5和网络中需要训练的参数的集合parameters。接下来,我们使用tf.Session()创建新的Session并通过tf.global_variables_initializer()初始化所有参数。再进行AlexNet的foward计算的评测,这里直接使用time_tensorflow_run统计运算时间,传入的target就是pool5,即卷积网络的最后一个池化层的输出。然后进行backward即训练过程的评测,这里和forward有些不同,我们需要给最后的输出pool5设置一个优化目标Loss,我们使用tf.nn.l2_loss计算pool5的loss,再使用tf.gradients求相对于loss的所有模型参数的梯度,这样就模拟了一个训练的过程。当然,训练时还有一个根据梯度更新参数的过程,不过这个计算量很小,就不统计在评测程序里了。最后我们使用time_tensorflow_run统计Backward的运算时间,这里的target就是求整个网络梯度grad的操作。
#定义主函数run_benchmark
def run_benchmark():
    with tf.Graph().as_default():
        image_size = 224
        images = tf.Variable(tf.random_normal([batch_size, image_size, image_size, 3], dtype=tf.float32, stddev=1e-1))
        pool5, parameters = inference(images)
        init = tf.global_variables_initializer()
        sess = tf.Session()
        sess.run(init)
        time_tensorflow_run(sess, pool5, "Foward")
        objective = tf.nn.l2_loss(pool5)
        grad = tf.gradients(objective, parameters)
        time_tensorflow_run(sess, grad, "Foward-backward")

run_benchmark()

算法实现的完整代码

#coding=utf-8
from datetime import datetime
import math
import time
import tensorflow as tf
#设置batch_size=32,num_batches为100
batch_size = 32
num_batches = 100
#定义一个现实网络每一层结构的函数print_actications,展示每一个卷积层或池化层输出tensor的尺寸。
def print_activations(t):
    print(t.op.name, ' ', t.get_shape().as_list())
#设计Alexnet的网络结构
def inference(images):
    parameters = []
    with tf.name_scope('conv1') as scope:
        #第一个卷积层
        kernel = tf.Variable(tf.truncated_normal([11, 11, 3, 64], dtype=tf.float32, stddev=1e-1), name='weights')
        conv = tf.nn.conv2d(images, kernel, [1, 4, 4, 1], padding='SAME')
        biases = tf.Variable(tf.constant(0.0, shape=[64], dtype=tf.float32), trainable=True, name='bias')
        bias = tf.nn.bias_add(conv, biases)
        conv1 = tf.nn.relu(bias, name=scope)
        print_activations(conv1)
        parameters += [kernel, biases]
    #添加LRN和最大池化层
    lrn1 = tf.nn.lrn(conv1, 4, bias=1.0, alpha=0.001/9, beta=0.75, name='lrn1')
    pool1 = tf.nn.max_pool(lrn1, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1], padding='VALID', name='pool1')
    print_activations(pool1)
    #第二个卷积层
    with tf.name_scope('conv2') as scope:
        kernel = tf.Variable(tf.truncated_normal([5, 5, 64, 192], dtype=tf.float32, stddev=1e-1), name='weights')
        conv = tf.nn.conv2d(pool1, kernel, [1, 1, 1, 1], padding='SAME')
        biases = tf.Variable(tf.constant(0.0, shape=[192], dtype=tf.float32), trainable=True, name='biases')
        bias = tf.nn.bias_add(conv, biases)
        conv2 = tf.nn.relu(bias, name=scope)
        parameters += [kernel, biases]
        print_activations(conv2)
    #对conv2处理
    lrn2 = tf.nn.lrn(conv2, 4, bias=1.0, alpha=0.001/9, beta=0.75, name='lrn2')
    pool2 = tf.nn.max_pool(lrn2, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1], padding='VALID', name='pool2')
    print_activations(pool2)
    #第3个卷积层
    with tf.name_scope('conv3') as scope:
        kernel = tf.Variable(tf.truncated_normal([3, 3, 192, 384], dtype=tf.float32, stddev=1e-1), name='weights')
        conv = tf.nn.conv2d(pool2, kernel, [1, 1, 1, 1], padding='SAME')
        biases = tf.Variable(tf.constant(0.0, shape=[384], dtype=tf.float32), trainable=True, name='biases')
        bias = tf.nn.bias_add(conv, biases)
        conv3 = tf.nn.relu(bias, name=scope)
        parameters += [kernel, biases]
        print_activations(conv3)
    #第4个卷积层
    with tf.name_scope('conv4') as scope:
        kernel = tf.Variable(tf.truncated_normal([3, 3, 384, 256], dtype=tf.float32, stddev=1e-1), name='weights')
        conv = tf.nn.conv2d(conv3, kernel, [1, 1, 1, 1], padding='SAME')
        biases = tf.Variable(tf.constant(0.0, shape=[256], dtype=tf.float32), trainable=True, name='biases')
        bias = tf.nn.bias_add(conv, biases)
        conv4 = tf.nn.relu(bias, name=scope)
        parameters += [kernel, biases]
        print_activations(conv4)
    #第5个卷积层
    with tf.name_scope('conv5') as scope:
        kernel = tf.Variable(tf.truncated_normal([3, 3, 256, 256], dtype=tf.float32, stddev=1e-1), name='weights')
        conv = tf.nn.conv2d(conv4, kernel, [1, 1, 1, 1], padding='SAME')
        biases = tf.Variable(tf.constant(0.0, shape=[256], dtype=tf.float32), trainable=True, name='biases')
        bias = tf.nn.bias_add(conv, biases)
        conv5 = tf.nn.relu(bias, name=scope)
        parameters += [kernel, biases]
        print_activations(conv5)
    #最大池化层pool5
    pool5 = tf.nn.max_pool(conv5, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1], padding='VALID', name='pool5')
    print_activations(pool5)
    #未添加全连接层,因为对计算耗时影响小
    return pool5, parameters

#定义AlexNet的每轮时间评估函数
def time_tensorflow_run(session, target, info_string):
    num_steps_burn_in = 10 #程序预热
    total_durations = 0.0
    total_duration_squared = 0.0
    for i in range(num_batches + num_steps_burn_in):
        start_time = time.time()
        _ = session.run(target)
        duration = time.time() - start_time
        if i >= num_steps_burn_in:
            if not i % 10:
                print('%s: step %d, duration = %.3f'%(datetime.now(), i - num_steps_burn_in, duration))
            total_durations += duration
            total_duration_squared += duration * duration
    #计算每轮迭代的平均耗时和标准差sd,最后将结果显示出来
    mn = total_durations / num_batches
    vr = total_duration_squared / num_batches - mn * mn
    sd = math.sqrt(vr)
    print('%s: %s across %d steps, %.3f +/- %.3f sec / batch'%(datetime.now(), info_string, num_batches, mn, sd))
#定义主函数run_benchmark
def run_benchmark():
    with tf.Graph().as_default():
        image_size = 224
        images = tf.Variable(tf.random_normal([batch_size, image_size, image_size, 3], dtype=tf.float32, stddev=1e-1))
        pool5, parameters = inference(images)
        init = tf.global_variables_initializer()
        sess = tf.Session()
        sess.run(init)
        time_tensorflow_run(sess, pool5, "Foward")
        objective = tf.nn.l2_loss(pool5)
        grad = tf.gradients(objective, parameters)
        time_tensorflow_run(sess, grad, "Foward-backward")

run_benchmark()


【深度学习】使用tensorflow实现AlexNet 转载注明出处:http://blog.youkuaiyun.com/accepthjp/article/details/69999309 AlexNet是2012年ImageNet比赛的冠军,虽然过去了很长时间,但是作为深度学习中的经典模型,AlexNet不但有助于我们理解其中所使用的很多技巧,而且非常有助于提升我们使用深度学习工具箱的熟练度。尤其是我刚入门深度学习,迫切需要一个能让自己熟悉tensorfl 阅读详情

相关推荐

Tensorflow实现经典CNN网络AlexNet

AlexNet在图像分类中是一个比较重要的网络,在学习的过程中不仅要学会写网络结构,知道每一层的结构,更重要的是得知道为什么要这样设计,这样设计有什么好处,如果对某些参数进行一些调整结果会有什么变化?为什么会产生这样的变化。在实际应用中,如果需要对网络结构做一些调整,应该如何调整使得网络更适合我们的实际数据?这些才是我们关心的。

一夜白头催人泪 1753

Alexnet网络模型在cifar-10数据集上的实现(基于tensorflow-gpu)

  最近根据github和tensoflow源代码中的关于Alexnet的一些代码,完成了一个在cifar-10训练集上进行训练和测试的Alexnet模型(算是半抄半改吧,哈哈!!)。实现在测试集上的accuracy=74%左右。最近没空,我就简单写写。一,先总结我最近学习卷积神经网络的的大致过程1.先看周志华的《机器学习》这本教材,我是把第五章神经网络看完结束,剩下的以后有空再看。最好要把里面公...

iMuMu的博客 9171

AlexNet 网络详解及Tensorflow实现源码

作者:行动派Xdpie 1. 图片数据处理 一张图片是由一个个像素组成,每个像素的颜色常常用RGB、HSB、CYMK、RGBA等颜色值来表示,每个颜色值的取值范围不一样,但都代表了一个像素点数据信息。对图片的数据处理过程中,RGB使用得最多,RGB表示红绿蓝三通道色,取值范围为0~255,所以一个像素点可以把它看作是一个三维数组,即:array([[[0, 255, 255]]]),三个数值分

36大数据 2万+

tensorflow自定义网络模型

SlimTF-Slim 模块是 TensorFlow 中最好用的 API 之一。尤其是里面引入的 arg_scope、model_variables、repeat、stack。TF-Slim 是 TensorFlow 中一个用来构建、训练、评估复杂模型的轻量化库。TF-Slim 模块可以和 TensorFlow 中其它API混合使用。...

eilot_c的博客 1368

Tensorflow实现AlexNet

0、CNN结构演化历史的图 一、AlexNet 1、 模型介绍 ​ AlexNet是由Alex  KrizhevskyAlex Krizhevsky提出的首个应用于图像分类的深层卷积神经网络,该网络在2012年ILSVRC(ImageNet Large Scale Visual Recognition Competition)图像分类竞赛中以15.3%的top-5测试错误率赢得第一名^{...

Yuancccc的博客 685

TensorRT 实现深度网络模型推理加速

通过本文档将会了解到深度学习的应用场景,常规的部署方法及带来的挑战,基于这些挑战 NVIDIA 给出的高效解决方案 TensorRT 的介绍,性能及案例分享。

一文读懂现代卷积神经网络—深度卷积神经网络(AlexNet)

是 2012 年由 Alex Krizhevsky、Ilya Sutskever 和 Geoffrey Hinton 提出的深度卷积神经网络(DCNN),它在当年的 ImageNet 大规模视觉识别挑战赛(ILSVRC)中以。:通过卷积和汇聚逐步减小空间尺寸(224→55→27→13→6),同时增加通道数(3→96→256→384→256): 为目标检测(R-CNN)、语义分割(FCN)、人脸识别等任务奠定基础,推动 AI 在医疗、自动驾驶等领域的应用。夺冠,大幅超越第二名(26.2%),

wh1236666的博客 4912

基于alexnet的orl人脸识别

深度学习,神经网络,基于alexnet架构的神经网络训练以及测试代码,里面还有orl人脸数据库,本人自己写的,确定能用,可直接下载。要五十个字,废话不多说,就这样。

(二)卷积神经网络之——AlexNet

本文主要是讲述关于AlexNet相关内容

ximu__l的博客 1703

TensorFlow实现人脸识别(3)--------对人脸样本进行训练,保存人脸识别模型

TensorFlow实现人脸识别(3)--------对人脸样本进行训练,保存人脸识别模型 具体解释参考http://blog.youkuaiyun.com/yunge812/article/details/79447179

tensorRT-Caffe:在NVIDIA Jetson TX2上使用tensorRT的演示加速了AlexNet的Caffe模型

张量RT-Caffe 在NVIDIA Jetson TX2上使用tensorRT的演示加速了AlexNet的Caffe模型。 有关中文的详细说明,请参考NVIDIA JETSON TX2 tensorRT加速Caffe实战.pdf 。 先决条件: NVIDIA Jetson TX2 CUDA 8.0 人工神经网络 张量RT .prototxt文件 .caffemodel文件 .binaryproto文件 建议您使用Jetpack 3.1刷新TX2设备,以便可以自动安装所有必需的工具。 我们使用的Caffe模型 我们尝试对三种不同类型的停车位进行分类: 因此,我们在Caffe中使用了Alexnet来实现此任务。 输入和输出由Caffe模型的prototxt文件指定: layer { name: "data" type: "Input" top: "data"

Tensorflow 实现AlexNet 猫狗分类

原文地址:AlexNet 关于文章的理解,网上有很多博客可以参考,这里只给出LRN(local response normalization)的一篇回答,其中形象的解释了LRN,如下图所示。地址链接 实现步骤: 1.构建网络 import tensorflow as tf from tensorflow.contrib import slim import numpy as...

爱明爱夏的博客 8690

CRaxsRat v7.6 安装与使用教程(附工具下载)

摘要:本文介绍远程管理工具CRaxsRat v7.6的合法应用与基本操作,强调仅限授权环境使用。该工具支持多客户端管理、TLS加密及文件/进程控制等功能,适用于内网维护与安全测试。安装需Windows 10/11系统及.NET 4.8,步骤包括解压运行、配置监听端口及生成客户端。文中提醒防火墙设置与杀软误报问题,并重申禁止非法用途,建议在虚拟机或隔离环境学习使用。

lzj781210的博客 3791

AlexNet原理及Tensorflow实现

\quadAlexNet的出现点燃了深度学习的热潮,下面对其进行介绍,并使用tensorflow实现.1. AlexNet网络结构图片来源:AlexNet的论文\quad整个网络有8个需要训练的层,前5个为卷积层,最后3层为全连接层.第一个卷积层 输入的图片大小为:224*224*3 第一个卷积层为:11*11*96即尺寸为11*11,有96个卷积核,步长为4,卷积层后跟ReLU,因此输出的尺寸为

yqtao的博客 4万+

【AI生成】市面上主流自组网厂家的技术及市场研究

经过对全球自组网产业技术特征与市场格局的系统分析,本文得出以下核心结论:技术演进呈现智能化与融合化双轨路径 当前自组网技术创新已突破传统组网架构局限,形成"协议优化-架构创新-场景适配"的递进式发展路径。国际厂商聚焦智能算法应用,如Silvus采用深度学习实现动态拓扑优化,传输时延较传统方案降低37%;国内企业则侧重异构网络融合,中国移动设计院提出的5G LAN架构使工业场景通信可靠性提升至99.99%。

qq_31310977的博客 1697

Android 面试题 Handler篇

1.Handler的实现原理。

ViewHandKownHealth的博客 955

AlexNet原理及tensorflow实现

AlexNet的介绍 在前一篇博客卷积神经网络CNN介绍了Le-Net5网络的结构以及tensorflow实现,下面介绍一下另一种经典的卷积神经网络AlexNet的结构以及实现。AlexNet可以看作Le-Net5网络的一个更深更宽的版本。其首次在CNN中成功应用了dropout,ReLu,和LRN等trick. 1. dropout防止模型过拟合,增强模型的健壮性。 2....

开到荼蘼的博客 4174

别再手动对照了!用Python+ArcGIS Pro一键搞定三调数据转土地三大类

本文介绍如何利用Python和ArcGIS Pro实现三调数据向土地三大类的自动化转换,大幅提升国土空间规划和土地变更调查的工作效率。通过封装分类规则为Python函数并集成到ArcGIS Pro脚本工具中,解决了传统手动操作耗时且易错的问题,适用于大规模数据处理场景。

weixin_29081101的博客 304

基于TensorFlow微调AlexNet

基于TensorFlow微调AlexNet(Finetuning AlexNet with TensorFlow) 讲解了如何在TensorFlow上搭建一个AlexNet网络,并进行微调

two_vv的博客 1万+

Diffusion:如何从噪声中生成清晰图像

扩散模型是当前AI图像生成领域的核心基础,如Stable Diffusion、DALL·E等热门模型均采用该技术。其原理分为训练和推理两个阶段:训练时通过逐步加噪图片,让AI学习如何去除噪声;推理时则从随机噪声出发,结合文本提示逐步去噪生成清晰图像。模型架构通常包含文本编码器、生成模型(如U-Net)和解码器三部分,通过多轮迭代将低维潜在空间表示转化为最终图像。这种技术模拟了艺术家从混沌中雕琢作品的过程,实现了从随机噪声到目标图像的智能生成。

laumy的学习笔记 1276

AUTOSAR EcuM模块介绍

AUTOSAR EcuM概述 AUTOSAR EcuM全称是Autosar ECU State Manager,位于Autosar BSW中System Service模块中,是一个独立于硬件的模块。 其主要作用是管理ECU上下电启动的状态,具体为: 初始化启动操作系统所需要的BSW(Basic Software)模块 为睡眠阶段和随后的唤醒完成微控制器的配置准备 管理ECU上的所有唤醒事件(EcuM通过唤醒验证协议验证已发生的唤醒,区分真实的唤醒事件,防止误唤醒) EcuM支持的特性列表 EcuM具有

酒无忧的博客 2996

AlexNet模型微调实战:基于finetune_alexnet_with_tensorflow的图像分类任务

finetune_alexnet_with_tensorflow是一个专为TensorFlow(版本≥1.2rc0)设计的AlexNet模型微调项目,它能帮助开发者快速实现图像分类任务的模型优化。通过该项目,即使是深度学习新手也能轻松掌握迁移学习技术,将预训练的AlexNet模型应用于自定义图像数据集。 ## 📋 项目核心文件解析 项目结构清晰,主要包含以下关键文件: - **alexne

gitblog_00064的博客 477

告别传统RAG的痛点!Agent Skills让知识库检索更智能(本地知识库搭建新思路:用Agent Skills实现渐进式检索)

传统RAG在知识库检索中存在文档结构丢失、Token消耗大等问题 📚 Agent Skills通过分层索引、渐进式检索等设计,实现了更智能的本地知识库检索方案 🤖 本文详细介绍了Agent Skills的核心设计理念、与传统RAG的对比以及实践建议,帮助你搭建高效的知识库系统 ✅

XiaoqiangClub的博客 693

Tensorflow实现Alexnet对Imagenet的训练与评测

        在上一篇博文中已经提到了如何对Imagenent 2012图像分类大赛的数据进行预处理。在此基础之上,我们可以搭建不同的神经网络来学习如何对Imagenet的数据进行训练和预测。Imagenet的数据集足够庞大,有120多万张图片和1000个类别,是CIFAR 10数据集无法比拟的,我觉得只有真正在Imagenet的数据集上训练出一个好的模型,才能证明在计算机视觉领域具备解决实际问...

6487

FortiOS 存在身份验证绕过导致命令执行漏洞(CVE-2024-55591)

FortiOS 是 Fortinet 公司开发的操作系统,作为 Fortinet 安全平台的核心,提供全面的网络安全功能。 它将网络和安全功能无缝集成,支持跨本地、云、混合和融合 IT/OT/IoT 基础设施环境的统一管理。 FortiOS 7.6 版本引入了生成式人工智能助手、数据保护、托管服务和单一代理等新功能,进一步增强了其安全性和性能。

缘梦未来的博客 1841

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

上一篇: 语义分割算法之Unet论文理解
下一篇: Tensorflow实战7:Tensorflow实现VGGNet
just_sort
博客等级 码龄11年 2357粉丝 1667原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值