transfer

# -*- coding: utf-8 -*-
"""
Created on Mon Nov 26 09:49:26 2018

@author: chsl-dxq
"""

import tensorflow as tf

#curl http://download.tensorflow.org/example_images/flower_photos.tgz
#tar xzf flower_photos.tgz

#wget https://storage.googleapis.com/download.tensorflow.org/models/\inception_dec_2015.zip
#unzip tensorflow/examples/label_image/data/inception_dec_2015.zip

import glob
import os.path
import random
import numpy as np
from tensorflow.python.platform import gfile

BOTTLENECT_TENSOR_SIZE=2048

BOTTLENECT_TENSOR_NAME='pool_3/_reshape:0'

JPEG_DATA_TENSOR_NAME='DecodeJpeg/contents:0'

MODEL_DIR='C:\\Users\\chsl-dxq\\.spyder-py3\\inception_v3'

MODEL_FILE='tensorflow_inception_graph.pb'

CACHE_DIR='C:\\Users\\chsl-dxq\\.spyder-py3\\inception_v3'

INPUT_DATA='C:\\Users\\chsl-dxq\\.spyder-py3\\flower_photos'

VALIDATION_PERCENTAGE=10

TEST_PERCENTAGE=10

LEARNING_RATE=0.01
STEPS=4000
BATCH=100

def create_image_lists(testing_percentage,validation_percentage):
    result={}
    sub_dirs=[x[0] for x in os.walk(INPUT_DATA)]
    is_root_dir=True
    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_list.extend(glob.glob(file_glob))
        if not file_list:
            continue
        
        label_name=dir_name.lower()
        traing_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<(testing_percentage+validation_percentage):
                testing_images.append(base_name)
            else:
                traing_images.append(base_name)
                
        result[label_name]={
                'dir':dir_name,
                'training':traing_images,
                'testing':testing_images,
                'validation':validation_images}
        
    return result


def get_image_path(image_lists,image_dir,label_name,index,category):
    label_lists=image_lists[label_name]
    category_list=label_lists[category]
    mod_index=index%len(category_list)
    base_name=category_list[mod_index]
    sub_dir=label_lists['dir']
    full_path=os.path.join(image_dir,sub_dir,base_name)
    return full_path
                    

def get_bottleneck_path(image_lists,label_name,index,category):
    return get_image_path(image_lists,CACHE_DIR,label_name,index,category)+'.txt'


def run_bottleneck_on_image(sess,image_data,image_data_tensor,bottleneck_tensor):
    bottleneck_values=sess.run(bottleneck_tensor,{image_data_tensor:image_data})
    bottleneck_values=np.squeeze(bottleneck_values)
    return bottleneck_values
    
def get_or_create_bottleneck(sess,image_lists,label_name,index,
                             category,jpeg_data_tensor,bottleneck_tensor):
    label_lists=image_lists[label_name]
    sub_dir=label_lists['dir']
    sub_dir_path=os.path.join(CACHE_DIR,sub_dir)
    if not os.path.exists(sub_dir_path): os.makedirs(sub_dir_path)
    bottleneck_path=get_bottleneck_path(image_lists,label_name,index,category)
    
    if not os.path.exists(bottleneck_path):
        image_path=get_image_path(image_lists,INPUT_DATA,label_name,index,category)
        image_data=gfile.FastGFile(image_path,'rb').read()
        bottleneck_values=run_bottleneck_on_image(sess,image_data,jpeg_data_tensor,
                                                  bottleneck_tensor)
        bottleneck_string=','.join(str(x) for x in bottleneck_values)
        with open(bottleneck_path,'w') as bottleneck_file:
            bottleneck_file.write(bottleneck_string)
    else:
        with open(bottleneck_path,'r') as bottleneck_file:
            bottleneck_string=bottleneck_file.read()
        bottleneck_values=[float(x) for x in bottleneck_string.split(',')]
        
    return bottleneck_values

