alexnet 在 imagenet上夺冠是卷积神经网络如今这么火热的起点。

虽然卷积神经网络很早就被提出来,但是由于计算能力和各方面原因,没有得到关注。

alexnet 为什么能取得这么好的成绩,它的主要归功于

  • ReLU激活函数(能更快的收敛)
  • LRN 局部响应归一化(ReLU 之后的结果不像tanh,或sigmoid函数一样在一个区间,需要进行归一化)
  • dropout(防止过拟合,一定概率的删除一些神经元)
  • data augmentation(从256*256的图像中提取227*227的patches)
  • import os
    import numpy as np
    import tensorflow as tf
    from scipy.misc import imread train_x=np.zeros((1,227,227,3)).astype(np.float32)
    train_y=np.zeros((1,1000)).astype(np.float32)
    xdim=train_x.shape[1:]
    def conv(input, kernel, biases,s_h,s_w,padding="VALID",group=1):
    c=input.get_shape()[-1]
    assert c%group==0 # conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None)
    # lambda实现匿名函数, 参数为i,k,
    convolve=lambda i,k: tf.nn.conv2d(i,k,[1,s_h,s_w,1],padding=padding)
    if group==1:
    conv=convolve(input,kernel)
    else:
    # tf.split(num_split,input,dimension): which dimension to split
    input_groups=tf.split(input,group,3)
    kernel_groups=tf.split(kernel,group,3)
    output_groups=[convolve(i,k) for i,k in zip(input_groups, kernel_groups)]
    conv=tf.concat(output_groups,3)
    return tf.reshape(tf.nn.bias_add(conv,biases),[-1]+conv.get_shape().as_list()[1:]) # load 加载 npy数据,训练好的alexnet网络
    # item函数是将dict 中的key 和 value 组成一个元组
    net=np.load("bvlc_alexnet.npy")
    # .item() convert the key and value in dict to a cell.
    # person={'name':''lizhang','age':'26'} for key, value in person.items() : print key value
    net=net.item() im1=(imread("2.jpg").astype(np.float32))
    im1=im1-np.mean(im1)
    im1[:,:,0]=im1[:,:,2]
    im1[:,:,2]=im1[:,:,0]
    im1=im1.reshape(1,227,227,3)
    x=tf.placeholder(tf.float32,(None,)+xdim) conv1w=tf.Variable(net["conv1"][0])
    conv1b=tf.Variable(net["conv1"][1]) s_h=4
    s_w=4
    ## 取 conv1 对应的参数,net_data["conv1"] 是value,包含两组值,net_data["conv1"][0]是卷积核的值, net_data["conv1"][1]对应偏置的值
    conv1=conv(x,conv1w,conv1b,s_h,s_w,padding="SAME",group=1)
    conv1=tf.nn.relu(conv1)
    radius=2
    alpha=2e-05
    beta=0.75
    bias=1.0
    lrn1=tf.nn.local_response_normalization(conv1,depth_radius=radius,alpha=alpha,beta=beta,bias=bias)
    maxpooling1=tf.nn.max_pool(lrn1,ksize=[1,3,3,1],strides=[1,2,2,1],padding='VALID') conv2w=tf.Variable(net["conv2"][0])
    conv2b=tf.Variable(net["conv2"][1])
    conv2=conv(maxpooling1,conv2w,conv2b,1,1,padding="SAME",group=2)
    conv2=tf.nn.relu(conv2)
    lrn2=tf.nn.local_response_normalization(conv2,depth_radius=radius,alpha=alpha,beta=beta,bias=bias)
    maxpooling2=tf.nn.max_pool(lrn2,ksize=[1,3,3,1],strides=[1,2,2,1],padding='VALID') conv3w=tf.Variable(net["conv3"][0])
    conv3b=tf.Variable(net["conv3"][1])
    conv3=conv(maxpooling2,conv3w,conv3b,1,1,padding="SAME",group=1)
    conv3=tf.nn.relu(conv3) conv4w=tf.Variable(net["conv4"][0])
    conv4b=tf.Variable(net["conv4"][1])
    conv4=conv(conv3,conv4w,conv4b,1,1,padding="SAME",group=2)
    conv4=tf.nn.relu(conv4) conv5w=tf.Variable(net["conv5"][0])
    conv5b=tf.Variable(net["conv5"][1])
    conv5=conv(conv4,conv5w,conv5b,1,1,padding="SAME",group=2)
    conv5=tf.nn.relu(conv5)
    maxpooling5=tf.nn.max_pool(conv5,ksize=[1,3,3,1],strides=[1,2,2,1],padding='VALID') fc6w=tf.Variable(net["fc6"][0])
    fc6b=tf.Variable(net["fc6"][1])
    fc6=tf.nn.relu_layer(tf.reshape(maxpooling5,[1,9216]),fc6w,fc6b) fc7w=tf.Variable(net["fc7"][0])
    fc7b=tf.Variable(net["fc7"][1])
    fc7=tf.nn.relu_layer(fc6,fc7w,fc7b) fc8w=tf.Variable(net["fc8"][0])
    fc8b=tf.Variable(net["fc8"][1])
    fc8=tf.nn.xw_plus_b(fc7,fc8w,fc8b) prob=tf.nn.softmax(fc8)
    init=tf.initialize_all_variables()
    sess=tf.Session()
    sess.run(init)
    output=sess.run(prob,feed_dict={x:im1}) inds=np.argsort(output)[0,:]
    for x in range(5):
    print(inds[x])

