91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在Python中利用TensorFlow卷積神經網絡實現貓狗識別

發布時間:2021-06-02 17:15:57 來源:億速云 閱讀:165 作者:Leah 欄目:開發技術

怎么在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卷積神經網絡實現貓狗識別的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

高唐县| 双桥区| 宜章县| 中阳县| 大悟县| 五台县| 泰顺县| 南和县| 晋宁县| 蒙阴县| 阿图什市| 阳江市| 通辽市| 丘北县| 浑源县| 枣阳市| 大城县| 宿州市| 乐安县| 万宁市| 镇雄县| 称多县| 凌海市| 岳西县| 江山市| 桐柏县| 栾川县| 神农架林区| 枣强县| 达尔| 水城县| 绵竹市| 乐安县| 孙吴县| 石泉县| 昌都县| 临湘市| 晋州市| 兴文县| 托克逊县| 彭山县|