def get_random_cached_bottlenecks(sess,n_classes,image_lists,how_many,category,
                                  jpeg_data_tensor,bottleneck_tensor):
    bottlenecks=[]
    ground_truths=[]
    for _ in range(how_many):
        label_index=random.randrange(n_classes)
        label_name=list(image_lists.keys())[label_index]
        image_index=random.randrange(65536)
        bottleneck=get_or_create_bottleneck(
                sess,image_lists,label_name,image_index,category,jpeg_data_tensor,
                bottleneck_tensor)
        ground_truth=np.zeros(n_classes,dtype=np.float32)
        ground_truth[label_index]=1.0
        bottlenecks.append(bottleneck)
        ground_truths.append(ground_truth)
        
    return bottlenecks,ground_truths

def get_test_bottlenecks(sess,image_lists,n_classes,jpeg_data_tensor,bottleneck_tensor):
    bottlenecks=[]
    ground_truths=[]
    label_name_list=list(image_lists.keys())
    for label_index,label_name in enumerate(label_name_list):
        category='testing'
        for index,unused_base_name in enumerate(image_lists[label_name][category]):
            bottleneck=get_or_create_bottleneck(sess,image_lists,label_name,index,
                                                category,jpeg_data_tensor,bottleneck_tensor)
            ground_truth=np.zeros(n_classes,dtype=np.float32)
            ground_truth[label_index]=1.0
            bottlenecks.append(bottleneck)
            ground_truths.append(ground_truth)
            
    return bottlenecks,ground_truths

def main():
    image_lists=create_image_lists(TEST_PERCENTAGE,VALIDATION_PERCENTAGE)
    n_classes=len(image_lists.keys())
    with gfile.FastGFile(os.path.join(MODEL_DIR,MODEL_FILE),'rb') as f:
        graph_def=tf.GraphDef()
        graph_def.ParseFromString(f.read())
        
    bottleneck_tensor,jpeg_data_tensor=tf.import_graph_def(
            graph_def,return_elements=[BOTTLENECT_TENSOR_NAME,JPEG_DATA_TENSOR_NAME])
    
    bottleneck_input=tf.placeholder(tf.float32,[None,BOTTLENECT_TENSOR_SIZE],
                                    name='BottleneckInputPlaceholder')
    ground_truth_input=tf.placeholder(tf.float32,[None,n_classes],name='GroundTruthInput')
    
    with tf.name_scope('final_training_ops'):
        weights=tf.Variable(tf.truncated_normal([BOTTLENECT_TENSOR_SIZE,n_classes],
                                                stddev=0.001))
        biases=tf.Variable(tf.zeros([n_classes]))
        logits=tf.matmul(bottleneck_input,weights)+biases
        final_tensor=tf.nn.softmax(logits)
        
    cross_entropy=tf.nn.softmax_cross_entropy_with_logits(logits=logits,labels=ground_truth_input)
    cross_entropy_mean=tf.reduce_mean(cross_entropy)
    train_step=tf.train.GradientDescentOptimizer(LEARNING_RATE).minimize(cross_entropy_mean)
    
    #计算正确率
    with tf.name_scope('evaluation'):
        correct_prediction=tf.equal(tf.argmax(final_tensor,1),tf.argmax(ground_truth_input,1))
        evaluation_step=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
        
    with tf.Session() as sess:
        init=tf.initialize_all_variables()
        sess.run(init)
        
        for i in range(STEPS):
            print(i)
            train_bottlenecks,train_ground_truth=get_random_cached_bottlenecks(
                    sess,n_classes,image_lists,BATCH,'training',jpeg_data_tensor,
                    bottleneck_tensor)
            
            sess.run(train_step,feed_dict={bottleneck_input:train_bottlenecks,
                                           ground_truth_input:train_ground_truth})
            
            if i%100==0 or i+1==STEPS:
                validation_bottlenecks,validation_ground_truth=get_random_cached_bottlenecks(
                        sess,n_classes,image_lists,BATCH,'validation',jpeg_data_tensor,
                        bottleneck_tensor)
                validation_accuracy=sess.run(
                        evaluation_step,feed_dict={
                                bottleneck_input:validation_bottlenecks,
                                ground_truth_input:validation_ground_truth})
                print('step %d: validation accuracy on random samples %d examples=%.1f%%' %
                      (i,BATCH,validation_accuracy*100))
                
        test_bottlenecks,test_ground_truth=get_test_bottlenecks(
                sess,image_lists,n_classes,jpeg_data_tensor,bottleneck_tensor)
        
        test_accuracy=sess.run(evaluation_step,feed_dict={
                bottleneck_input:test_bottlenecks,
                ground_truth_input:test_ground_truth})
            
        print('Final test accuracy=%.1f%%' % (test_accuracy*100))
        


