利用tensorflow构建AlexNet模型,实现小数量级的猫狗分类(只有train)

首先看路径:

data文件夹分为,model文件夹,train文件夹和文件夹,model文件夹存放模型文件,train存放cat和dog的两个文件夹图片,

validation和train一样。config.py存放配置的一些参数,util.py定义AlexNet框架,AlexNet实现模型的训练,其他没有用到。

首先在config.py定义配置文件,都是卷积层和全连接层用到的参数,用字典的形式存储,

代码如下:

"""
配置文件:定义参数
"""
import tensorflow as tf
learning_rate=1e-4
training_iers=200
batch_size=50
display_step=5
n_classes=2
n_fc1=4096
n_fc2=2048W_conv={'conv1':tf.Variable(tf.truncated_normal([11,11,3,96],stddev=0.0001)),'conv2': tf.Variable(tf.truncated_normal([5, 5, 96, 256], stddev=0.01)),'conv3': tf.Variable(tf.truncated_normal([3, 3, 256, 384], stddev=0.01)),'conv4': tf.Variable(tf.truncated_normal([3, 3, 384, 384], stddev=0.01)),'conv5': tf.Variable(tf.truncated_normal([3, 3, 384, 256], stddev=0.01)),'fc1': tf.Variable(tf.truncated_normal([6*6*256,n_fc1], stddev=0.1)),'fc2': tf.Variable(tf.truncated_normal([n_fc1, n_fc2], stddev=0.1)),'fc3': tf.Variable(tf.truncated_normal([n_fc2, n_classes], stddev=0.1))}
b_conv={'conv1':tf.Variable(tf.constant(0.0,shape=[96],dtype=tf.float32)),'conv2':tf.Variable(tf.constant(0.1,shape=[256],dtype=tf.float32)),'conv3':tf.Variable(tf.constant(0.1,shape=[384],dtype=tf.float32)),'conv4':tf.Variable(tf.constant(0.1,shape=[384],dtype=tf.float32)),'conv5':tf.Variable(tf.constant(0.1,shape=[256],dtype=tf.float32)),'fc1': tf.Variable(tf.constant(0.1,shape=[n_fc1],dtype=tf.float32)),'fc2': tf.Variable(tf.constant(0.1,shape=[n_fc2],dtype=tf.float32)),'fc3': tf.Variable(tf.constant(0.0,shape=[n_classes],dtype=tf.float32))}

在util.py定义AlexNet框架

