国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python通過TensorFlow卷積神經網絡實現貓狗識別

2020-01-04 13:37:02
字體:
來源:轉載
供稿:網友

這份數據集來源于Kaggle,數據集有12500只貓和12500只狗。在這里簡單介紹下整體思路

  1. 處理數據
  2. 設計神經網絡
  3. 進行訓練測試

1. 數據處理

將圖片數據處理為 tf 能夠識別的數據格式,并將數據設計批次。

  • 第一步get_files() 方法讀取圖片,然后根據圖片名,添加貓狗 label,然后再將 image和label 放到 數組中,打亂順序返回
  • 將第一步處理好的圖片 和label 數組 轉化為 tensorflow 能夠識別的格式,然后將圖片裁剪和補充進行標準化處理,分批次返回。

新建數據處理文件 ,文件名 input_data.py

import tensorflow as tfimport os import numpy as npdef 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 # 訓練的步數,應當 >= 10000learning_rate = 0.0001 # 學習率,建議剛開始的 learning_rate <= 0.0001def 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() # trainrun_training()

關于保存的模型怎么使用將在下一篇文章中展示。

如果需要訓練數據集可以評論留下聯系方式。

原文完整代碼地址:

https://github.com/527515025/My-TensorFlow-tutorials/tree/master/貓狗識別

歡迎 star 歡迎提問。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到python教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 临清市| 阿图什市| 崇仁县| 镇平县| 库尔勒市| 内黄县| 玉田县| 永德县| 宜城市| 博湖县| 甘南县| 巩留县| 大港区| 深泽县| 芦山县| 尼勒克县| 西畴县| 盱眙县| 和林格尔县| 会理县| 海门市| 全椒县| 开远市| 肥乡县| 临澧县| 科技| 清远市| 和田市| 双牌县| 广丰县| 安泽县| 陈巴尔虎旗| 扬州市| 仁布县| 普格县| 九龙城区| 西林县| 石首市| 大埔县| 神木县| 新绛县|