Tensorflow学习教程------lenet多标签分类
本文在上篇的基础上利用lenet进行多标签分类。五个分类标准,每个标准分两类。实际来说,本文所介绍的多标签分类属于多任务学习中的联合训练,具体代码如下。
#coding:utf-8
import tensorflow as tf
import os
def read_and_decode(filename):
#根据文件名生成一个队列
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={
'label1': tf.FixedLenFeature([], tf.int64),
'label2': tf.FixedLenFeature([], tf.int64),
'label3': tf.FixedLenFeature([], tf.int64),
'label4': tf.FixedLenFeature([], tf.int64),
'label5': tf.FixedLenFeature([], tf.int64),
'img_raw' : tf.FixedLenFeature([], tf.string),
}) img = tf.decode_raw(features['img_raw'], tf.uint8)
img = tf.reshape(img, [227, 227, 3])
img = (tf.cast(img, tf.float32) * (1. / 255) - 0.5)*2
label1 = tf.cast(features['label1'], tf.int32)
label2 = tf.cast(features['label2'], tf.int32)
label3 = tf.cast(features['label3'], tf.int32)
label4 = tf.cast(features['label4'], tf.int32)
label5 = tf.cast(features['label5'], tf.int32)
#print img,label
return img, label1,label2,label3,label4,label5 def get_batch(image, label1,label2,label3,label4,label5, batch_size,crop_size):
#数据扩充变换
distorted_image = tf.random_crop(image, [crop_size, crop_size, 3])#随机裁剪
distorted_image = tf.image.random_flip_up_down(distorted_image)#上下随机翻转
distorted_image = tf.image.random_brightness(distorted_image,max_delta=63)#亮度变化
distorted_image = tf.image.random_contrast(distorted_image,lower=0.2, upper=1.8)#对比度变化 #生成batch
#shuffle_batch的参数:capacity用于定义shuttle的范围,如果是对整个训练数据集,获取batch,那么capacity就应该够大
#保证数据打的足够乱
images, label1_batch,label2_batch,label3_batch,label4_batch,label5_batch = tf.train.shuffle_batch([distorted_image, label1,label2,label3,label4,label5],batch_size=batch_size,
num_threads=1,capacity=20000,min_after_dequeue=1000) return images, label1_batch,label2_batch,label3_batch,label4_batch,label5_batch class network(object): def lenet(self,images,keep_prob): '''
根据tensorflow中的conv2d函数,我们先定义几个基本符号
输入矩阵 W×W,这里只考虑输入宽高相等的情况,如果不相等,推导方法一样,不多解释。
filter矩阵 F×F,卷积核
stride值 S,步长
输出宽高为 new_height、new_width
在Tensorflow中对padding定义了两种取值:VALID、SAME。下面分别就这两种定义进行解释说明。
VALID
new_height = new_width = (W – F + 1) / S #结果向上取整
SAME
new_height = new_width = W / S #结果向上取整
''' images = tf.reshape(images,shape=[-1,32,32,3])
#images = (tf.cast(images,tf.float32)/255.0-0.5)*2
#第一层,卷积层 32,32,3--->5,5,3,6--->28,28,6
#卷积核大小为5*5 输入层深度为3即三通道图像 卷积核深度为6即卷积核的个数
conv1_weights = tf.get_variable("conv1_weights",[5,5,3,6],initializer = tf.truncated_normal_initializer(stddev=0.1))
conv1_biases = tf.get_variable("conv1_biases",[6],initializer = tf.constant_initializer(0.0))
#移动步长为1 不使用全0填充
conv1 = tf.nn.conv2d(images,conv1_weights,strides=[1,1,1,1],padding='VALID')
#激活函数Relu去线性化
relu1 = tf.nn.relu(tf.nn.bias_add(conv1,conv1_biases)) #第二层 最大池化层 28,28,6--->1,2,2,1--->14,14,6
#池化层过滤器大小为2*2 移动步长为2 使用全0填充
pool1 = tf.nn.max_pool(relu1, ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME') #第三层 卷积层 14,14,6--->5,5,6,16--->10,10,16
#卷积核大小为5*5 当前层深度为6 卷积核的深度为16
conv2_weights = tf.get_variable("conv_weights",[5,5,6,16],initializer = tf.truncated_normal_initializer(stddev=0.1))
conv2_biases = tf.get_variable("conv2_biases",[16],initializer = tf.constant_initializer(0.0)) conv2 = tf.nn.conv2d(pool1,conv2_weights,strides=[1,1,1,1],padding='VALID') #移动步长为1 不使用全0填充
relu2 = tf.nn.relu(tf.nn.bias_add(conv2,conv2_biases)) #第四层 最大池化层 10,10,16--->1,2,2,1--->5,5,16
#池化层过滤器大小为2*2 移动步长为2 使用全0填充
pool2 = tf.nn.max_pool(relu2,ksize = [1,2,2,1],strides=[1,2,2,1],padding='SAME') #第五层 全连接层
fc1_weights = tf.get_variable("fc1_weights",[5*5*16,1024],initializer = tf.truncated_normal_initializer(stddev=0.1))
fc1_biases = tf.get_variable("fc1_biases",[1024],initializer = tf.constant_initializer(0.1)) #[1,1024]
pool2_vector = tf.reshape(pool2,[-1,5*5*16]) #特征向量扁平化 原始的每一张图变成了一行9×9*64列的向量
fc1 = tf.nn.relu(tf.matmul(pool2_vector,fc1_weights)+fc1_biases) #为了减少过拟合 加入dropout层 fc1_dropout = tf.nn.dropout(fc1,keep_prob) #第六层 全连接层
#神经元节点数为1024 分类节点2
fc2_weights = tf.get_variable("fc2_weights",[1024,2],initializer=tf.truncated_normal_initializer(stddev=0.1))
fc2_biases = tf.get_variable("fc2_biases",[2],initializer = tf.constant_initializer(0.1))
fc2 = tf.matmul(fc1_dropout,fc2_weights) + fc2_biases return fc2
def lenet_loss(self,fc2,y1_,y2_,y3_,y4_,y5_): #第七层 输出层
#softmax
y1_conv = tf.nn.softmax(fc2)
labels1=tf.one_hot(y1_,2)
#定义交叉熵损失函数
#cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y_conv),reduction_indices=[1]))
loss1 = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits = y1_conv, labels =labels1)) y2_conv = tf.nn.softmax(fc2)
labels2=tf.one_hot(y2_,2)
#定义交叉熵损失函数
#cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y_conv),reduction_indices=[1]))
loss2 = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits = y2_conv, labels =labels2)) y3_conv = tf.nn.softmax(fc2)
labels3=tf.one_hot(y3_,2)
#定义交叉熵损失函数
#cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y_conv),reduction_indices=[1]))
loss3 = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits = y3_conv, labels =labels3)) y4_conv = tf.nn.softmax(fc2)
labels4=tf.one_hot(y4_,2)
#定义交叉熵损失函数
#cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y_conv),reduction_indices=[1]))
loss4 = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits = y4_conv, labels =labels4)) y5_conv = tf.nn.softmax(fc2)
labels5=tf.one_hot(y5_,2)
#定义交叉熵损失函数
#cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y_conv),reduction_indices=[1]))
loss5 = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits = y5_conv, labels =labels5)) loss = (loss1 + loss2 + loss3 + loss4 + loss5)/5
self.cost = loss
return self.cost def lenet_optimer(self,loss):
train_optimizer = tf.train.GradientDescentOptimizer(lr).minimize(loss)
return train_optimizer def train():
image,label1,label2,label3,label4,label5=read_and_decode("./train.tfrecords")
testimage,testlabel1,testlabel2,testlabel3,testlabel4,testlabel5=read_and_decode("./test.tfrecords")
batch_image,batch_label1,batch_label2,batch_label3,batch_label4,batch_label5=get_batch(image,label1,label2,label3,label4,label5,batch_size=30,crop_size=32)
testbatch_image,testbatch_label1,testbatch_label2,testbatch_label3,testbatch_label4,testbatch_label5=get_batch(testimage,testlabel1,testlabel2,testlabel3,testlabel4,testlabel5,batch_size=30,crop_size=32)
#测试数据集 #建立网络,训练所用
x = tf.placeholder("float",shape=[None,32,32,3],name='x-input')
y1_ = tf.placeholder("int32",shape=[None])
y2_ = tf.placeholder("int32",shape=[None])
y3_ = tf.placeholder("int32",shape=[None])
y4_ = tf.placeholder("int32",shape=[None])
y5_ = tf.placeholder("int32",shape=[None]) keep_prob = tf.placeholder(tf.float32) net=network()
#inf=net.buildnet(batch_image)
inf = net.lenet(x,keep_prob)
loss=net.lenet_loss(inf,y1_,y2_,y3_,y4_,y5_) #计算loss
opti=net.optimer(loss) #梯度下降 correct_prediction1 = tf.equal(tf.cast(tf.argmax(inf,1),tf.int32),testbatch_label1)
accuracy1 = tf.reduce_mean(tf.cast(correct_prediction1,tf.float32)) correct_prediction2 = tf.equal(tf.cast(tf.argmax(inf,1),tf.int32),testbatch_label2)
accuracy2 = tf.reduce_mean(tf.cast(correct_prediction2,tf.float32)) correct_prediction3 = tf.equal(tf.cast(tf.argmax(inf,1),tf.int32),testbatch_label3)
accuracy3 = tf.reduce_mean(tf.cast(correct_prediction3,tf.float32)) correct_prediction4 = tf.equal(tf.cast(tf.argmax(inf,1),tf.int32),testbatch_label4)
accuracy4 = tf.reduce_mean(tf.cast(correct_prediction4,tf.float32)) correct_prediction5 = tf.equal(tf.cast(tf.argmax(inf,1),tf.int32),testbatch_label5)
accuracy5 = tf.reduce_mean(tf.cast(correct_prediction5,tf.float32)) accuracy = (accuracy1+accuracy2+accuracy3+accuracy4+accuracy5)/5 init=tf.global_variables_initializer()
with tf.Session() as session:
with tf.device("/gpu:0"):
session.run(init)
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(coord=coord)
max_iter=10000
iter=0
if os.path.exists(os.path.join("model",'model.ckpt')) is True:
tf.train.Saver(max_to_keep=None).restore(session, os.path.join("model",'model.ckpt'))
while iter<max_iter:
#loss_np,_,label_np,image_np,inf_np=session.run([loss,opti,batch_image,batch_label,inf])
b_batch_image,b_batch_label1,b_batch_label2,b_batch_label3,b_batch_label4,b_batch_label5 = session.run([batch_image,batch_label1,batch_label2,batch_label3,batch_label4,batch_label5])
testb_batch_image,testb_batch_label1,testb_batch_label2,testb_batch_label3,testb_batch_label4,testb_batch_label5 = session.run([testbatch_image,testbatch_label1,testbatch_label2,testbatch_label3,testbatch_label4,testbatch_label5])
loss_np,_=session.run([loss,opti],feed_dict={x:b_batch_image,y1_:b_batch_label1,y2_:b_batch_label2,y3_:b_batch_label3,y4_:b_batch_label4,y5_:b_batch_label5,keep_prob:0.6})
if iter%50==0:
print 'trainloss:',loss_np
if iter%500==0:
#accuracy_np = session.run([accuracy])
accuracy_np = session.run([accuracy],feed_dict={x:testb_batch_image,y1_:testb_batch_label1,y2_:testb_batch_label2,y3_:testb_batch_label3,y4_:testb_batch_label4,y5_:testb_batch_label5,keep_prob:1.0})
print '测试集准确率为:',accuracy_np
iter+=1
coord.request_stop()#queue需要关闭,否则报错
coord.join(threads)
if __name__ == '__main__':
train()
Tensorflow学习教程------lenet多标签分类的更多相关文章
- Tensorflow学习教程------过拟合
Tensorflow学习教程------过拟合 回归:过拟合情况 / 分类过拟合 防止过拟合的方法有三种: 1 增加数据集 2 添加正则项 3 Dropout,意思就是训练的时候隐层神经元每次随机 ...
- Tensorflow学习教程------代价函数
Tensorflow学习教程------代价函数 二次代价函数(quadratic cost): 其中,C表示代价函数,x表示样本,y表示实际值,a表示输出值,n表示样本的总数.为简单起见,使用一 ...
- Tensorflow学习教程------读取数据、建立网络、训练模型,小巧而完整的代码示例
紧接上篇Tensorflow学习教程------tfrecords数据格式生成与读取,本篇将数据读取.建立网络以及模型训练整理成一个小样例,完整代码如下. #coding:utf-8 import t ...
- tensorflow 学习教程
tensorflow 学习手册 tensorflow 学习手册1:https://cloud.tencent.com/developer/section/1475687 tensorflow 学习手册 ...
- Tensorflow学习教程------实现lenet并且进行二分类
#coding:utf-8 import tensorflow as tf import os def read_and_decode(filename): #根据文件名生成一个队列 filename ...
- Tensorflow学习教程------普通神经网络对mnist数据集分类
首先是不含隐层的神经网络, 输入层是784个神经元 输出层是10个神经元 代码如下 #coding:utf-8 import tensorflow as tf from tensorflow.exam ...
- Tensorflow学习教程------创建图启动图
Tensorflow作为目前最热门的机器学习框架之一,受到了工业界和学界的热门追捧.以下几章教程将记录本人学习tensorflow的一些过程. 在tensorflow这个框架里,可以讲是若数据类型,也 ...
- Tensorflow学习教程------非线性回归
自己搭建神经网络求解非线性回归系数 代码 #coding:utf-8 import tensorflow as tf import numpy as np import matplotlib.pypl ...
- Tensorflow学习教程------tfrecords数据格式生成与读取
首先是生成tfrecords格式的数据,具体代码如下: #coding:utf-8 import os import tensorflow as tf from PIL import Image cw ...
随机推荐
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-italic
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- css 基础知识 (待完善...)
CSS 1.position 属性 对元素进行定位. absolute 相对于 非static类型的position 的 第一个(临近的) 父元素 进行定位. ...
- c++ 字符串转数字或数字转字符串
在C++中字符串转换为数字,或数字转换为字符串,用到如下函数: _itoa atoi.atof.itoa.itow _itoa_s 1.整形转换为字符串: wchar_t * _itot(int _V ...
- JVM探秘:MAT分析内存溢出
本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. MAT是分析Java堆内存的一个工具,全称是 The Eclipse Memory A ...
- 前台图片Canvas压缩上传小结
需求来源:之前有个提交审核表单的业务,表单中含有大量附件图片,大约有20多张吧,为了省事,采用的同步上传,一次需要上传很多照片,本来单张图片限制为200KB,这样子总图片大小约为5MB左右,想想也可以 ...
- POJ 1422 DAG最小路径覆盖
求无向图中能覆盖每个点的最小覆盖数 单独的点也算一条路径 这个还是可以扯到最大匹配数来,原因跟上面的最大独立集一样,如果某个二分图(注意不是DAG上的)的边是最大匹配边,那说明只要取两个端点只要一条边 ...
- 一、VIP课程:互联网工程专题 01-Git基本概念与核心命令掌握
第一课:Git基本概念与核心命令掌握.docx 课程概要: GIT 体系概述 GIT 核心命令使用 GIT 底层原理 一.GIT体系概述 1.使用方式区别 从本地把文件推送远程服务,SVN只需要com ...
- POJ 1840:Eqs 哈希求解五元方程
Eqs Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 14169 Accepted: 6972 Description ...
- Servlet详细教程
Servlet简介 servlet是Server Applet的简称,翻译过来就是服务程序.好吧,这么说你可能还是不太懂,简单的讲,这个servlet是运行在服务器上的一个小程序,用来处理服务器请求的 ...
- 干货 | 京东云Kubernetes集群+Traefik实战
摘要 Traefik支持丰富的annotations配置,可配置众多出色的特性,例如:自动熔断.负载均衡策略.黑名单.白名单.所以Traefik对于微服务来说简直就是一神器. 利用Traefik,并结 ...