Tensorflow 实现二分类

     刚刚开始接触TensorFlow,在网上找到一个老师的视频教学,关于利用简单的网络结构实现二分类,也就是猫狗大战的例子。于是对着视屏,自己做了如下的记录。如果有什么地方错误,欢迎大神指点!!!

1.准备数据集。https://www.kaggle.com/c/dogs-vs-cats   在Kaggle的官网上可以下载,如果想直接要数据的童鞋,可以私信我,我发给你,也是可以的。

2.程序结构如图:

Tensorflow 实现二分类_第1张图片

3.下面就是关键代码:

input_data.py:

import tensorflow as tf
import numpy as np
import os

img_width=208
img_height=208
#train_dir='G:/PycharmProjects/untitled2/data/train/'
def get_files(file_dir):
    cats=[]
    label_cats=[]
    dogs=[]
    label_dogs=[]
    for file in os.listdir(file_dir):
        name=file.split(sep='.')#文件是cat.1.jpg形式
        if name[0]=='cat':
            cats.append(file_dir+file)
            label_cats.append(0)
        else:
            dogs.append(file_dir+file)
            label_dogs.append(1)
    image_list=np.hstack((cats,dogs))
    label_list=np.hstack((label_cats,label_dogs))
    temp=np.array([image_list,label_list])
    temp=temp.transpose()
    np.random.shuffle(temp)#打乱顺序

    image_list=list(temp[:,0])
    label_list=list(temp[:,1])
    label_list=[int(i) for i in label_list]

    return image_list,label_list
# 生成相同大小的批次
def get_batch(image,label,image_w,image_h,batch_size,capacity):
    image=tf.cast(image,tf.string)
    label=tf.cast(label,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)  #解码jpg图片


    image=tf.image.resize_image_with_crop_or_pad(image,image_w,image_h) #图片过大  从中间裁剪
    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)


   # image_batch,label_batch=tf.train.shuffle_batch([image,label],batch_size=batch_size,num_threads=64,capacity=capacity,min_after_dequeue=capacity-1)#由于前面打乱顺序,这个地方不需要打乱顺序

    label_batch=tf.reshape(label_batch,[batch_size])
    return  image_batch,label_batch


#test
import matplotlib.pyplot as plt

BATCH_SIZE=2
CAPACITY=256
IMG_W=208
IMG_H=208
train_dir='G:/PycharmProjects/untitled2/data/train/'

image_list,label_list=get_files(train_dir)

image_batch,label_batch=get_batch(image_list,label_list,IMG_W,IMG_H,BATCH_SIZE,CAPACITY)

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])

            for j in np.arange(BATCH_SIZE):
                print('label:%d' %label[j])
                plt.imshow(img[j,:,:,:])
                plt.show()
            i+=1

    except tf.errors.OutOfRangeError:
        print('done')
    finally:
        coord.request_stop()
    coord.join(threads)

4.model:

import tensorflow as tf


