您好,登錄后才能下訂單哦!
怎么在Python中利用TensorFlow卷積神經網絡實現貓狗識別?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
1. 數據處理
將圖片數據處理為 tf 能夠識別的數據格式,并將數據設計批次。
第一步get_files()
方法讀取圖片,然后根據圖片名,添加貓狗 label,然后再將 image和label 放到 數組中,打亂順序返回
將第一步處理好的圖片 和label 數組 轉化為 tensorflow 能夠識別的格式,然后將圖片裁剪和補充進行標準化處理,分批次返回。
新建數據處理文件 ,文件名 input_data.py
import tensorflow as tf import os import numpy as np def get_files(file_dir): cats = [] label_cats = [] dogs = [] label_dogs = [] for file in os.listdir(file_dir): name = file.split(sep='.') if 'cat' in name[0]: cats.append(file_dir + file) label_cats.append(0) else: if 'dog' in name[0]: dogs.append(file_dir + file) label_dogs.append(1) image_list = np.hstack((cats,dogs)) label_list = np.hstack((label_cats,label_dogs)) # print('There are %d cats\nThere are %d dogs' %(len(cats), len(dogs))) # 多個種類分別的時候需要把多個種類放在一起,打亂順序,這里不需要 # 把標簽和圖片都放倒一個 temp 中 然后打亂順序,然后取出來 temp = np.array([image_list,label_list]) temp = temp.transpose() # 打亂順序 np.random.shuffle(temp) # 取出第一個元素作為 image 第二個元素作為 label image_list = list(temp[:,0]) label_list = list(temp[:,1]) label_list = [int(i) for i in label_list] return image_list,label_list # 測試 get_files # imgs , label = get_files('/Users/yangyibo/GitWork/pythonLean/AI/貓狗識別/testImg/') # for i in imgs: # print("img:",i) # for i in label: # print('label:',i) # 測試 get_files end # image_W ,image_H 指定圖片大小,batch_size 每批讀取的個數 ,capacity隊列中 最多容納元素的個數 def get_batch(image,label,image_W,image_H,batch_size,capacity): # 轉換數據為 ts 能識別的格式 image = tf.cast(image,tf.string) label = tf.cast(label, tf.int32) # 將image 和 label 放倒隊列里 input_queue = tf.train.slice_input_producer([image,label]) label = input_queue[1] # 讀取圖片的全部信息 image_contents = tf.read_file(input_queue[0]) # 把圖片解碼,channels =3 為彩色圖片, r,g ,b 黑白圖片為 1 ,也可以理解為圖片的厚度 image = tf.image.decode_jpeg(image_contents,channels =3) # 將圖片以圖片中心進行裁剪或者擴充為 指定的image_W,image_H image = tf.image.resize_image_with_crop_or_pad(image, image_W, image_H) # 對數據進行標準化,標準化,就是減去它的均值,除以他的方差 image = tf.image.per_image_standardization(image) # 生成批次 num_threads 有多少個線程根據電腦配置設置 capacity 隊列中 最多容納圖片的個數 tf.train.shuffle_batch 打亂順序, image_batch, label_batch = tf.train.batch([image, label],batch_size = batch_size, num_threads = 64, capacity = capacity) # 重新定義下 label_batch 的形狀 label_batch = tf.reshape(label_batch , [batch_size]) # 轉化圖片 image_batch = tf.cast(image_batch,tf.float32) return image_batch, label_batch # test get_batch # import matplotlib.pyplot as plt # BATCH_SIZE = 2 # CAPACITY = 256 # IMG_W = 208 # IMG_H = 208 # train_dir = '/Users/yangyibo/GitWork/pythonLean/AI/貓狗識別/testImg/' # 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 # # Coordinator 和 start_queue_runners 監控 queue 的狀態,不停的入隊出隊 # coord = tf.train.Coordinator() # threads = tf.train.start_queue_runners(coord=coord) # # coord.should_stop() 返回 true 時也就是 數據讀完了應該調用 coord.request_stop() # 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]) # # 因為是個4D 的數據所以第一個為 索引 其他的為冒號就行了 # plt.imshow(img[j,:,:,:]) # plt.show() # i+=1 # # 隊列中沒有數據 # except tf.errors.OutOfRangeError: # print('done!') # finally: # coord.request_stop() # coord.join(threads) # sess.close()
2. 設計神經網絡
利用卷積神經網路處理,網絡結構為
# conv1 卷積層 1 # pooling1_lrn 池化層 1 # conv2 卷積層 2 # pooling2_lrn 池化層 2 # local3 全連接層 1 # local4 全連接層 2 # softmax 全連接層 3
新建神經網絡文件 ,文件名 model.py
#coding=utf-8 import tensorflow as tf def inference(images, batch_size, n_classes): with tf.variable_scope('conv1') as scope: # 卷積盒的為 3*3 的卷積盒,圖片厚度是3,輸出是16個featuremap 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, strides=[1, 1, 1, 1], padding='SAME') pre_activation = tf.nn.bias_add(conv, biases) conv1 = tf.nn.relu(pre_activation, name=scope.name) 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') 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, 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') 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 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 losses(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_rate): with tf.name_scope('optimizer'): optimizer = tf.train.AdamOptimizer(learning_rate= learning_rate) 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
3. 訓練數據,并將訓練的模型存儲
import os import numpy as np import tensorflow as tf import input_data import model N_CLASSES = 2 # 2個輸出神經元,[1,0] 或者 [0,1]貓和狗的概率 IMG_W = 208 # 重新定義圖片的大小,圖片如果過大則訓練比較慢 IMG_H = 208 BATCH_SIZE = 32 #每批數據的大小 CAPACITY = 256 MAX_STEP = 15000 # 訓練的步數,應當 >= 10000 learning_rate = 0.0001 # 學習率,建議剛開始的 learning_rate <= 0.0001 def run_training(): # 數據集 train_dir = '/Users/yangyibo/GitWork/pythonLean/AI/貓狗識別/img/' #My dir--20170727-csq #logs_train_dir 存放訓練模型的過程的數據,在tensorboard 中查看 logs_train_dir = '/Users/yangyibo/GitWork/pythonLean/AI/貓狗識別/saveNet/' # 獲取圖片和標簽集 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 = model.inference(train_batch, BATCH_SIZE, N_CLASSES) # 獲取 loss train_loss = model.losses(train_logits, train_label_batch) # 訓練 train_op = model.trainning(train_loss, learning_rate) # 獲取準確率 train__acc = model.evaluation(train_logits, train_label_batch) # 合并 summary summary_op = tf.summary.merge_all() sess = tf.Session() # 保存summary train_writer = tf.summary.FileWriter(logs_train_dir, sess.graph) saver = tf.train.Saver() 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: print('Step %d, train loss = %.2f, train accuracy = %.2f%%' %(step, tra_loss, tra_acc*100.0)) summary_str = sess.run(summary_op) train_writer.add_summary(summary_str, step) if step % 2000 == 0 or (step + 1) == MAX_STEP: # 每隔2000步保存一下模型,模型保存在 checkpoint_path 中 checkpoint_path = os.path.join(logs_train_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() # train run_training()
看完上述內容,你們掌握怎么在Python中利用TensorFlow卷積神經網絡實現貓狗識別的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。