github:  https://github.com/hahafan/tensorflow_learning/blob/master/README.md

tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None)

除去name参数用以指定该操作的name,与方法有关的一共五个参数

第一个参数input:指需要做卷积的输入图像,它要求是一个Tensor,具有[batch, in_height, in_width, in_channels]这样的shape,具体含义是[训练时一个batch的图片数量, 图片高度, 图片宽度, 图像通道数],注意这是一个4维的Tensor,要求类型为float32和float64其中之一

第二个参数filter:相当于CNN中的卷积核,它要求是一个Tensor,具有[filter_height, filter_width, in_channels, out_channels]这样的shape,具体含义是[卷积核的高度,卷积核的宽度,图像通道数,卷积核个数],要求类型与参数input相同,有一个地方需要注意,第三维in_channels,就是参数input的第四维

第三个参数strides:卷积时在图像每一维的步长,这是一个一维的向量,长度4

第四个参数padding:string类型的量,只能是"SAME","VALID"其中之一,这个值决定了不同的卷积方式(后面会介绍)

第五个参数:use_cudnn_on_gpu:bool类型,是否使用cudnn加速,默认为true

结果返回一个Tensor,这个输出,就是我们常说的feature map

conv2d实际上执行了以下操作:

    1. 将filter转为二维矩阵,shape为
      [filter_height * filter_width * in_channels, output_channels].
    2. 从input tensor中提取image patches,每个patch是一个virtual tensor,shape[batch, out_height, out_width, filter_height * filter_width * in_channels].
    3. 将每个filter矩阵和image patch向量相乘

load(alexnet.npy) : alexnet.npy 是通过caffe model 转过来的, 具体见https://github.com/ethereon/caffe-tensorflow

出现问题:

  • Tensorflow 函数tf.cocat([fw,bw],2)出错:TypeError: Expected int32, got list containing Tensors of type ‘_Message’ instead.

Expected int32, got list containing Tensors of type ‘_Message’ inst
原因是11版本的函数形式为:tf.concat(2,[fw,bw]),即应把串联的维度与串联值位置调换即可.

  • Input ‘split_dim’ of ‘Split’ Op has type float32 that does not match expected type of int32

    #原来是这样的:
    This is because in Tensorflow versions < 0.12.0 the split function takes the arguments as:
    x = tf.split(0, n_steps, x) # tf.split(axis, num_or_size_splits, value) #修改成这样的:
    The tutorial you are working from was written for versions > 0.12.0, which has been changed to be consistent with Numpy’s split syntax:
    x = tf.split(x, n_steps, 0) # tf.split(value, num_or_size_splits, axis)