def inference(images, batch_size, n_classes):
    with tf.variable_scope('conv1') as scope:
        weights = tf.get_variable('weights',shape=[3, 3, 3, 16],
                                  dtype=tf.float32,initializer=tf.truncated_normal_initializer(stddev=0.1,dtype=tf.float32))

        biases = tf.get_variable('biases',shape=[16],dtype=tf.float32,initializer=tf.constant_initializer(0.1))
        conv = tf.nn.conv2d(images, weights, [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,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, 16, 16],
                                  dtype=tf.float32,initializer=tf.truncated_normal_initializer(stddev=0.1, dtype=tf.float32))
        biases = tf.get_variable('biases', shape=[16],dtype=tf.float32,initializer=tf.constant_initializer(0.1))
        conv = tf.nn.conv2d(norm1, weights, [1, 1, 1, 1], padding='SAME')
        pre_activation = tf.nn.bias_add(conv, biases)
        conv2 = tf.nn.relu(pre_activation, name='conv2')

    # norm2
    with tf.variable_scope('pooling2_lrn') as scope:
        norm2 = tf.nn.lrn(conv2, 4, bias=1.0, alpha=0.001 / 9.0, beta=0.75,name='norm2')
        # pool2
        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,128],
                                  dtype=tf.float32,
                                  initializer=tf.truncated_normal_initializer(stddev=0.005, dtype=tf.float32))
        biases = tf.get_variable('biases',shape=[128],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=[128, 128],
                                  dtype=tf.float32,
                                  initializer=tf.truncated_normal_initializer(stddev=0.005, dtype=tf.float32))
        biases = tf.get_variable('biases',shape=[128],dtype=tf.float32,initializer=tf.constant_initializer(0.1))
        local4 = tf.nn.relu(tf.matmul(local3, weights) + biases, name='local4')

    # softmax, i.e. softmax(WX + b)
    with tf.variable_scope('softmax_linear') as scope:
        weights = tf.get_variable('softmax_linear', shape=[128, n_classes],
                                  dtype=tf.float32,
                                  initializer=tf.truncated_normal_initializer(stddev=0.005, dtype=tf.float32))
        biases = tf.get_variable('biases',shape=[n_classes],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 loss(logits, labels):
    with tf.variable_scope('loss') as scope:
        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

def trainning(loss,learning_reate):
    with tf.variable_scope('optimizer') as scope:
        optimizer=tf.train.AdamOptimizer(learning_rate=learning_reate)#优化算法
        global_step=tf.Variable(0,name='global_step',trainable=False)
        train_op=optimizer.minimize(loss,global_step=global_step)
    return train_op

def evaluation(logits,labels):
    with tf.variable_scope('accuracy') as scope:
        correct = tf.nn.in_top_k(logits,labels, 1)
        correct=tf.cast(correct,tf.float16)
        accuracy=tf.reduce_mean(correct)
        tf.summary.scalar(scope.name+'/accuracy',accuracy)
    return accuracy

6.training

import os
import numpy as np
import  tensorflow as tf
import module
import input_data



N_CLASSES=2
IMG_W=150
IMG_H=150
BATCH_SIZE=16
CAPACITY=2000
MAX_STEP=15000
learning_rate=0.0001

def run_training():
    train_dir='G:/PycharmProjects/untitled2/data/train/'
    logs_train_dir='G:/PycharmProjects/untitled2/logs/train/'
    train,train_label=input_data.get_files(train_dir)
    train_batch,train_label_batch=input_data.get_batch(train,train_label,IMG_W,IMG_H,BATCH_SIZE,CAPACITY)

    train_logits=module.inference(train_batch,BATCH_SIZE,N_CLASSES)
    train_loss=module.loss(train_logits,train_label_batch)
    train_op=module.trainning(train_loss,learning_rate)
    train_acc=module.evaluation(train_logits,train_label_batch)

    summary_op=tf.summary.merge_all()
    sess=tf.Session()
    train_writer=tf.summary.FileWriter(logs_train_dir,sess.graph)
    saver=tf.train.Saver()
   # with tf.Session() as sess:
     #   sess.run(tf.initialize_all_variables())
        # 定义保存路径
      #  save_path = saver.save(sess, "G:/PycharmProjects/untitled2/savemodel/save_test.ckpt")
       # print("Save to path: ", save_path)

    sess.run(tf.global_variables_initializer())
    coord=tf.train.Coordinator()
    threads=tf.train.start_queue_runners(sess=sess,coord=coord)

    try:
        for step in np.arange(MAX_STEP):
            if coord.should_stop():
                break
            _,tra_loss,tra_acc=sess.run([train_op,train_loss,train_acc])
            if step % 50==0:#每50显示
                #tra_loss=float(tra_loss)
                #tra_acc=float(tra_acc)
                print ('step %d,train loss=%.2f,train accuracy =%.2f%%'% (step,tra_loss,train_acc))
                summary_str=sess.run(summary_op)
                train_writer.add_summary(summary_str,step)
            if step %2000==0 or (step+1)==MAX_STEP:
                checkpoint_path=os.path.join(logs_train_dir,'model.ckpt')
                saver.save(sess,checkpoint_path,global_step=step)
    except tf.errors.OutOfRangeError:
        print('epoch limit reached')

    finally:
        coord.request_stop()

    coord.join(threads)
    sess.close()


#test

#run_training()


你可能感兴趣的:(TensorFlow)