"""
定义 AlexNet框架
"""
import os
import numpy as np
from config import W_conv,b_conv,n_classes,learning_rate
import tensorflow as tf
"""
构建AlexNet模型
"""
"""
对特征图进行归一化 采用标准化处理
"""
def batch_norm(inputs,is_training,is_conv_out=True,decay=0.999):scale=tf.Variable(tf.ones([inputs.get_shape()[-1]]))beta=tf.Variable(tf.zeros([inputs.get_shape()[-1]]))pop_mean = tf.Variable(tf.zeros([inputs.get_shape()[-1]]),trainable=False)pop_var = tf.Variable(tf.ones([inputs.get_shape()[-1]]),trainable=False)if is_training:if is_conv_out:batch_mean,batch_var=tf.nn.moments(inputs,[0,1,2])else:batch_mean, batch_var =tf.nn.moments(inputs, [0])#滑动平均train_mean=tf.assign(pop_mean,pop_mean*decay+batch_mean*(1-decay))train_var = tf.assign(pop_var, pop_var * decay + batch_var * (1 - decay))with tf.control_dependencies([train_mean,train_var]):return tf.nn.batch_normalization(inputs,batch_mean,batch_var,beta,scale,0.001)else:return tf.nn.batch_normalization(inputs,pop_mean, pop_var, beta, scale, 0.001)
def build_cnn(x,y):x_image=tf.reshape(x,[-1,227,227,3])#卷积层1conv1=tf.nn.relu(tf.nn.conv2d(x_image,W_conv['conv1'],strides=[1,4,4,1],padding='VALID')+b_conv['conv1'])conv1=batch_norm(conv1,True)#池化层1pool1=tf.nn.avg_pool(conv1,ksize=[1,3,3,1],strides=[1,2,2,1],padding='VALID')#LRN层1norm1=tf.nn.lrn(pool1,5,bias=1.0,alpha=0.001/9.0,beta=0.75)#卷积层2conv2=tf.nn.relu(tf.nn.conv2d(norm1,W_conv['conv2'],strides=[1,1,1,1],padding='SAME')+b_conv['conv2'])conv2 = batch_norm(conv2, True)#池化层2pool2=tf.nn.avg_pool(conv2,ksize=[1,3,3,1],strides=[1,2,2,1],padding='VALID')#LRN层2norm2=tf.nn.lrn(pool2,5,bias=1.0,alpha=0.001/9.0,beta=0.75)#卷积层3conv3=tf.nn.relu(tf.nn.conv2d(norm2,W_conv['conv3'],strides=[1,1,1,1],padding='SAME')+b_conv['conv3'])conv3 = batch_norm(conv3, True)#卷积层4conv4=tf.nn.relu(tf.nn.conv2d(conv3,W_conv['conv4'],strides=[1,1,1,1],padding='SAME')+b_conv['conv4'])conv4 = batch_norm(conv4, True)#卷积层5conv5=tf.nn.relu(tf.nn.conv2d(conv4,W_conv['conv5'],strides=[1,1,1,1],padding='SAME')+b_conv['conv5'])conv5 = batch_norm(conv5, True)#池化层5pool5=tf.nn.avg_pool(conv5,ksize=[1,3,3,1],strides=[1,2,2,1],padding='VALID')#全连接层1fc1=tf.matmul(tf.reshape(pool5, [-1, 6 * 6 * 256]), W_conv['fc1']) + b_conv['fc1']fc1 = batch_norm(fc1, True,is_conv_out=False)fc1=tf.nn.relu(fc1)fc1=tf.nn.dropout(fc1,0.5)#全连接层2fc2=tf.matmul(fc1, W_conv['fc2']) + b_conv['fc2']fc2 = batch_norm(fc2, True, is_conv_out=False)fc2=tf.nn.relu(fc2)fc2=tf.nn.dropout(fc2,0.5)#全连接层3fc3=tf.matmul(fc2,W_conv['fc3'])+b_conv['fc3']#定义损失loss=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=fc3,labels=y))optimizer=tf.train.GradientDescentOptimizer(learning_rate=learning_rate).minimize(loss)#评估模型accuarcy=tf.reduce_mean(tf.cast(tf.equal(tf.argmax(fc3,1),tf.argmax(y,1)),dtype=tf.float32))return loss,optimizer,accuarcy"""
读取train.tfrecords并返回image和label 这个是已经做好的.tfrecords文件对于太大的不适合
"""
def read_and_decode(filename,batch_size):filename_queue=tf.train.string_input_producer([filename])# 按队列的形式读取reader=tf.TFRecordReader()_,serialized_example=reader.read(filename_queue)#返回文件名和文件features=tf.parse_single_example(serialized_example,features={'label':tf.FixedLenFeature([],tf.int64),#与存储的类型一致'image':tf.FixedLenFeature([],tf.string)})img=tf.decode_raw(features['image'],tf.uint8)img=tf.reshape(img,shape=[227,227,3])#img = tf.cast(img, dtype=tf.float32) * (1.0 / 128) - 0.5label = tf.cast(features['label'], dtype=tf.int32)img_batch, label_batch = tf.train.shuffle_batch([img, label], batch_size=batch_size,capacity=64, min_after_dequeue=32,num_threads=64)return img_batch,tf.reshape(label_batch,[batch_size])
"""
将图片的路径和对应的标签存储在list中返回
"""
def get_file(dir):images = []temp = []for root,dirs,files in os.walk(dir):for name in files:images.append(os.path.join(root,name))for name in dirs:#以dogs cats文件夹形式读取temp.append(os.path.join(root,name))labels=[]for one_folder in temp:n_img=len(os.listdir(one_folder))#展开cats或者dogs的图片letter=one_folder.split('/')[-1]if letter=='cats':labels=np.append(labels,n_img*[0])#np.append拼接 0是cat 1是dogelse:labels=np.append(labels,n_img*[1])#打乱temp=np.array([images,labels])temp=temp.transpose()np.random.shuffle(temp)image_list=list(temp[:,0])label_list=list(temp[:,1])label_list=[int(float(i)) for i in label_list]return image_list,label_list
"""
太大的TFrecord数据集占内存,用此方法可将需要数量的图片转换成TFrecord即可
"""
def get_batch(image_list,label_list,img_width,img_height,batch_size,capacity):image=tf.cast(image_list,dtype=tf.string)label=tf.cast(label_list, dtype=tf.int32)input_queue=tf.train.slice_input_producer([image,label])label=input_queue[1]image_contents=tf.read_file(input_queue[0])image=tf.image.decode_jpeg(image_contents,channels=3)image=tf.image.resize_image_with_crop_or_pad(image,img_width,img_height)image=tf.image.per_image_standardization(image)#将图片标准化image_batch,label_batch=tf.train.batch([image,label],batch_size=batch_size,num_threads=64,capacity=capacity)label_batch=tf.reshape(label_batch,[batch_size])return image_batch,label_batch
"""
实现标签的one-hot
"""
# #转换one-hot
def one_hot(label):n_classes=max(label)+1label = np.eye(n_classes)[label.reshape(-1)]return label
# 转换one-hot
# def one_hot(labels):
#     n_samples=len(labels)
#     n_class=n_samples+1
#     onehot_label=np.zeros((n_samples,n_class))
#     onehot_label[np.arange(n_samples),labels]=1
#     return onehot_label

最后在AlexNet.py调用即可

import tensorflow as tf
import util
import config
import time
import matplotlib.pyplot as plt
"""
直接读取整个train.tfrecord
"""
#filename='./data/train/train.tfrecords'
#img_batch,label_batch=util.read_and_decode(filename,batch_size=32)
"""
按照需求来读取图片
"""
dir='./data/train'
image_list,label_list=util.get_file(dir)
img_batch,label_batch=util.get_batch(image_list,label_list,227,227,batch_size=32,capacity=64)
x=tf.placeholder(shape=[None,227,227,3],dtype=tf.float32)
y=tf.placeholder(shape=[None,config.n_classes],dtype=tf.float32)
loss,optimizer,accuarcy=util.build_cnn(x,y)
def train(epoch):init=tf.global_variables_initializer()saver = tf.train.Saver()with tf.Session() as sess:sess.run(init)costs=[]start_time=time.time()save_model='./data/model/AlexNetModel.ckpt'train_writer=tf.summary.FileWriter('./log',sess.graph)#启动线程#coord=tf.train.Coordinator()threads = tf.train.start_queue_runners(sess=sess)for i in range(epoch):image,label=sess.run([img_batch,label_batch])labels = util.one_hot(label)_,cost,train_accuarcy=sess.run([optimizer,loss,accuarcy],feed_dict={x:image,y:labels})print('step={},loss={},train_accuarcy={}'.format(i,cost,train_accuarcy))costs.append(cost)end_time=time.time()print('step={},time={}'.format(i,(end_time-start_time)))print('')print('optimization is finish')saver.save(sess,save_model)print('model save finished')# coord.request_stop()# coord.join(threads)plt.plot(costs)plt.show()plt.xlabel('iter')plt.ylabel('cost')
if __name__ == '__main__':train(epoch=50)

损失值打印结果:

未加特征处理

加了归一化处理:明显损失值得到了减少

 

由于做好的train.TFrecorder数据集太大,后面改成按照所需的数据量转换成TFrecorder。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/493639.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

脑网络的可塑性——随时都在发生

来源:神经科技前沿神经元的突起是神经元胞体的延伸部分,由于形态结构和功能的不同,可分为树突(dendrite)和轴突(axon);树突是从胞体发出的一至多个突起,呈放射状。轴突每个神经元只有一根胞体发出轴突的细胞 质部位多呈…

KAZE论文研读

KAZE是发表在ECCV2012的一种特征点检测算法,相比于SIFT和SURF,KAZE建立的高斯金字塔是非线性的尺度空间,采用加性算子分裂算法(Additive Operator Splitting, AOS)来进行非线性扩散滤波。一个很显著的特点是在模糊图像的同时还能保留边缘细节…

简单的线性模型实现tensorflow权重的生成和调用,并且用类的方式实现参数共享

首先看文件路径,line_regression是总文件夹,model文件夹存放权重文件, global_variable.py写了一句话. save_path./model/weight 权重要存放的路径,以weight命名. lineRegulation_model.py代码 import tensorflow as tf "…

comparing ORB and AKAZE

文章全称是《Comparing ORB and AKAZE for visual odometry of unmanned aerial vehicles》。这是一篇来自巴西的文章,没有在百度文库中找到,是在其他博客中给出的链接得到的。从链接的URL可以看出这是一篇来自会议CCIS云计算与智能系统国际会议的文章。…

利用 CRISPR 基因编辑技术,人类正在做七件“疯狂”的事

来源:36Kr编译:喜汤很少有哪种现代科学创新能像CRISPR基因编辑技术一样影响深远。有了它,科学家们可以精确地改变任何细胞的DNA。CRISPR技术成为新宠,部分原因是它比早期基因编辑技术更容易使用。尽管CRISPR还没有彻底大展身手&am…

吴恩达作业3:利用深层神经网络实现小猫的分类

利用4层神经网络实现小猫的分类,小猫训练样本是(209,64*64*312288),故输入节点是12288个,隐藏层节点依次为20,7,5,输出层为1。 首先看文件路径,dnn_utils_v2.py代码是激活…

A-KAZE论文研读

AKAZE是KAZE的加速版本。KAZE在构建非线性空间的过程中很耗时,在AKAZE中将Fast Explicit Diffusion(FED)加入到金字塔框架可以dramatically speed-up。在描述子方面,AKAZE使用了更高效的Modified Local Difference Binary(M-LDB),可以从非线性…

和你抢“饭碗”的40家服务机器人企业大盘点!

来源:物联网智库摘要:本文将对国内近40家服务机器人企业进行汇总介绍,所选企业在其相应版块活跃度较高。从三个大类进行了细分盘点。国家机器人联盟(IFR)根据应用环境将机器人分为了工业机器人和服务机器人。服务机器人…

YOLO9000

YOLO9000是YOLO的第三个版本。前两个版本是YOLO v1,YOLO v2,在CVPR2017的文章《Better,Faster,Stronger》中的前半部分都是对前两个版本的介绍,新的内容主要在Stronger部分。YOLO9000中的9000指的是YOLO可以对超过9000种图像进行分类。 Bett…

吴恩达作业4:权重初始化

权重初始化的 正确选择能够有效的避免多层神经网络传播过程中的梯度消失和梯度爆炸问题,下面通过三个初始化的方法来验证: sigmoid导数函数:最大值小于0.25,故经过多层反向传播以后,会导致最初的层,权重无…

先发制人!Waymo将首推商用载人自动驾驶服务,Uber们怕不怕?

编译:费棋来源:AI科技大本营“真的,真的很难。”11 月举办的一场会议上,Alphabet 旗下 Waymo CEO John Krafcik 对做自动驾驶汽车技术的艰难不无感慨。在他看来,未来几十年内,自动驾驶汽车将一直存在限制&a…

利用ORB/AKAZE特征点进行图像配准

Kp1,kp2都是list类型,两幅图都是500个特征点。这和ORB论文中的数据是一样的。4.4章节 Matches也是list类型,找到325个匹配对。 AKAZE文章中提到一个指标:MS(matching score)# Correct Matches/# Features, 如果overlap area error 小于40%…

吴恩达作业5:正则化和dropout

构建了三层神经网络来验证正则化和dropout对防止过拟合的作用。 首先看数据集,reg_utils.py包含产生数据集函数,前向传播,计算损失值等,代码如下: import numpy as np import matplotlib.pyplot as plt import h5py …

十年之后,数字孪生将这样改变我们的工作与生活

来源:资本实验室数字孪生是近几年兴起的非常前沿的新技术,简单说就是利用物理模型,使用传感器获取数据的仿真过程,在虚拟空间中完成映射,以反映相对应的实体的全生命周期过程。在未来,物理世界中的各种事物…

什么是图像

图像,尤其是数字图像的定义,在冈萨雷斯的书中是一个二维函数f(x,y),x,y是空间平面坐标,幅值f是图像在该点处的灰度或者强度。下面通过OpenCV中最常用的图像表示方法Mat来看一下在计算机中是怎么定义图像的。 Mat的定义 OpenCV在2.0之后改用…

吴恩达作业6:梯度检验

梯度检验的目的就是看反向传播过程中的导数有没有较大的误差,首先看Jtheta*x的梯度检验:代码如下 import numpy as np """ Jx*theta的前向传播 """ def forward_propagation(x,theta):Jx*thetareturn J ""&quo…

10年后的计算机会是怎样的?

作者:孙鹏(剑桥大学计算机系博士)来源:新原理研究所上个世纪三十年代,邱奇和图灵共同提出了通用计算机的概念[1]。在接下来的十多年里,因为战争需要下的国家推动,计算机得以很快从理论发展成为实…

什么是图像变换

还是看OpenCV官方手册,我觉得这样可以同时学习如何使用函数和如何理解一些基本概念。 首先,这里的几何变换geometrical transformations是针对2D图像而言的,不改变图像内容而是将像素网格变形deform the pixel grid,映射到目标图…

MSRA20周年研究趋势文章|图像识别的未来:机遇与挑战并存

文/微软亚洲研究院 代季峰 林思德 郭百宁识别图像对人类来说是件极容易的事情,但是对机器而言,这也经历了漫长岁月。在计算机视觉领域,图像识别这几年的发展突飞猛进。例如,在 PASCAL VOC 物体检测基准测试中,检测器的…

吴恩达作业7:梯度下降优化算法

先说说BatchGD用整个训练样本进行训练得出损失值,SGD是只用一个训练样本训练就得出损失值,GD导致训练慢,SGD导致收敛到最小值不平滑,故引入Mini-batch GD,选取部分样本进行训练得出损失值, 普通梯度下降算…