alexnet- tensorflow的更多相关文章

  1. TensorFlow资源整理

    什么是TensorFlow? TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库.节点(Nodes)在图中表示数学操作,图中的线(edges)则表示 ...

  2. AlexNet 网络详解及Tensorflow实现源码

    版权声明:本文为博主原创文章,未经博主允许不得转载. 1. 图片数据处理 2. 卷积神经网络 2.1. 卷积层 2.2. 池化层 2.3. 全链层 3. AlexNet 4. 用Tensorflow搭 ...

  3. 学习笔记TF052:卷积网络,神经网络发展,AlexNet的TensorFlow实现

    卷积神经网络(convolutional neural network,CNN),权值共享(weight sharing)网络结构降低模型复杂度,减少权值数量,是语音分析.图像识别热点.无须人工特征提 ...

  4. 【深度学习系列】用PaddlePaddle和Tensorflow实现AlexNet

    上周我们用PaddlePaddle和Tensorflow实现了图像分类,分别用自己手写的一个简单的CNN网络simple_cnn和LeNet-5的CNN网络识别cifar-10数据集.在上周的实验表现 ...

  5. TensorFlow实战之实现AlexNet经典卷积神经网络

    本文根据最近学习TensorFlow书籍网络文章的情况,特将一些学习心得做了总结,详情如下.如有不当之处,请各位大拿多多指点,在此谢过. 一.AlexNet模型及其基本原理阐述 1.关于AlexNet ...

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

    上周我们用PaddlePaddle和Tensorflow实现了图像分类,分别用自己手写的一个简单的CNN网络simple_cnn和LeNet-5的CNN网络识别cifar-10数据集.在上周的实验表现 ...

  7. tensorFlow入门实践(三)初识AlexNet实现结构

    参考黄文坚<TensorFlow实战>一书,完成AlexNet的整体实现并展望其训练和预测过程. import tensorflow as tf batch_size = 32 num_b ...

  8. 深度学习之 TensorFlow(五):mnist 的 Alexnet 实现

    尝试用 Alexnet 来构建一个网络模型,并使用 mnist 数据查看训练结果. 我们将代码实现分为三个过程,加载数据.定义网络模型.训练数据和评估模型. 实现代码如下: #-*- coding:u ...

  9. 《TensorFlow实战》中AlexNet卷积神经网络的训练中

    TensorFlow实战中AlexNet卷积神经网络的训练 01 出错 TypeError: as_default() missing 1 required positional argument: ...

  10. TensorFlow笔记六:基于cifar10数据库的AlexNet识别

    准确率只有70%,cpu版本的TF居然跑了两天才跑完,其他方法将继续尝试. 生成数据目录: import numpy as np import os train_label = {} for i in ...

随机推荐

  1. ssh整合hibernate 使用spring管理hibernate二级缓存,配置hibernate4.0以上二级缓存

    ssh整合hibernate 使用spring管理hibernate二级缓存,配置hibernate4.0以上二级缓存 hibernate  : Hibernate是一个持久层框架,经常访问物理数据库 ...

  2. 【洛谷P2860】冗余路径

    题目大意:给定一个 N 个点,M 条边组成的无向图,求至少在图中加入几条边才能使得整个图没有割边. 题解:求出该无向图的所有边双联通分量,每个边双联通分量可以理解成无向图的一个极大环,对该无向图进行缩 ...

  3. .Net Core Nlog日志记录到MySql

    前段时间想要实现这个功能网上找了很多资料,现在整理一下发布出来,希望给大家一点帮助. 首先是依赖项的选择: 关于NLog版本不是最新是因为最新版本有点问题我试了试不支持,所以选了这几个版本,MySql ...

  4. 编写一个数组工具类, 编写本软件的 帮助文档(API文档)

    本文档是对静态成员的练习. 一. 建立一个ArrayTool(数组工具)的类,在此类中对传入数组进行一些操作(选最大值.先最小值.冒泡排正序.选择排反序.输出数组元素), 二. 建立一个Test的类, ...

  5. Dubbo新版管控台

    地址:https://github.com/apache/incubator-dubbo-ops 下载下来,解压 打开cmd 注意:它的前端用到了Vue.js,打包需要npm,所以你要有node.js ...

  6. JS生成随机数并排序

    JS生成[10,100]之间的十个随机数,并排序 function getRandom(start,end){ var m=end-start+1 return Math.floor(Math.ran ...

  7. mongodb安装和运行

    转载来源:https://blog.csdn.net/IT_wanghe/article/details/53884229 参考教程:http://www.runoob.com/mongodb/mon ...

  8. awk统计文件大小

    在Linux系统中,经常会遇到某个目录下文件很多,要统计这些文件的空间大小.可以采用awk来实现.如下是实现这个功能的例子. vim sum.sh #!/bin/bash# sum.shcd //ba ...

  9. Redis分布式锁----悲观锁实现,以秒杀系统为例

    摘要:本文要实现的是一种使用redis来实现分布式锁. 1.分布式锁 分布式锁在是一种用来安全访问分式式机器上变量的安全方案,一般用在全局id生成,秒杀系统,全局变量共享.分布式事务等.一般会有两种实 ...

  10. python操作execl学习笔记(一)

    本节只记录关于execl的读操作: execl 内容及格式 python3 #!/usr/bin/env python #-*- coding:utf-8 -*- import xlrd import ...