main()
                
    
    
    
    


        







tfrecord
# -*- coding: utf-8 -*-
"""
Created on Wed Nov 28 18:50:42 2018

@author: chsl-dxq
"""

#TFRecod

import numpy as np
import tensorflow as tf
from tensorflow.contrib import slim
from tensorflow.examples.tutorials.mnist import input_data

def make_example(image, label):
    return tf.train.Example(features=tf.train.Features(feature={
        'image' : tf.train.Feature(bytes_list=tf.train.BytesList(value=[image])),
        'label' : tf.train.Feature(bytes_list=tf.train.BytesList(value=[label]))
    }))

def write_tfrecord(images, labels, filename):
    writer = tf.python_io.TFRecordWriter(filename)
    for image, label in zip(images, labels):
        labels = labels.astype(np.float32)
        ex = make_example(image.tobytes(), label.tobytes())
        writer.write(ex.SerializeToString())
    writer.close()

def main():
    fashion_mnist = input_data.read_data_sets('fashion', one_hot=True)
    train_images  = fashion_mnist.train.images
    train_labels  = fashion_mnist.train.labels
    test_images   = fashion_mnist.test.images
    test_labels   = fashion_mnist.test.labels
    write_tfrecord(train_images, train_labels, 'fashion_mnist_train.tfrecord')
    write_tfrecord(test_images, test_labels, 'fashion_mnist_test.tfrecord')



def read_tfrecord(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={
            'image': tf.FixedLenFeature([], tf.string),
            'label': tf.FixedLenFeature([], tf.string)
        })

    image = tf.decode_raw(features['image'], tf.float32)
    label = tf.decode_raw(features['label'], tf.float64)

    image = tf.reshape(image, [28, 28, 1])
    label = tf.reshape(label, [10])

    image, label = tf.train.batch([image, label],
            batch_size=16,
            capacity=500)

    return image, label


def model(image, label):
    net = slim.conv2d(image, 48, [5,5], scope='conv1')
    net = slim.max_pool2d(net, [2,2], scope='pool1')
    net = slim.conv2d(net, 96, [5,5], scope='conv2')
    net = slim.max_pool2d(net, [2,2], scope='pool2')
    net = slim.flatten(net, scope='flatten')
    net = slim.fully_connected(net, 512, scope='fully_connected1')
    logits = slim.fully_connected(net, 10,
            activation_fn=None, scope='fully_connected2')

    prob = slim.softmax(logits)
    loss = slim.losses.softmax_cross_entropy(logits, label)

    train_op = slim.optimize_loss(loss, slim.get_global_step(),
            learning_rate=0.001,
            optimizer='Adam')

    return train_op

def main():
    train_images, train_labels =read_tfrecord('data/fashion_mnist_train.tfrecord')
    train_op = model(train_images, train_labels)

    step = 0
    with tf.Session() as sess:
        init_op = tf.group(
            tf.local_variables_initializer(),
            tf.global_variables_initializer())
        sess.run(init_op)
        coord = tf.train.Coordinator()
        threads = tf.train.start_queue_runners(sess=sess, coord=coord)
        while step < 3000:
            sess.run([train_op])

            if step % 100 == 0:
                print('step: {}'.format(step))

            step += 1

        coord.request_stop()
        coord.join(threads)

if __name__ == '__main__':
    main()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值