使用tensorflow实现AlexNet

AlexNet是2012年ImageNet比赛的冠军,虽然过去了很长时间,但是作为深度学习中的经典模型,AlexNet不但有助于我们理解其中所使用的很多技巧,而且非常有助于提升我们使用深度学习工具箱的熟练度。尤其是我刚入门深度学习,迫切需要一个能让自己熟悉tensorflow的小练习,于是就有了这个小玩意儿......

先放上我的代码:https://github.com/hjptriplebee/AlexNet_with_tensorflow

如果想运行代码,详细的配置要求都在上面链接的readme文件中了。本文建立在一定的tensorflow基础上,不会对太细的点进行说明。

模型结构

关于模型结构网上的文献很多,我这里不赘述,一会儿都在代码里解释。

有一点需要注意,AlexNet将网络分成了上下两个部分,在论文中两部分结构完全相同,唯一不同的是他们放在不同GPU上训练,因为每一层的feature map之间都是独立的(除了全连接层),所以这相当于是提升训练速度的一种方法。很多AlexNet的复现都将上下两部分合并了,因为他们都是在单个GPU上运行的。虽然我也是在单个GPU上运行,但是我还是很想将最原始的网络结构还原出来,所以我的代码里也是分开的。

模型定义

def maxPoolLayer(x, kHeight, kWidth, strideX, strideY, name, padding = "SAME"):
  """max-pooling"""
  return tf.nn.max_pool(x, ksize = [1, kHeight, kWidth, 1],
             strides = [1, strideX, strideY, 1], padding = padding, name = name) 

def dropout(x, keepPro, name = None):
  """dropout"""
  return tf.nn.dropout(x, keepPro, name) 

def LRN(x, R, alpha, beta, name = None, bias = 1.0):
  """LRN"""
  return tf.nn.local_response_normalization(x, depth_radius = R, alpha = alpha,
                       beta = beta, bias = bias, name = name) 

def fcLayer(x, inputD, outputD, reluFlag, name):
  """fully-connect"""
  with tf.variable_scope(name) as scope:
    w = tf.get_variable("w", shape = [inputD, outputD], dtype = "float")
    b = tf.get_variable("b", [outputD], dtype = "float")
    out = tf.nn.xw_plus_b(x, w, b, name = scope.name)
    if reluFlag:
      return tf.nn.relu(out)
    else:
      return out 

def convLayer(x, kHeight, kWidth, strideX, strideY,
       featureNum, name, padding = "SAME", groups = 1):#group为2时等于AlexNet中分上下两部分
  """convlutional"""
  channel = int(x.get_shape()[-1])#获取channel
  conv = lambda a, b: tf.nn.conv2d(a, b, strides = [1, strideY, strideX, 1], padding = padding)#定义卷积的匿名函数
  with tf.variable_scope(name) as scope:
    w = tf.get_variable("w", shape = [kHeight, kWidth, channel/groups, featureNum])
    b = tf.get_variable("b", shape = [featureNum]) 

    xNew = tf.split(value = x, num_or_size_splits = groups, axis = 3)#划分后的输入和权重
    wNew = tf.split(value = w, num_or_size_splits = groups, axis = 3) 

    featureMap = [conv(t1, t2) for t1, t2 in zip(xNew, wNew)] #分别提取feature map
    mergeFeatureMap = tf.concat(axis = 3, values = featureMap) #feature map整合
    # print mergeFeatureMap.shape
    out = tf.nn.bias_add(mergeFeatureMap, b)
    return tf.nn.relu(tf.reshape(out, mergeFeatureMap.get_shape().as_list()), name = scope.name) #relu后的结果

定义了卷积、pooling、LRN、dropout、全连接五个模块,其中卷积模块因为将网络的上下两部分分开了,所以比较复杂。接下来定义AlexNet。

