TensorFlow学习——CIFAR-10(二)代码实现
来源:互联网 发布:淘宝lolcdk是真的吗 编辑:程序博客网 时间:2024/05/20 23:34
搜罗CIFAR-10资料时发现Kevin的视频教程系列与网上的资料略有出路
网上关于CIFAR-10的程序大致相同,以下博客都是相同的程序代码及解释:
http://www.cnblogs.com/lixiaoran/p/6740022.html
http://shartoo.github.io/tensorflow-sourcecode-input/
http://blog.csdn.net/diligent_321/article/details/53130913
程序链接:https://github.com/tensorflow/models/blob/master/tutorials/image/cifar10
下载到的cifar10程序共包括
1. cifar10.py
2. cifar10_eval.py
3. cifar10_input.py
4. cifar10_multi_gpu_train.py
5. cifar10_train.py
只讨论CPU版本则可以自动忽略cifar10_multi_gpu_train.py文件。另外,为加快程序调试,避免在程序运行时再去自动下载资源,可以提前去http://www.cs.toronto.edu/~kriz/cifar-10-binary.tar.gz下好图片压缩文件,放在默认位置/tmp/cifar10_data 中即可
本文针对Kevin的视频教程做学习笔录,则代码这块主要如下:
(不懂的函数查找tensonflow官方网站的API手册:https://www.tensorflow.org/versions/r0.12/api_docs/python/nn.html#neural-network)
1. cifar10_input.py
#By @Kevin Xu#kevin28520@gmail.com#Youtube: https://www.youtube.com/channel/UCVCSn4qQXTDAtGWpWAe4Plw#Chinese weibo: http://bit.ly/2nAmOcO#The aim of this project is to use TensorFlow to process our own data.# - cifar10_input.py: read in data and generate batches# - cifar10.py: build the model architecture, train, evaluate# I used Ubuntu with Python 3.5, TensorFlow 1.0*, other OS should also be good.# I didn't use data argumentation, I spent less than 30 mins with 10K steps.# data: cifar10 binary version# https://www.cs.toronto.edu/~kriz/cifar.html# data size: ~184M# How to run?# 0. you need to change the data directory# 1. run cifar10.py# 2. call train() in the console to train the model# 3. call evaluate() in the console to test on the test data# Note: # it is suggested to restart your kenel to train the model multiple times # (in order to clear all the variables in the memory)# Otherwise errors may occur: conv1/weights/biases already exist......#%%import tensorflow as tfimport numpy as npimport os#%% Reading datadef read_cifar10(data_dir, is_train, batch_size, shuffle): """Read CIFAR10 Args: data_dir: the directory of CIFAR10 is_train: boolen batch_size: shuffle: Returns: label: 1D tensor, tf.int32 image: 4D tensor, [batch_size, height, width, 3], tf.float32 """ img_width = 32 img_height = 32 img_depth = 3 label_bytes = 1 image_bytes = img_width*img_height*img_depth with tf.name_scope('input'): if is_train: filenames = [os.path.join(data_dir, 'data_batch_%d.bin' %ii) for ii in np.arange(1, 6)] else: filenames = [os.path.join(data_dir, 'test_batch.bin')] filename_queue = tf.train.string_input_producer(filenames) reader = tf.FixedLengthRecordReader(label_bytes + image_bytes) key, value = reader.read(filename_queue) record_bytes = tf.decode_raw(value, tf.uint8) label = tf.slice(record_bytes, [0], [label_bytes]) label = tf.cast(label, tf.int32) image_raw = tf.slice(record_bytes, [label_bytes], [image_bytes]) image_raw = tf.reshape(image_raw, [img_depth, img_height, img_width]) image = tf.transpose(image_raw, (1,2,0)) # convert from D/H/W to H/W/D image = tf.cast(image, tf.float32)# # data argumentation# image = tf.random_crop(image, [24, 24, 3])# randomly crop the image size to 24 x 24# image = tf.image.random_flip_left_right(image)# image = tf.image.random_brightness(image, max_delta=63)# image = tf.image.random_contrast(image,lower=0.2,upper=1.8) image = tf.image.per_image_standardization(image) #substract off the mean and divide by the variance if shuffle: images, label_batch = tf.train.shuffle_batch( [image, label], batch_size = batch_size, num_threads= 16, capacity = 2000, min_after_dequeue = 1500) else: images, label_batch = tf.train.batch( [image, label], batch_size = batch_size, num_threads = 16, capacity= 2000) # return images, tf.reshape(label_batch, [batch_size])## ONE-HOT n_classes = 10 label_batch = tf.one_hot(label_batch, depth= n_classes) return images, tf.reshape(label_batch, [batch_size, n_classes]) #%% TEST# To test the generated batches of images# When training the model, DO comment the following codesimport matplotlib.pyplot as plt#data_dir = '/home/kevin/tensorflow/CIFAR10/data/cifar-10-batches-bin/'data_dir = 'D:/cat_VS_dog/CIFAR10/data/cifar-10-batches-bin/' #My dir for data binBATCH_SIZE = 10image_batch, label_batch = read_cifar10(data_dir, is_train=True, batch_size=BATCH_SIZE, shuffle=True)with tf.Session() as sess: i = 0 coord = tf.train.Coordinator() threads = tf.train.start_queue_runners(coord=coord) try: while not coord.should_stop() and i<1: img, label = sess.run([image_batch, label_batch]) # just test one batch for j in np.arange(BATCH_SIZE): #print('label: %d' %label[j]) #20170730 remark by ciky for error when running plt.imshow(img[j,:,:,:]) plt.show() i+=1 except tf.errors.OutOfRangeError: print('done!') finally: coord.request_stop() coord.join(threads)
1.在Test中,print('label: %d' %label[j])这句运行时,弹出错误如下:
Traceback (most recent call last):File "<ipython-input-7-5a78e53decff>", line 23, in <module> print('label: %d' %label[j])TypeError: %d format: a number is required, not numpy.ndarray
改成“”print('label: %s' %label[j])“”(或注释掉)未报错,每个显示的图片显示为:label: [ 0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]
2. 显示图片可能看上去较怪,这是因为代码中加了句:
image = tf.image.per_image_standardization(image)#substract off the mean and divide by the variance
如想看原图显示效果,可将该句注释掉,不过显示效果怪不影响训练。
2. cifar10.py
#By @Kevin Xu#kevin28520@gmail.com#Youtube: https://www.youtube.com/channel/UCVCSn4qQXTDAtGWpWAe4Plw#Chinese weibo: http://bit.ly/2nAmOcO #The aim of this project is to use TensorFlow to process our own data.# - cifar10_input.py: read in data and generate batches# - cifar10.py: build the model architecture, train, evaluate# I used Ubuntu with Python 3.5, TensorFlow 1.0*, other OS should also be good.# I didn't use data argumentation, I spent less than 30 mins with 10K steps.# data: cifar10 binary version# https://www.cs.toronto.edu/~kriz/cifar.html# data size: ~184M# How to run?# 0. you need to change the data directory# 1. run cifar10.py# 2. call train() in the console to train the model# 3. call evaluate() in the console to test on the test data# Note: # it is suggested to restart your kenel to train the model multiple times # (in order to clear all the variables in the memory)# Otherwise errors may occur: conv1/weights/biases already exist......#%%import osimport os.pathimport mathimport numpy as npimport tensorflow as tfimport cifar10_input#%%BATCH_SIZE = 128learning_rate = 0.05MAX_STEP = 10000 # with this setting, it took less than 30 mins on my laptop to train.#%%def inference(images): ''' Args: images: 4D tensor [batch_size, img_width, img_height, img_channel] Notes: In each conv layer, the kernel size is: [kernel_size, kernel_size, number of input channels, number of output channels]. number of input channels are from previuous layer, if previous layer is THE input layer, number of input channels should be image's channels. ''' #conv1, [5, 5, 3, 96], The first two dimensions are the patch size, #the next is the number of input channels, #the last is the number of output channels with tf.variable_scope('conv1') as scope: weights = tf.get_variable('weights', shape = [3, 3, 3, 96], dtype = tf.float32, initializer=tf.truncated_normal_initializer(stddev=0.05,dtype=tf.float32)) biases = tf.get_variable('biases', shape=[96], dtype=tf.float32, initializer=tf.constant_initializer(0.0)) conv = tf.nn.conv2d(images, weights, strides=[1,1,1,1], padding='SAME') pre_activation = tf.nn.bias_add(conv, biases) conv1 = tf.nn.relu(pre_activation, name= scope.name) #pool1 and norm1 with tf.variable_scope('pooling1_lrn') as scope: pool1 = tf.nn.max_pool(conv1, ksize=[1,3,3,1],strides=[1,2,2,1], padding='SAME', name='pooling1') norm1 = tf.nn.lrn(pool1, depth_radius=4, bias=1.0, alpha=0.001/9.0, beta=0.75, name='norm1') #conv2 with tf.variable_scope('conv2') as scope: weights = tf.get_variable('weights', shape=[3,3,96, 64], dtype=tf.float32, initializer=tf.truncated_normal_initializer(stddev=0.05,dtype=tf.float32)) biases = tf.get_variable('biases', shape=[64], dtype=tf.float32, initializer=tf.constant_initializer(0.1)) conv = tf.nn.conv2d(norm1, weights, strides=[1,1,1,1],padding='SAME') pre_activation = tf.nn.bias_add(conv, biases) conv2 = tf.nn.relu(pre_activation, name='conv2') #pool2 and norm2 with tf.variable_scope('pooling2_lrn') as scope: norm2 = tf.nn.lrn(conv2, depth_radius=4, bias=1.0, alpha=0.001/9.0, beta=0.75,name='norm2') pool2 = tf.nn.max_pool(norm2, ksize=[1,3,3,1], strides=[1,1,1,1], padding='SAME',name='pooling2') #local3 with tf.variable_scope('local3') as scope: reshape = tf.reshape(pool2, shape=[BATCH_SIZE, -1]) dim = reshape.get_shape()[1].value weights = tf.get_variable('weights', shape=[dim,384], dtype=tf.float32, initializer=tf.truncated_normal_initializer(stddev=0.004,dtype=tf.float32)) biases = tf.get_variable('biases', shape=[384], dtype=tf.float32, initializer=tf.constant_initializer(0.1)) local3 = tf.nn.relu(tf.matmul(reshape, weights) + biases, name=scope.name) #local4 with tf.variable_scope('local4') as scope: weights = tf.get_variable('weights', shape=[384,192], dtype=tf.float32, initializer=tf.truncated_normal_initializer(stddev=0.004,dtype=tf.float32)) biases = tf.get_variable('biases', shape=[192], dtype=tf.float32, initializer=tf.constant_initializer(0.1)) local4 = tf.nn.relu(tf.matmul(local3, weights) + biases, name='local4') # softmax with tf.variable_scope('softmax_linear') as scope: weights = tf.get_variable('softmax_linear', shape=[192, 10], dtype=tf.float32, initializer=tf.truncated_normal_initializer(stddev=0.004,dtype=tf.float32)) biases = tf.get_variable('biases', shape=[10], dtype=tf.float32, initializer=tf.constant_initializer(0.1)) softmax_linear = tf.add(tf.matmul(local4, weights), biases, name='softmax_linear') return softmax_linear#%%def losses(logits, labels): with tf.variable_scope('loss') as scope: labels = tf.cast(labels, tf.int64) # to use this loss fuction, one-hot encoding is needed! cross_entropy = tf.nn.softmax_cross_entropy_with_logits\ (logits=logits, labels=labels, name='xentropy_per_example') # cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits\# (logits=logits, labels=labels, name='xentropy_per_example') loss = tf.reduce_mean(cross_entropy, name='loss') tf.summary.scalar(scope.name+'/loss', loss) return loss#%% Train the model on the training data# you need to change the training data directory belowdef train(): my_global_step = tf.Variable(0, name='global_step', trainable=False) #data_dir = '/home/kevin/tensorflow/CIFAR10/data/cifar-10-batches-bin/' data_dir = 'D:/cat_VS_dog/CIFAR10/data/cifar-10-batches-bin/' #My dir for data bin #log_dir = '/home/kevin/tensorflow/CIFAR10/logs234/' log_dir = 'D:/cat_VS_dog/CIFAR10/logs' images, labels = cifar10_input.read_cifar10(data_dir=data_dir, is_train=True, batch_size= BATCH_SIZE, shuffle=True) logits = inference(images) loss = losses(logits, labels) optimizer = tf.train.GradientDescentOptimizer(learning_rate) train_op = optimizer.minimize(loss, global_step= my_global_step) saver = tf.train.Saver(tf.global_variables()) summary_op = tf.summary.merge_all() init = tf.global_variables_initializer() sess = tf.Session() sess.run(init) coord = tf.train.Coordinator() threads = tf.train.start_queue_runners(sess=sess, coord=coord) summary_writer = tf.summary.FileWriter(log_dir, sess.graph) try: for step in np.arange(MAX_STEP): if coord.should_stop(): break _, loss_value = sess.run([train_op, loss]) if step % 50 == 0: print ('Step: %d, loss: %.4f' % (step, loss_value)) if step % 100 == 0: summary_str = sess.run(summary_op) summary_writer.add_summary(summary_str, step) if step % 2000 == 0 or (step + 1) == MAX_STEP: checkpoint_path = os.path.join(log_dir, 'model.ckpt') saver.save(sess, checkpoint_path, global_step=step) except tf.errors.OutOfRangeError: print('Done training -- epoch limit reached') finally: coord.request_stop() coord.join(threads) sess.close()#%% To test the model on the test datadef evaluate(): with tf.Graph().as_default(): log_dir = '/home/kevin/tensorflow/CIFAR10/logs10000/' test_dir = '/home/kevin/tensorflow/CIFAR10/data/cifar-10-batches-bin/' n_test = 10000 # reading test data images, labels = cifar10_input.read_cifar10(data_dir=test_dir, is_train=False, batch_size= BATCH_SIZE, shuffle=False) logits = inference(images) top_k_op = tf.nn.in_top_k(logits, labels, 1) saver = tf.train.Saver(tf.global_variables()) with tf.Session() as sess: print("Reading checkpoints...") ckpt = tf.train.get_checkpoint_state(log_dir) if ckpt and ckpt.model_checkpoint_path: global_step = ckpt.model_checkpoint_path.split('/')[-1].split('-')[-1] saver.restore(sess, ckpt.model_checkpoint_path) print('Loading success, global_step is %s' % global_step) else: print('No checkpoint file found') return coord = tf.train.Coordinator() threads = tf.train.start_queue_runners(sess = sess, coord = coord) try: num_iter = int(math.ceil(n_test / BATCH_SIZE)) true_count = 0 total_sample_count = num_iter * BATCH_SIZE step = 0 while step < num_iter and not coord.should_stop(): predictions = sess.run([top_k_op]) true_count += np.sum(predictions) step += 1 precision = true_count / total_sample_count print('precision = %.3f' % precision) except Exception as e: coord.request_stop(e) finally: coord.request_stop() coord.join(threads) #%%
待续
- TensorFlow学习——CIFAR-10(二)代码实现
- TensorFlow学习——CIFAR-10(一)
- TensorFlow学习——CIFAR-10(python实现数据可视化)
- Tensorflow深度学习之二十一:LeNet的实现(CIFAR-10数据集)
- Tensorflow深度学习之二十二:AlexNet的实现(CIFAR-10数据集)
- tensorflow学习笔记----二(CIFAR-10 模型 )
- TensorFlow学习笔记(十): CIFAR-10
- cifar-10 分类 tensorflow 代码
- Tensorflow实现CIFAR-10分类问题-详解二cifar10.py
- TensorFlow深度学习进阶教程:TensorFlow实现CIFAR-10数据集测试的卷积神经网络
- 深度学习小白——tensorflow(四)CIFAR-10实例
- TensorFlow-CNN CIFAR-10数据集 学习
- CNN & Tensorflow 入门——以Cifar-10为例
- Tensorflow深度学习之二十:CIFAR-10数据集介绍
- caffe学习(二) CIFAR-10数据集上训练
- TensorFlow 笔记(十一):CNN示例代码CIFAR-10分析(上)
- tensorflow 卷积神经网络实现CIFAR-10数据集识别
- Tensorflow实现CIFAR-10分类问题-详解一cifar10_train.py
- 基于YARN的Spark程序工作过程
- 【Java编程教材】Java教程之多线程编程
- tensorflow教程学习二MNIST
- 将已有项目下的html转为haml
- JS的逻辑思维练习
- TensorFlow学习——CIFAR-10(二)代码实现
- ios-drawrect方法解析
- Java集合类: Set、List、Map、Queue使用场景梳理
- BestCoder Round #2 解题报告
- Android获取本机局域网IP的方法
- Servlet的多线程和线程安全
- B
- Java设计模式 单列模式
- 回文串之栈