前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深度学习实战篇之 ( 十三) -- TensorFlow之AlexNet

深度学习实战篇之 ( 十三) -- TensorFlow之AlexNet

作者头像
用户5410712
发布2022-06-01 20:14:03
2661
发布2022-06-01 20:14:03
举报
文章被收录于专栏:居士说AI居士说AI

科普知识

在实践中,由于数据集不够大,很少有人从头开始训练网络。常见的做法是使用预训练的网络(例如在ImageNet上训练的分类1000类的网络)来重新fine-tuning(也叫微调),或者当做特征提取器。

前言

粉丝老铁们,好久不见,不知道大家的深度学习到了什么程度呢?按照居士之家现在的规划是,两周分享一次文章,理论篇和实战篇交叉分享,本次分享,我们紧跟上次文章深度学习理论篇之 ( 十四) -- AlexNet之更上一楼来进行TensorFlow实战,希望大家仔细弄懂上一期文章才好进入今天的内容哦。

AlexNet之TensorFlow实战

1.数据准备

与上期文章不一样,我们换个数据集,本次采用五种类别的鲜花作为数据集,同样包含两个子集:训练集和验证集。

怎么样,鲜花好看吧!

另外,值得注意的是,由于是五分类,因此,我们的数据读取代码部分有了一点改变:

其余的代码跟第一次项目的一样的哦!

2.网络结构

# AlexNet 网络结构

# 输入:3*227*2227 代表三通道的彩色图像输入,图像大小为227*227

# 卷积层1:卷积核大小为11*11 卷积核个数:96,步长:4

# 最大池化1:采样区域:3*3, 步长:默认为1

# 卷积层2:积核大小为5*5 ,卷积核个数:256, 步长:1

# 最大池化2:采样区域:3*3, 步长:默认为1

# 卷积层3:积核大小为3*3 ,卷积核个数:384, 步长:1,采用padding。

# 卷积层4:积核大小为3*3 ,卷积核个数:384, 步长:1,采用padding。

# 卷积层5:积核大小为3*3 ,卷积核个数:256, 步长:1,采用padding。(在理论篇文章中遗漏了这一层,切记,注意)

# 最大池化3:采样区域:3*3, 步长:默认为1

# 全连接层1:输出84

# 全连接层2:输出5(五分类)

代码语言:javascript
复制
def inference(images, batch_size, n_classes,drop_rate):
    # 卷积层1:卷积核大小为11*11 卷积核个数:96,步长:4
    conv1 = Conv_layer(names = 'conv1_scope', input = images , w_shape = [11, 11, 3, 96], b_shape = [96], strid = [4, 4], is_padding = False)
    print("---------conv1:{}".format(conv1))
    # 最大池化1:采样区域:3*3, 步长:默认为1
    down_sample1 = Avg_pool_lrn(names = 'avg_pooling1', input = conv1 , ksize = [1, 2, 2, 1], is_lrn = False)
    print("---------down_sample1:{}".format(down_sample1))
    # 卷积层2:积核大小为5*5 ,卷积核个数:256, 步长:1
    conv2 = Conv_layer(names = 'conv2_scope', input = down_sample1 , w_shape = [5, 5, 96, 256], b_shape = [256], strid = [1, 1], is_padding = False)
    # 最大池化2:采样区域:3*3, 步长:默认为1
    down_sample2 = Avg_pool_lrn(names = 'avg_pooling2', input = conv2 , ksize = [1, 3, 3, 1], is_lrn = False)
    # 卷积层3:积核大小为3*3 ,卷积核个数:384, 步长:1,采用padding。
    conv3 = Conv_layer(names = 'conv3_scope', input = down_sample2 , w_shape = [3, 3, 256, 384], b_shape = [384], strid = [1, 1], is_padding = True)
    # 卷积层4:积核大小为3*3 ,卷积核个数:384, 步长:1,采用padding。
    conv4 = Conv_layer(names = 'conv4_scope', input = conv3 , w_shape = [3, 3, 384, 384], b_shape = [384], strid = [1, 1], is_padding = True)
    # 卷积层5:积核大小为3*3 ,卷积核个数:256, 步长:1,采用padding。(在理论篇文章中遗漏了这一层,切记,注意)
    conv5 = Conv_layer(names = 'conv4_scope', input = conv3 , w_shape = [3, 3, 384, 256], b_shape = [256], strid = [1, 1], is_padding = True)
    reshape = tf.reshape(conv3, shape=[batch_size, -1])
    dim = reshape.get_shape()[1].value
    # 全连接层1:输出84
    local_1 = local_layer(names = 'local1_scope', input = reshape , w_shape = [dim, 84], b_shape = [84])
     # 全连接层2:输出5
    local_2 = local_layer(names = 'local2_scope', input = local_1 , w_shape = [84, 5], b_shape = [5])
    print(local_2.shape)

    return local_2

3.训练过程

可能是数据集太小的原因,这个网络很快就拟合了,后期我们将会采用更大的数据集进行训练。

结语

今天的分享就到此结束了,网络层的构建也比较简单,比较注意的是最后的三个卷积层的输出和其输入的shape是一样的,老铁们可以自行print看看结果哦,此外由于数据集的类别发生了变化,因此相应的数据处理部分和网络的输出部分也做了改变,同时,不知道细心的老铁有没有发现,数据集处理部分似乎有点不合理,我是按照每个类别单独进行循环读取数据,那万一数据分类过多怎么办呢?因此,后期我们将会采用新的一种数据管道的读取方式,高效简洁,一起期待吧!

最后,我们的实战代码希望真心学习的你们一定下去自己实践哦,自己按照第一次项目的代码一步步改进哦,代码调试不通,可以私聊小编,通过自己一步步查找错误进行修正才是真正的学到知识哦!

编辑:玥怡居士|审核:小圈圈居士

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-09-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT进阶之旅 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档