class alexNet(object):
  """alexNet model"""
  def __init__(self, x, keepPro, classNum, skip, modelPath = "bvlc_alexnet.npy"):
    self.X = x
    self.KEEPPRO = keepPro
    self.CLASSNUM = classNum
    self.SKIP = skip
    self.MODELPATH = modelPath
    #build CNN
    self.buildCNN() 

  def buildCNN(self):
    """build model"""
    conv1 = convLayer(self.X, 11, 11, 4, 4, 96, "conv1", "VALID")
    pool1 = maxPoolLayer(conv1, 3, 3, 2, 2, "pool1", "VALID")
    lrn1 = LRN(pool1, 2, 2e-05, 0.75, "norm1") 

    conv2 = convLayer(lrn1, 5, 5, 1, 1, 256, "conv2", groups = 2)
    pool2 = maxPoolLayer(conv2, 3, 3, 2, 2, "pool2", "VALID")
    lrn2 = LRN(pool2, 2, 2e-05, 0.75, "lrn2") 

    conv3 = convLayer(lrn2, 3, 3, 1, 1, 384, "conv3") 

    conv4 = convLayer(conv3, 3, 3, 1, 1, 384, "conv4", groups = 2) 

    conv5 = convLayer(conv4, 3, 3, 1, 1, 256, "conv5", groups = 2)
    pool5 = maxPoolLayer(conv5, 3, 3, 2, 2, "pool5", "VALID") 

    fcIn = tf.reshape(pool5, [-1, 256 * 6 * 6])
    fc1 = fcLayer(fcIn, 256 * 6 * 6, 4096, True, "fc6")
    dropout1 = dropout(fc1, self.KEEPPRO) 

    fc2 = fcLayer(dropout1, 4096, 4096, True, "fc7")
    dropout2 = dropout(fc2, self.KEEPPRO) 

    self.fc3 = fcLayer(dropout2, 4096, self.CLASSNUM, True, "fc8") 

  def loadModel(self, sess):
    """load model"""
    wDict = np.load(self.MODELPATH, encoding = "bytes").item()
    #for layers in model
    for name in wDict:
      if name not in self.SKIP:
        with tf.variable_scope(name, reuse = True):
          for p in wDict[name]:
            if len(p.shape) == 1:
              #bias 只有一维
              sess.run(tf.get_variable('b', trainable = False).assign(p))
            else:
              #weights
              sess.run(tf.get_variable('w', trainable = False).assign(p))

buildCNN函数完全按照alexnet的结构搭建网络。
loadModel函数从模型文件中读取参数,采用的模型文件见github上的readme说明。
至此,我们定义了完整的模型,下面开始测试模型。

模型测试

ImageNet训练的AlexNet有很多类,几乎包含所有常见的物体,因此我们随便从网上找几张图片测试。比如我直接用了之前做项目的渣土车图片:

然后编写测试代码:

#some params
dropoutPro = 1
classNum = 1000
skip = []
#get testImage
testPath = "testModel"
testImg = []
for f in os.listdir(testPath):
  testImg.append(cv2.imread(testPath + "/" + f)) 

imgMean = np.array([104, 117, 124], np.float)
x = tf.placeholder("float", [1, 227, 227, 3]) 

model = alexnet.alexNet(x, dropoutPro, classNum, skip)
score = model.fc3
softmax = tf.nn.softmax(score) 

with tf.Session() as sess:
  sess.run(tf.global_variables_initializer())
  model.loadModel(sess) #加载模型 

  for i, img in enumerate(testImg):
    #img preprocess
    test = cv2.resize(img.astype(np.float), (227, 227)) #resize成网络输入大小
    test -= imgMean #去均值
    test = test.reshape((1, 227, 227, 3)) #拉成tensor
    maxx = np.argmax(sess.run(softmax, feed_dict = {x: test}))
    res = caffe_classes.class_names[maxx] #取概率最大类的下标
    #print(res)
    font = cv2.FONT_HERSHEY_SIMPLEX
    cv2.putText(img, res, (int(img.shape[0]/3), int(img.shape[1]/3)), font, 1, (0, 255, 0), 2)#绘制类的名字
    cv2.imshow("demo", img)
    cv2.waitKey(5000) #显示5秒

