科普知识
在实践中,由于数据集不够大,很少有人从头开始训练网络。常见的做法是使用预训练的网络(例如在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看看结果哦,此外由于数据集的类别发生了变化,因此相应的数据处理部分和网络的输出部分也做了改变,同时,不知道细心的老铁有没有发现,数据集处理部分似乎有点不合理,我是按照每个类别单独进行循环读取数据,那万一数据分类过多怎么办呢?因此,后期我们将会采用新的一种数据管道的读取方式,高效简洁,一起期待吧!
最后,我们的实战代码希望真心学习的你们一定下去自己实践哦,自己按照第一次项目的代码一步步改进哦,代码调试不通,可以私聊小编,通过自己一步步查找错误进行修正才是真正的学到知识哦!
编辑:玥怡居士|审核:小圈圈居士