美文网首页tensorflow笔记
2018-08-07AlexNet实现详解

2018-08-07AlexNet实现详解

作者: 今天多云很多云 | 来源:发表于2018-08-07 16:05 被阅读0次

    A结构

    B代码

    A结构:

    AlexNet结构为8层。(不包含LRN与池化层)

    conv1+LRN&pool1 ----->conv2+LRN&pool2----->conv3----->conv4------>conv5+pool5---->3个全连接

    其中输入结构【32,224,224,3】其中32为batchsize,224x224是图像大小,深度为3
    conv1输出的结构【32,56,56,64】
    pool1输出的结构【32,27,27,64】
    conv2输出的结构【32,27,27,192】
    pool2输出的结构【32,13,13,192】
    conv3输出的结构【32,13,13,384】
    conv4输出的结构【32,13,13,256】
    conv5输出的结构【32,13,13,256】
    pool5输出的结构【32,6,6,256】

    从上面结构也可以看出,卷积过程是深度变深,池化过程是降维变小。卷积层内部代码无非就是wX+b然后relu。

    上述中
    第1个卷积核尺寸11x11,通道3,核数量64。结构【11,11,3,64】。步长为4x4,结构【1,4,4,1】
    第1个池化层尺寸3x3,结构【1,3,3,1】.步长为2x2,结构【1,2,2,1】
    第2个卷积核尺寸5x5,通道64,核数量192。结构【5,5,64,192】。步长为1x1,结构【1,1,1,1】
    第2个池化层尺寸参数一样
    第3个卷积核尺寸3x3,通道192,核数量384。结构【3,3,192,384】。步长为1x1,结构【1,1,1,1】
    第4个卷积核尺寸3x3,通道384,核数量256。结构【3,3,384,256】。步长为1x1,结构【1,1,1,1】
    第5个卷积核尺寸3x3,通道256,核数量256。结构【3,3,256,256】。步长为1x1,结构【1,1,1,1】
    第5个池化层没有LRN,只是池化,参数一样。

    全链接3层节点分别4096,4096,1000。到这里,是不是可以根据所有信息自己实现代码了呢~

    B代码:

    测试结果:
    书GPU:0.02分钟/每10步
    我CPU:1分钟/每10步

    from datetime import datetime
    import math
    import time 
    import tensorflow as tf
    
    batch_size=32
    num_batches=100
    
    #显示tensor的名字和大小
    def print_activations(t):
        print(t.op.name,'',t.get_shape().as_list())
    
    def inference(images):
        parameters = []
        # conv1
        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='biases')
            bias = tf.nn.bias_add(conv, biases)
            conv1 = tf.nn.relu(bias, name=scope)
            print_activations(conv1)
            parameters += [kernel, biases]
    
    
      # pool1
        lrn1 = tf.nn.lrn(conv1, 4, bias=1.0, alpha=0.001 / 9.0, 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)
    
      # conv2
        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)
    
      # pool2
        lrn2 = tf.nn.lrn(conv2, 4, bias=1.0, alpha=0.001 / 9.0, 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)
    
      # conv3
        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)
    
      # conv4
        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)
    
      # conv5
        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
    
    
    
    
    def time_tensorflow_run(session, target, info_string):
    #  """Run the computation to obtain the target tensor and print timing stats.
    #
    #  Args:
    #    session: the TensorFlow session to run the computation under.
    #    target: the target Tensor that is passed to the session's run() function.
    #    info_string: a string summarizing this run, to be printed with the stats.
    #
    #  Returns:
    #    None
    #  """
        num_steps_burn_in = 10
        total_duration = 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_duration += duration
                total_duration_squared += duration * duration
        mn = total_duration / 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))
    
    def run_benchmark():
    #  """Run the benchmark on AlexNet."""
        with tf.Graph().as_default():
        # Generate some dummy images.
            image_size = 224
        # Note that our padding definition is slightly different the cuda-convnet.
        # In order to force the model to start with the same activations sizes,
        # we add 3 to the image_size and employ VALID padding above.
            images = tf.Variable(tf.random_normal([batch_size,
                                               image_size,
                                               image_size, 3],
                                              dtype=tf.float32,
                                              stddev=1e-1))
    
        # Build a Graph that computes the logits predictions from the
        # inference model.
            pool5, parameters = inference(images)
    
        # Build an initialization operation.
            init = tf.global_variables_initializer()
    
        # Start running operations on the Graph.
            config = tf.ConfigProto()
            config.gpu_options.allocator_type = 'BFC'
            sess = tf.Session(config=config)
            sess.run(init)
    
        # Run the forward benchmark.
            time_tensorflow_run(sess, pool5, "Forward")
    
        # Add a simple objective so we can calculate the backward pass.
            objective = tf.nn.l2_loss(pool5)
        # Compute the gradient with respect to all the parameters.
            grad = tf.gradients(objective, parameters)
        # Run the backward benchmark.
            time_tensorflow_run(sess, grad, "Forward-backward")
    
    
    run_benchmark()
    

    相关文章

      网友评论

        本文标题:2018-08-07AlexNet实现详解

        本文链接:https://www.haomeiwen.com/subject/amlavftx.html