如上代码所示,首先需要设置一些参数,然后读取指定路径下的测试图像,再对模型做一个初始化,最后是真正测试代码。测试结果如下:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • TensorFlow安装及jupyter notebook配置方法

    tensorflow利用anaconda在ubuntu下安装方法及jupyter notebook运行目录及远程访问配置 Ubuntu下安装Anaconda bash ~/file_path/file_name.sh 出现许可后可按Ctrl+C跳过,yes同意. 安装完成后询问是否加入path路径,亦可自行修改文件内容 关闭命令台重开 python -V 可查看是否安装成功 修改anaconda的python版本,以符合tf要求 conda install python=3.5 Anaconda

  • TensorFlow在MAC环境下的安装及环境搭建

    给大家分享一下TensorFlow在MAC系统中的安装步骤以及环境搭建的操作流程. TensorFlow 底层的图模型结构清晰,容易改造:支持分布式训练:可视化效果好.如果做长期项目,接触较大数据集的话,TensorFlow很适用,而且谷歌也在不断优化完备它,对于使用深度学习朋友,TensorFlow是一个很好的工具. 在学习了一段时间台大李宏毅关于deep learning的课程,以及一些其他机器学习的书之后,终于打算开始动手进行一些实践了. 感觉保完研之后散养状态下,学习效率太低了,于是便想

  • Tensorflow简单验证码识别应用

    简单的Tensorflow验证码识别应用,供大家参考,具体内容如下 1.Tensorflow的安装方式简单,在此就不赘述了. 2.训练集训练集以及测试及如下(纯手工打造,所以数量不多): 3.实现代码部分(参考了网上的一些实现来完成的) main.py(主要的神经网络代码) from gen_check_code import gen_captcha_text_and_image_new,gen_captcha_text_and_image from gen_check_code import

  • Tensorflow实现AlexNet卷积神经网络及运算时间评测

    本文实例为大家分享了Tensorflow实现AlexNet卷积神经网络的具体实现代码,供大家参考,具体内容如下 之前已经介绍过了AlexNet的网络构建了,这次主要不是为了训练数据,而是为了对每个batch的前馈(Forward)和反馈(backward)的平均耗时进行计算.在设计网络的过程中,分类的结果很重要,但是运算速率也相当重要.尤其是在跟踪(Tracking)的任务中,如果使用的网络太深,那么也会导致实时性不好. from datetime import datetime import

  • 使用tensorflow实现AlexNet

    AlexNet是2012年ImageNet比赛的冠军,虽然过去了很长时间,但是作为深度学习中的经典模型,AlexNet不但有助于我们理解其中所使用的很多技巧,而且非常有助于提升我们使用深度学习工具箱的熟练度.尤其是我刚入门深度学习,迫切需要一个能让自己熟悉tensorflow的小练习,于是就有了这个小玩意儿...... 先放上我的代码:https://github.com/hjptriplebee/AlexNet_with_tensorflow 如果想运行代码,详细的配置要求都在上面链接的rea

  • 详解Tensorflow数据读取有三种方式(next_batch)

    Tensorflow数据读取有三种方式: Preloaded data: 预加载数据 Feeding: Python产生数据,再把数据喂给后端. Reading from file: 从文件中直接读取 这三种有读取方式有什么区别呢? 我们首先要知道TensorFlow(TF)是怎么样工作的. TF的核心是用C++写的,这样的好处是运行快,缺点是调用不灵活.而Python恰好相反,所以结合两种语言的优势.涉及计算的核心算子和运行框架是用C++写的,并提供API给Python.Python调用这些A

  • TensorFlow卷积神经网络AlexNet实现示例详解

    2012年,Hinton的学生Alex Krizhevsky提出了深度卷积神经网络模型AlexNet,它可以算是LeNet的一种更深更宽的版本.AlexNet以显著的优势赢得了竞争激烈的ILSVRC 2012比赛,top-5的错误率降低至了16.4%,远远领先第二名的26.2%的成绩.AlexNet的出现意义非常重大,它证明了CNN在复杂模型下的有效性,而且使用GPU使得训练在可接受的时间范围内得到结果,让CNN和GPU都大火了一把.AlexNet可以说是神经网络在低谷期后的第一次发声,确立了深

  • TensorFlow实现Batch Normalization

    一.BN(Batch Normalization)算法 1. 对数据进行归一化处理的重要性 神经网络学习过程的本质就是学习数据分布,在训练数据与测试数据分布不同情况下,模型的泛化能力就大大降低:另一方面,若训练过程中每批batch的数据分布也各不相同,那么网络每批迭代学习过程也会出现较大波动,使之更难趋于收敛,降低训练收敛速度.对于深层网络,网络前几层的微小变化都会被网络累积放大,则训练数据的分布变化问题会被放大,更加影响训练速度. 2. BN算法的强大之处 1)为了加速梯度下降算法的训练,我们

  • 将tensorflow的ckpt模型存储为npy的实例

    实例如下所示: #coding=gbk import numpy as np import tensorflow as tf from tensorflow.python import pywrap_tensorflow checkpoint_path='model.ckpt-5000'#your ckpt path reader=pywrap_tensorflow.NewCheckpointReader(checkpoint_path) var_to_shape_map=reader.get_

  • TensorFlow 模型载入方法汇总(小结)

    一.TensorFlow常规模型加载方法 保存模型 tf.train.Saver()类,.save(sess, ckpt文件目录)方法 参数名称 功能说明 默认值 var_list Saver中存储变量集合 全局变量集合 reshape 加载时是否恢复变量形状 True sharded 是否将变量轮循放在所有设备上 True max_to_keep 保留最近检查点个数 5 restore_sequentially 是否按顺序恢复变量,模型较大时顺序恢复内存消耗小 True var_list是字典

  • 从训练好的tensorflow模型中打印训练变量实例

    从tensorflow 训练后保存的模型中打印训变量:使用tf.train.NewCheckpointReader() import tensorflow as tf reader = tf.train.NewCheckpointReader('path/alexnet/model-330000') dic = reader.get_variable_to_shape_map() print dic 打印变量 w = reader.get_tensor("fc1/W") print t

  • python神经网络AlexNet分类模型训练猫狗数据集

    目录 什么是AlexNet模型 训练前准备 1.数据集处理 2.创建Keras的AlexNet模型 开始训练 1.训练的主函数 2.Keras数据生成器 3.主训练函数全部代码 训练结果 最近在做实验室的工作,要用到分类模型,老板一星期催20次,我也是无语了,上有对策下有政策,在下先找个猫猫狗狗的数据集练练手,快乐极了 什么是AlexNet模型 AlexNet是2012年ImageNet竞赛冠军获得者Hinton和他的学生Alex Krizhevsky设计的.也是在那年之后,更多的更深的神经网络

随机推荐