用TensorFlow构建基础的神经网络(三):AlexNet
来源:互联网 发布:网页淘宝怎么收藏店铺 编辑:程序博客网 时间:2024/05/22 17:42
参考文献:ImageNet Classification with Deep Convolutional NeuralNetworks
中文翻译:AlexNet论文翻译 (翻译作者:liumaolincycle)
作者:XJTU_Ironboy
时间:2017年8月
三、AlexNet
1.介绍
AlexNet 可以说是具有历史意义的一个网络结构,可以说在AlexNet之前,深度学习已经沉寂了很久。AlexNet是在2012年被发表的一个经典之作,并在当年取得了ImageNet最好成绩,它在当年的ImageNet图像分类竞赛中,top-5错误率比上一年的冠军下降了十个百分点,而且远远超过当年的第二名。同时该网络结构也是开启ImageNet数据集上更大,更深CNN的开山之作,之后在Imagenet上取得更好结果的ZF-net,SPP-net,VGG等网络,都是在其基础上修改得到。
2.网络结构
(1) 废话少说,我们直接上图。
3.TensorFlow上实现
提前声明:由于是放暑假在家,身边并没有合适的硬件设备(主要指:NVIDIA TITAN X GPUs)来跑这种ImageNet上的大型程序(原论文的作者用GPU都跑了5-6天),所以这里只介绍如何构建AlexNet,并没有运行结果,望读者见谅!
① 开始定义AlexNet的整体结构
# 定义AlexNet的所有层的结构in_units =154587 # 227x227x3=154587C1_units = 96C2_units = 256C3_units = 384C4_units = 384C5_units = 256F6_units = 4096F7_units = 4096output_units = 1000
② 输入层
# 定义输入x = tf.placeholder(tf.float32,[None,in_units],name = "x_input")y_= tf.placeholder(tf.float32,[None,output_units],name = "y_input")keep_prob = tf.placeholder(tf.float32)input_data = tf.reshape(x,[-1,227,227,3])
③ 卷积层
# 定义可配置卷积层函数def conv(layer_name,input_x,Filter_size,activation_function = None): with tf.name_scope("conv_%s" % layer_name): with tf.name_scope("Filter"): Filter = tf.Variable(tf.random_normal(Filter_size,stddev = 0.1),dtype = tf.float32,name = "Filter") tf.summary.histogram('Filter_%s'%layer_name,Filter) with tf.name_scope("bias_filter"): bias_filter = tf.Variable(tf.random_normal([Filter_size[3]],stddev = 0.1),dtype = tf.float32,name = "bias_filter") tf.summary.histogram('bias_filter_%s'%layer_name,bias_filter) with tf.name_scope("conv"): conv = tf.nn.conv2d(input_x,Filter,strides = [1,1,1,1],padding = "SAME") tf.summary.histogram('conv_%s'%layer_name,conv) temp_y = tf.add(conv,bias_filter) with tf.name_scope("output_y"): if activation_function is None: output_y = temp_y else: output_y = activation_function(temp_y) tf.summary.histogram('output_y_%s'%layer_name,output_y) return output_y
④ 池化层
# 定义可配置最大池化层函数def max_pool(layer_name,input_x,pool_size): with tf.name_scope("max_pool_%s" % layer_name): with tf.name_scope("output_y"): output_y = tf.nn.max_pool(input_x,pool_size,strides = [1,2,2,1],padding = "SAME") tf.summary.histogram('output_y_%s'%layer_name,output_y) return output_y
⑤ 全连接层
# 定义可配置全连接层函数def full_connect(layer_name,input_x,output_num,activation_function = None): with tf.name_scope("full_connect_%s" % layer_name): with tf.name_scope("Weights"): Weights = tf.Variable(tf.random_normal([input_x.shape.as_list()[1],output_num],stddev = 0.1),dtype = tf.float32,name = "weight") tf.summary.histogram('Weights_%s'%layer_name,Weights) with tf.name_scope("biases"): biases = tf.Variable(tf.random_normal([output_num],stddev = 0.1),dtype = tf.float32,name = "biases") tf.summary.histogram('biases_%s'%layer_name,biases) output_temp = tf.add(tf.matmul(input_x,Weights) , biases) with tf.name_scope("output_y"): if activation_function is None: output_y = output_temp else: output_y = activation_function(output_temp) tf.summary.histogram('output_y_%s'%layer_name,output_y) return output_y
⑥ 构建整体结构
# 第一层卷积层layer1_Conv = conv("layer1",input_data,[11,11,3,96],4,activation_function = tf.nn.relu)layer1_Pool = max_pool("layer1",layer1_Conv,[1,3,3,1])layer1_lrn = tf.nn.local_response_normalization(layer1_Pool,5,bias = 1.0,alpha = 0.001/9,beta = 0.75,name = "lrn")# 第二层卷积层layer2_Conv = conv("layer2",layer1_lrn,[5,5,96,256],1,activation_function = tf.nn.relu)layer2_Pool = max_pool("layer2",layer2_Conv,[1,3,3,1])layer2_lrn = tf.nn.local_response_normalization(layer2_Pool,5,bias = 1.0,alpha = 0.001/9,beta = 0.75,name = "lrn")# 第三层卷积层layer3_Conv = conv("layer3",layer2_lrn,[3,3,256,384],1,activation_function = tf.nn.relu)# 第四层卷积层layer4_Conv = conv("layer4",layer3_Conv,[3,3,384,384],1,activation_function = tf.nn.relu)# 第五层卷积层layer5_Conv = conv("layer5",layer4_Conv,[3,3,384,256],1,activation_function = tf.nn.relu)# 将特征图reshape为向量layer5_vector = tf.reshape(layer5_Conv,[-1,tf.cast(layer5_Conv.shape[1]*layer5_Conv.shape[2]*layer5_Conv.shape[3],tf.int32)])# 第六层全连接层layer6_FC = full_connect("layer6",layer5_vector,4096,activation_function = tf.nn.relu)# 第七层全连接层layer7_FC = full_connect("layer7",layer6_FC,4096,activation_function = tf.nn.relu)# 第八层全连接层输出with tf.name_scope("output_y"): y = full_connect("output_layer",layer7_FC,1000,activation_function = tf.nn.relu)
4.总结
AlexNet 之所以能够成功,深度学习之所以能够重回历史舞台,原因在于:
1. 非线性激活函数:ReLU
2. 防止过拟合的方法:Dropout,Data augmentation
3. 大数据训练:百万级ImageNet图像数据
4. 其他:GPU实现,LRN归一化层的使用
- 用TensorFlow构建基础的神经网络(三):AlexNet
- 用TensorFlow构建基础的神经网络(一):MLP
- 用TensorFlow构建基础的神经网络(二):LeNet-5
- 神经网络之AlexNet模型的实现(Python+TensorFlow)
- AlexNet 的tensorflow 实现
- 【Deep Learning】tensorflow实现卷积神经网络(AlexNet)
- Tensorflow构建一个简单的神经网络
- tensorflow构建简单神经网络
- TensorFlow构建循环神经网络
- TensorFlow构建循环神经网络
- 学习笔记TF052:卷积网络,神经网络发展,AlexNet的TensorFlow实现
- 经典的卷积神经网络-AlexNet
- 基于tensorflow的AlexNet实现
- 神经网络:AlexNet
- 汐月教育之理解TensorFlow(三.1)构建简单的BP神经网络+softmax多分类进行MNIST识别
- tensorflow构建神经网络及可视化
- 8.3 TensorFlow BP神经网络构建与超参数的选取
- TensorFlow下构建高性能神经网络模型的最佳实践
- Java NIO系列教程(八) SocketChannel
- 解决Perhaps JAVA_HOME does not point to the JDK.
- CXF+Spring+Tomcat简明示例
- Python 代码规范小结
- Java NIO系列教程(九) ServerSocketChannel
- 用TensorFlow构建基础的神经网络(三):AlexNet
- matlab2c使用c++实现matlab函数系列教程-cat函数
- java毕向东学习笔记——day10
- 写代码怎能不会这些Linux命令?
- Java NIO系列教程(十) Java NIO DatagramChannel
- 史上最全设计模式导学目录(完整版)
- R实战:【股票分析】用quantmod包绘制K线(离线数据csv/txt)
- MFC创建透明CBrush
- Akka(20): Stream:异步运算,压力缓冲-Async, batching backpressure and buffering