标签:restore exp code optimizer 路径 save inf div on()
全卷积网络单张不定大小图片测试代码原型(新模块):
输出原网络输出featuremap,不经任何处理(1*n*n*class)
import AlexNet_FCN as Net import AlexNet_train as train import random import tensorflow as tf IMAGE_PATH = ‘./flower_photos/daisy/5673728_71b8cb57eb.jpg‘ def TF_featuremap(input_size): x = tf.placeholder(tf.float32, [1, input_size[0], input_size[1], 3]) y = Net.inference(x, N_CLASS=5, train=False) with tf.Session() as sess: saver = tf.train.Saver() ckpt = tf.train.get_checkpoint_state(‘./model/‘) saver.restore(sess, ckpt.model_checkpoint_path) global_step = ckpt.model_checkpoint_path.split(‘/‘)[-1].split(‘-‘)[-1] img_raw = tf.gfile.FastGFile(IMAGE_PATH, ‘rb‘).read() img = sess.run(tf.expand_dims(tf.image.resize_images( tf.image.decode_jpeg(img_raw),[input_size[0],input_size[1]],method=random.randint(0,3)),0)) res = sess.run(y, feed_dict={x: img}) print(global_step, ‘\n‘, sess.run(tf.argmax(res, 2))) print(global_step, ‘\n‘, res.shape) return res if __name__==‘__main__‘: TF_featuremap()
网络主干(全卷积化升级):
import tensorflow as tf ‘‘‘AlexNet全卷积版‘‘‘ def inference(X,regularizer=None,N_CLASS=10,train=True): with tf.name_scope(‘conv1‘) as scope: W_c1 = tf.Variable(tf.truncated_normal([11, 11, 3, 64], stddev=0.1)) b_c1 = tf.Variable(tf.random_normal([64])) conv1 = tf.nn.relu(tf.nn.bias_add(tf.nn.conv2d(X, W_c1, strides=[1, 4, 4, 1], padding=‘SAME‘), b_c1), name=scope) print(conv1.name, ‘ ‘, conv1.get_shape().as_list()) conv1 = tf.nn.max_pool(conv1, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1], padding=‘VALID‘, name=‘pool1‘) print(conv1.name, ‘ ‘, conv1.get_shape().as_list()) if train: conv1 = tf.nn.dropout(conv1, 0.5) with tf.name_scope(‘conv2‘) as scope: W_c2 = tf.Variable(tf.truncated_normal([5, 5, 64, 192], stddev=0.1)) b_c2 = tf.Variable(tf.random_normal([192])) conv2 = tf.nn.relu(tf.nn.bias_add(tf.nn.conv2d(conv1, W_c2, strides=[1, 1, 1, 1], padding=‘SAME‘), b_c2), name=scope) print(conv2.name, ‘ ‘, conv2.get_shape().as_list()) conv2 = tf.nn.max_pool(conv2, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1], padding=‘VALID‘, name=‘pool2‘) print(conv2.name, ‘ ‘, conv2.get_shape().as_list()) if train: conv2 = tf.nn.dropout(conv2, 0.5) with tf.name_scope(‘conv3‘) as scope: W_c3 = tf.Variable(tf.truncated_normal([3, 3, 192, 384], stddev=0.01)) b_c3 = tf.Variable(tf.random_normal([384])) conv3 = tf.nn.relu(tf.nn.bias_add(tf.nn.conv2d(conv2, W_c3, strides=[1, 1, 1, 1], padding=‘SAME‘), b_c3),name=scope) print(conv3.name, ‘ ‘, conv3.get_shape().as_list()) if train: conv3 = tf.nn.dropout(conv3, 0.5) with tf.name_scope(‘conv4‘) as scope: W_c4 = tf.Variable(tf.truncated_normal([3, 3, 384, 256], stddev=0.01)) b_c4 = tf.Variable(tf.random_normal([256])) conv4 = tf.nn.relu(tf.nn.bias_add(tf.nn.conv2d(conv3, W_c4, strides=[1, 1, 1, 1], padding=‘SAME‘), b_c4), name=scope) print(conv4.name, ‘ ‘, conv4.get_shape().as_list()) if train: conv4 = tf.nn.dropout(conv4, 0.5) with tf.name_scope(‘conv5‘) as scope: W_c5 = tf.Variable(tf.truncated_normal([3, 3, 256, 256], stddev=0.01)) b_c5 = tf.Variable(tf.random_normal([256])) conv5 = tf.nn.relu(tf.nn.bias_add(tf.nn.conv2d(conv4, W_c5, strides=[1, 1, 1, 1], padding=‘SAME‘), b_c5), name=scope) print(conv5.name, ‘ ‘, conv5.get_shape().as_list()) conv5 = tf.nn.max_pool(conv5, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1], padding=‘VALID‘, name=‘pool5‘) print(conv5.name, ‘ ‘, conv5.get_shape().as_list()) if train: conv5 = tf.nn.dropout(conv5, 0.5) # Fully connected layer with tf.name_scope(‘fc1_conv‘) as scope: W_fc1 = tf.Variable(tf.truncated_normal([6, 6, 256, 4096], stddev=0.01)) b_fc1 = tf.Variable(tf.random_normal([4096])) # 步长设为featuremap尺寸完成降维的预演 fc1 = tf.nn.relu(tf.nn.bias_add(tf.nn.conv2d(conv5, W_fc1, strides=[1, 6, 6, 1], padding=‘SAME‘), b_fc1), name=scope) print(fc1.name, ‘ ‘, fc1.get_shape().as_list()) # fc1 = tf.nn.max_pool(fc1, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1], padding=‘VALID‘, name=‘pool5‘) # print(fc1.name, ‘ ‘, fc1.get_shape().as_list()) if train: fc1 = tf.nn.dropout(fc1, 0.5) with tf.name_scope(‘fc2_conv‘) as scope: W_fc2 = tf.Variable(tf.truncated_normal([1, 1, 4096, 4096], stddev=0.01)) b_fc2 = tf.Variable(tf.random_normal([4096])) fc2 = tf.nn.relu(tf.nn.bias_add(tf.nn.conv2d(fc1, W_fc2, strides=[1, 1, 1, 1], padding=‘SAME‘), b_fc2), name=scope) print(fc2.name, ‘ ‘, fc2.get_shape().as_list()) # fc2 = tf.nn.max_pool(fc2, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1], padding=‘VALID‘, name=‘pool5‘) # print(fc2.name, ‘ ‘, fc2.get_shape().as_list()) if train: fc2 = tf.nn.dropout(fc2, 0.5) with tf.name_scope(‘fc3_conv‘) as scope: W_fc3 = tf.Variable(tf.truncated_normal([1, 1, 4096, N_CLASS], stddev=0.01)) b_fc3 = tf.Variable(tf.random_normal([N_CLASS])) out_put = tf.nn.bias_add(tf.nn.conv2d(fc2, W_fc3, strides=[1, 1, 1, 1], padding=‘SAME‘), b_fc3, name=scope) print(out_put.name, ‘ ‘, out_put.get_shape().as_list()) # fc3 = tf.nn.max_pool(fc3, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1], padding=‘VALID‘, name=‘pool5‘) # print(fc3.name, ‘ ‘, fc3.get_shape().as_list()) if train: out_put = tf.nn.dropout(out_put, 0.5) return tf.squeeze(out_put)
数据IO部分(没有大的改动):
import glob import os.path import random import numpy as np import tensorflow as tf def creat_image_lists(validation_percentage,testing_percentage,INPUT_DATA): ‘‘‘ 将图片(无路径文件名)信息保存在字典中 :param validation_percentage: 验证数据百分比 :param testing_percentage: 测试数据百分比 :param INPUT_DATA: 最外层数据路径(到达类目录上层) :return: 字典{标签:{文件夹:str,训练:[],验证:[],测试:[]},...} ‘‘‘ result = {} sub_dirs = [x[0] for x in os.walk(INPUT_DATA)] # 由于os.walk()列表第一个是‘./‘,所以排除 is_root_dir = True #<----- # 遍历各个label文件夹 for sub_dir in sub_dirs: if is_root_dir: #<----- is_root_dir = False continue extensions = [‘jpg‘, ‘jpeg‘, ‘JPG‘, ‘JPEG‘] file_list = [] dir_name = os.path.basename(sub_dir) # 遍历各个可能的文件尾缀 for extension in extensions: # file_glob = os.path.join(INPUT_DATA,dir_name,‘*.‘+extension) file_glob = os.path.join(sub_dir, ‘*.‘ + extension) file_list.extend(glob.glob(file_glob)) # 匹配并收集路径&文件名 # print(file_glob,‘\n‘,glob.glob(file_glob)) if not file_list: continue label_name = dir_name.lower() # 生成label,实际就是小写文件夹名 # 初始化各个路径&文件收集list training_images = [] testing_images = [] validation_images = [] # 去路径,只保留文件名 for file_name in file_list: base_name = os.path.basename(file_name) # 随机划分数据给验证和测试 chance = np.random.randint(100) if chance < validation_percentage: validation_images.append(base_name) elif chance < (validation_percentage + testing_percentage): testing_images.append(base_name) else: training_images.append(base_name) # 本标签字典项生成 result[label_name] = { ‘dir‘ : dir_name, ‘training‘ : training_images, ‘testing‘ : testing_images, ‘validation‘ : validation_images } return result def get_image_path(image_lists, image_dir, label_name, index, category): ‘‘‘ 获取单张图片的存储地址 :param image_lists: 全图片字典 :param image_dir: 外层文件夹(内部是标签文件夹) :param label_name: 标签名 :param index: 随机数索引 :param category: training or validation :return: 图片中间变量地址 ‘‘‘ label_lists = image_lists[label_name] category_list = label_lists[category] # 获取目标category图片列表 mod_index = index % len(category_list) # 随机获取一张图片的索引 base_name = category_list[mod_index] # 通过索引获取图片名 return os.path.join(image_dir,label_lists[‘dir‘],base_name) def get_random_cached_inputs(sess,n_class,image_lists,batch,category,INPUT_DATA,shape=[299,299]): ‘‘‘ 函数随机获取一个batch的图片作为训练数据,并调整大小至输入层大小 调用get_image_path :param sess: 会话句柄 :param n_class: 分类数目 :param image_lists: 图片字典 :param batch: batch大小 :param category: training or validation :param INPUT_DATA: 最外层图片文件夹 :param shape: 输入层size :return: image & label数组 ‘‘‘ images = [] labels = [] for i in range(batch): label_index = random.randrange(n_class) # 标签索引随机生成 label_name = list(image_lists.keys())[label_index] # 标签名获取 image_index = random.randrange(65536) # 标签内图片索引随机种子 image_path = get_image_path(image_lists, INPUT_DATA, label_name, image_index, category) image_raw = tf.gfile.FastGFile(image_path, ‘rb‘).read() image_data = sess.run(tf.image.resize_images(tf.image.decode_jpeg(image_raw), shape,method=random.randint(0,3))) ground_truth = np.zeros(n_class,dtype=np.float32) ground_truth[label_index] = 1.0 # 标准结果[0,0,1,0...] # 收集瓶颈张量和label images.append(image_data) labels.append(ground_truth) return images,labels def get_test_images(sess,image_lists,n_class,shape=[299,299]): ‘‘‘ 获取所有test数据 调用get_image_path :param sess: 会话句柄 :param image_lists: 图片字典 :param n_class: 分类数目 :param shape: 输入层size :return: ‘‘‘ test_images = [] ground_truths = [] label_name_list = list(image_lists.keys()) for label_index,label_name in enumerate(image_lists[label_name_list]): category = ‘testing‘ for image_index, unused_base_name in enumerate(image_lists[label_name][category]): # 索引, {文件名} image_path = get_image_path(image_lists, INPUT_DATA, label_name, image_index, category) image_raw = tf.gfile.FastGFile(image_path, ‘rb‘).read() image_data = sess.run(tf.image.resize_images(tf.image.decode_jpeg(image_raw), shape, method=random.randint(0, 3))) ground_truth = np.zeros(n_class, dtype=np.float32) ground_truth[label_index] = 1.0 test_images.append(image_data) ground_truths.append(ground_truth) return test_images, ground_truths if __name__==‘__main__‘: INPUT_DATA = ‘./flower_photos‘ # 数据文件夹 VALIDATION_PERCENTAGE = 10 # 验证用数据百分比 TEST_PERCENTAGE = 10 # 测试用数据百分比 BATCH_SIZE = 128 # 数据包大小 INPUT_SIZE = [224, 224] # 标准输入尺寸 image_dict = creat_image_lists(VALIDATION_PERCENTAGE,TEST_PERCENTAGE,INPUT_DATA) n_class = len(image_dict.keys()) sess = tf.Session() category = ‘training‘ image_list, label_list = get_random_cached_inputs( sess, n_class, image_dict, BATCH_SIZE, category,INPUT_DATA,INPUT_SIZE) # exit()
训练部分(save&restore添加,可视化添加):
import AlexNet_FCN as Net import tensorflow as tf import image_info as img_io import random ‘‘‘训练参数‘‘‘ INPUT_DATA = ‘./flower_photos‘ # 数据文件夹 VALIDATION_PERCENTAGE = 10 # 验证用数据百分比 TEST_PERCENTAGE = 10 # 测试用数据百分比 BATCH_SIZE = 128 # 数据包大小 INPUT_SIZE = [224, 224] # 标准输入尺寸 MAX_STEP = 5000 # 最大迭代轮数 def loss(logits, labels): """ Add L2Loss to all the trainable variables. Args: logits: Logits from inference(). labels: Labels from distorted_inputs or inputs(). 1-D tensor of shape [batch_size] Returns: Loss tensor of type float. """ cross_entropy_mean = tf.reduce_mean( tf.nn.sparse_softmax_cross_entropy_with_logits( labels=tf.argmax(labels,1), logits=logits), name=‘cross_entropy‘) tf.add_to_collection(‘losses‘, cross_entropy_mean) return tf.add_n(tf.get_collection(‘losses‘), name=‘total_loss‘) if __name__==‘__main__‘: image_dict = img_io.creat_image_lists(VALIDATION_PERCENTAGE, TEST_PERCENTAGE, INPUT_DATA) n_class = len(image_dict.keys()) image_holder = tf.placeholder(tf.float32,[BATCH_SIZE, INPUT_SIZE[0], INPUT_SIZE[1], 3]) label_holder = tf.placeholder(tf.float32,[BATCH_SIZE, n_class]) # 正则化函数选择并向前传播 regularizer = tf.contrib.layers.l2_regularizer(0.0001) logits = Net.inference(image_holder, regularizer, n_class) # loss计算并反向传播 # loss = loss(logits, label_holder) loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(labels=tf.argmax(label_holder,1),logits=logits)) tf.summary.scalar(‘loss‘,loss) train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss) # 正确率计算 with tf.name_scope(‘evaluation‘): correct_prediction = tf.equal(tf.argmax(logits,1),tf.argmax(label_holder,1)) evaluation_step = tf.reduce_mean(tf.cast(correct_prediction,tf.float32)) tf.summary.scalar(‘accuracy‘,evaluation_step) test = tf.argmax(logits,1) with tf.Session() as sess: # 确保在变量生成在最后 init = tf.global_variables_initializer().run() # 保存变量 saver = tf.train.Saver() # 收集可视化记录 merge = tf.summary.merge_all() # 日志书写器 & 默认已经加载图 writer = tf.summary.FileWriter(‘./logs‘,sess.graph) print(image_holder.name) for step in range(MAX_STEP): print(step) # 训练过程 image_batch, label_batch = img_io.get_random_cached_inputs( sess, n_class, image_dict, BATCH_SIZE, ‘training‘, INPUT_DATA, INPUT_SIZE) sess.run(train_step,feed_dict={ image_holder:image_batch,label_holder:label_batch}) # print(sess.run(logits, feed_dict={ # image_holder: image_batch, label_holder: label_batch})) # print(sess.run(‘fc1:0‘, feed_dict={ # image_holder: image_batch, label_holder: label_batch})[random.randint(1,128)]) # print(sess.run(_, feed_dict={image_holder: image_batch, label_holder: label_batch})) # 验证过程 if True:#(step % 3 == 0) or (step + 1 == MAX_STEP): image_batch_val, label_batch_val = img_io.get_random_cached_inputs( sess, n_class, image_dict, BATCH_SIZE, ‘validation‘, INPUT_DATA, INPUT_SIZE) validation_accuracy = sess.run(evaluation_step, feed_dict={ image_holder:image_batch_val,label_holder:label_batch_val}) print(‘Step %d: Validation accuracy on random sampled %d examples = %.1f%%‘ % (step, BATCH_SIZE, validation_accuracy * 100)) #print(‘fc1:\n‘, sess.run(‘fc1_conv:0‘, feed_dict={ # image_holder: image_batch_val, label_holder: label_batch_val})) #print(‘fc2:\n‘, sess.run(‘fc2_conv:0‘, feed_dict={ # image_holder: image_batch_val, label_holder: label_batch_val})) print(‘fc3:\n‘,sess.run(test, feed_dict={ image_holder: image_batch_val, label_holder: label_batch_val})) # 保存模型 if (step % 10 == 0) or (step + 1 == MAX_STEP) or step == 1: saver.save(sess,‘./model/model.ckpt‘,global_step=step) # 可视化 if (step % 100 == 0) or (step + 1 == MAX_STEP): result = sess.run(merge,feed_dict={image_holder:image_batch,label_holder:label_batch}) writer.add_summary(result,step) # 测试过程 image_batch_test, label_batch_test = img_io.get_test_images(sess,image_dict,n_class,INPUT_SIZE) test_accuracy = sess.run(evaluation_step, feed_dict={ image_holder: image_batch_test, label_holder: label_batch_test}) print(‘Final test accuracy = %.1f%%‘ % (test_accuracy * 100))
『TensorFlow』徒手装高达_初号机大改_全模组升级版
标签:restore exp code optimizer 路径 save inf div on()
原文地址:http://www.cnblogs.com/hellcat/p/6936322.html