日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

TensorFlow基于cifar10数据集实现进阶的卷积网络

發布時間:2025/3/21 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TensorFlow基于cifar10数据集实现进阶的卷积网络 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

TensorFlow基于cifar10數據集實現進階的卷積網絡

  • 學習鏈接
  • CIFAR10模型及數據集介紹
    • 綜述
    • CIFAR10數據集介紹
    • CIFAR10數據集可視化
    • CIFAR10模型
  • CIFAR10代碼

學習鏈接

https://github.com/tensorflow/models/tree/master/tutorials/image/cifar10
http://www.cs.toronto.edu/~kriz/cifar.html
http://blog.csdn.net/diligent_321/article/details/53130913
http://blog.csdn.net/diligent_321/article/details/53008840
http://blog.csdn.net/barry_j/article/details/79158017
http://blog.csdn.net/yangdashi888/article/details/77918311

CIFAR10模型及數據集介紹

綜述

Cifar-10 是由Hinton 的兩個大弟子 Alex Krizhevsky、Ilya Sutskever 收集的一個用于普適物體識別的數據集。Cifar 是加拿大政府牽頭投資的一個先進科學項目研究所。Hinton、Bengio和他的學生在2004年拿到了 Cifar 投資的少量資金,建立了神經計算和自適應感知項目。這個項目結集了不少計算機科學家、生物學家、電氣工程師、神經科學家、物理學家、心理學家,加速推動了 Deep Learning 的進程。從這個陣容來看,DL 已經和 ML 系的數據挖掘分的很遠了。Deep Learning 強調的是自適應感知和人工智能,是計算機與神經科學交叉;Data Mining 強調的是高速、大數據、統計數學分析,是計算機和數學的交叉。

CIFAR-10是機器學習分類問題中的一個標尺問題。目標是將RGB 32*32的圖像分成10類:飛機(airplane),汽車(automobile),鳥(bird),貓(cat),鹿(deer),狗(dog),青蛙(frog),馬(horse),船(ship),卡車(truck)。

可以看到,同已經成熟的人臉識別相比,普適物體識別挑戰巨大,數據中含有大量特征、噪聲,識別物體比例不一。因而,Cifar-10 相對于傳統圖像識別數據集,是相當有挑戰的。想了解更多信息請參考CIFAR-10 page,以及 Alex Krizhevsky 的技術報告。

學習CIFAR-10模型的用處

  • 強調了網絡結構、訓練和評估的規范組織方式。
  • 提供了構建更大和更精細的模型的模板。

選擇CIFAR-10的原因:

  • 它足夠復雜,可以訓練TensorFlow的大規模模型的大部分能力;
  • 它足夠小,可以快速訓練,這對于嘗試新想法和實驗新技術是理想的。

CIFAR-10模型在TensorFlow中設計更大和更精細的模型了展示幾個重要構想:
核心數學元素包括:

  • 卷積
  • 激活函數ReLu
  • 池化max-pooling
  • 標準化local response normalization

可視化(visualization)訓練過程中的網絡激活(network activities),包含圖像輸入,損失函數,激活值和梯度的分布。
計算學習參數的移動平均(moving average),使用移動平均法提升預測效果。
實現隨時間下降的學習率(learning rate)。
對輸入數據預提取隊列(queues),讓模型從硬盤延遲和圖像預處理中獨立出來。
也提供了多GPU版本,暫時忽略。

正則化:防止過擬合,提高泛化能力
在機器學習中,不管是分類還是回歸,都可能因特征過多而產生過擬合,一般可以通過減少特征或者懲罰不重要特征的權重來緩解這個問題,通常我們并不知道該懲罰哪些特征的權重,而正則化就是幫我們懲罰特征權重的,即特征的權重也會成為模型損失函數的一部分。可以理解為,為了使用某個特征,我們需要付出loss的代價。這樣我們就可以篩選出最有效的特征,減少特征權重防止過擬合。這也是奧卡姆剃刀法則,越簡單的東西越有效。

  • L1正則會制造稀疏的特征,大部分無用特征的權重會被置為0
  • L2正則會讓特征的權重不過大,使得特征的權重比較平均。
    https://www.cnblogs.com/jianxinzhou/p/4083921.html

深度學習的局部響應歸一化LRN

CIFAR10數據集介紹

CIFAR-10數據集包含60000張32*32的彩色圖像,訓練集50000張,測試集10000張,共標注10類,每一類有6000張圖片。在這個卷積神經網絡模型中,我們使用了一些新的技巧:

  • 對weights進行了L2的正則化。
  • 對圖片進行了翻轉、隨機剪切等數據增強,制造了更多樣本。
  • 在每個卷積-最大池化層后面使用了LRN層,增強了模型的泛化能力。
  • CIFAR10模型與tensorflow官方開源的很多圖像分類模型如Mnist等一并放在了GitHub的tensorflow官方地址中。
    (1) 下載CIFAR10模型
    https://github.com/tensorflow/models/tree/master/tutorials/image/cifar10
    文件 說明

    下載Tensorflow Models庫,以便使用CIFAR-10數據的類

    git clone https://github.com/tensorflow/models.git cd models/tutorials/image/cifar10

    根據上面兩行代碼下載劃線部分的四個文件,raw-ctrlA-ctrlc-test右鍵new-Python Package-分別命名四個文件(對應下載的四個文件命名),執行cifar10_train即可。下載的包依舊在c:tmp中

    或者按照此方法統一下載
    svn下載github單個目錄文件夾

    (2) 下載CIFAR10模型數據集
    http://www.cs.toronto.edu/~kriz/cifar.html

    這里有三個版本,分別是python版、matlab版和binary版,根據下載的模型選用 數據集版本,這里選用CIFAR-10二進制版本(適用于C語言)
    (如果這里不下載數據集,也可以在運行cifar10_train.py程序時自動下載)

    (3) CIFAR10數據集解析:
    CIFAR10/CIFAR100數據集介紹
    二進制版本包含文件data_batch_1.bin,data_batch_2.bin,…,data_batch_5.bin以及test_batch.bin。這些文件中的每一個格式如下:
    <1×標簽> <3072×像素>

    <1×標簽> <3072×像素>
    換句話說,第一個字節是第一個圖像的標簽,它是0-9范圍內的一個數字。接下來的3072字節是圖像像素的值。前1024個字節是紅色通道值,下個1024個綠色,最后1024個藍色。值以行優先順序存儲,所以前32個字節是圖像第一行的紅色通道值。
    每個文件包含10000個這樣的3073個字節的“行”圖像,雖然沒有任何分隔的行。因此每個文件應該是30730000字節長。
    還有另一個文件叫做batches.meta.txt。這是一個ASCII文件,它將0-9范圍內的數字標簽映射到有意義的類名。這只是10個類名的列表,每行一個。第i行的類名稱對應于數字標簽i。
    這里是像素是0-255之間的整數,占兩個bytes。

    CIFAR10數據集可視化

    """作者:Heart Sea功能:實現cifar10數據集的圖片可視化版本:1.0日期:10/12/2019""" import numpy as np import imageio import ospath_train = './訓練集圖片' path_test = './測試集圖片' if not os.path.exists(path_train):os.makedirs(path_train) if not os.path.exists(path_test):os.makedirs(path_test)# 生成訓練集5個batch圖片,訓練集5萬張32*32*3的圖片,每個batch1萬張 # 生成測試集1個batch圖片,測試集1萬張32*32*3的圖片,batch1萬張 for j in range(1, 7):if j != 6:filename = 'd:/tmp/cifar10_data/cifar-10-batches-bin/data_batch_'+str(j)+'.bin'else:filename = 'd:/tmp/cifar10_data/cifar-10-batches-bin/test_batch.bin'bytestream = open(filename, "rb") # rb 以二進制讀模式打開# 1是占位字節(存放標簽),一行(每個圖片的記錄長度)為32*32*3+1(存放像素)# read函數,從文件中讀取的所有字節數,返回從字符串中讀取的字節buf = bytestream.read(10000 * (1 + 32 * 32 * 3))bytestream.close()# numpy.frombuffer(buffer, dtype = float, count = -1, offset = 0)# buffer 任何暴露緩沖區借口的對象# dtype 返回數組的數據類型,默認為float# count 需要讀取的數據數量,默認為-1,讀取所有數據# offset 需要讀取的起始位置,默認為0data = np.frombuffer(buf, dtype=np.uint8) # 帶有\n格式的一維數組data = data.reshape(10000, 1 + 32 * 32 * 3) # 二維數組labels_images = np.hsplit(data, [1]) # 將data分成兩個array,一組是data的第一列,另一組是剩下的所有列labels = labels_images[0].reshape(10000) # 第一組為標簽images = labels_images[1].reshape(10000, 32, 32, 3) # 第二組為圖像for i in range(0, 5): # 輸出一個batch的前5個圖片,可以自行修改img = np.reshape(images[i], (3, 32, 32)) # 導出第一幅圖img = img.transpose(1, 2, 0)if j != 6:picname = 'train'+str(i+(j-1)*10)+'.jpg'imageio.imwrite('訓練集圖片/' + picname, img)else:picname = 'test' + str(i + (j - 1) * 10) + '.jpg'imageio.imwrite('測試集圖片/' + picname, img) print("photo loaded.")

    CIFAR10模型

    CIFAR10代碼

    """作者:Heart Sea功能:基于cifar10數據集實現圖片的分類Model:輸入層, 數據增強(翻轉,剪切24*24,亮度,對比度),標準化卷積層, 卷積, 激活relu, 最大池化,卷積層, 卷積, 激活relu, LRN, 最大池化全連接, 激活relu,L2正則全連接, 激活relu,L2正則輸出層, (全連接, 不需要l2,直接比較大小)日期:10/12/2019 """ # 圖像分類實驗 # 下載Tensorflow Models庫,以便使用CIFAR-10數據的類 # git clone https://github.com/tensorflow/models.git # cd models/tutorials/image/cifar10# 載入numpy和time,并載入CIFAR-10數據的類 import cifar10, cifar10_input import tensorflow as tf import numpy as np import time import mathmax_steps = 3000 # 訓練輪數 batch_size = 128 data_dir = '/tmp/cifar10_data/cifar-10-batches-bin' # 下載CIAR-10的默認路徑def variable_with_weight_loss(shape, stddev, w1):"""對weight施加L2正則化處理,為了防止過擬合,正則化幫助我們懲罰權重特征,即特征的權重也會成為模型損失函數的一部分初始化weight函數,但是為了防止因為特征過多而引起的過擬合,給每個weight加一個L2的lossL1正則會造成稀疏的特征,大部分無用特征會被置為0。L2特征會讓權重不過大,是權重比較平均.函數中用w1來控制L2 loss的大小使用tf.add_to_collection把weight_loss統一存放到一個collection,名字叫loss"""var = tf.Variable(tf.truncated_normal(shape, stddev=stddev)) # 從截斷的正態分布中輸出隨機值if w1 is not None:weight_loss = tf.multiply(tf.nn.l2_loss(var), w1, name='weight_loss')tf.add_to_collection('losses', weight_loss)return var# 使用CIFAR-10類下載數據集,并解壓、展開到默認位置 cifar10.maybe_download_and_extract()# 使用CIFAR-10類中的distorted_inputs函數產生訓練使用的數據,并封裝好作為tensor。 # 同時還進行了數據增強包括水平翻轉、隨機剪切、設置隨機的亮度和對比度,以及對數據進行標準化。 # 數據增強采用16個線程進行加速,函數內部會產生線程池,需要使用時通過tensorflow queue進行調度 images_train, labels_train = cifar10_input.distorted_inputs(data_dir=data_dir, batch_size=batch_size)# 使用CIFAR-10類中的cifar10_input.inputs函數生成測試數據, # 不需翻轉、修改亮度,只需要剪切圖片的中心24*24的大小的區塊,標準化圖片 images_test, labels_test = cifar10_input.inputs(eval_data=True, data_dir=data_dir, batch_size=batch_size)# 創建輸入數據的placeholder,由于batch_size在之后定義網絡結構會用到,所以數據尺寸中的第一個值即樣本條數需要被預先設定, # 數據尺寸中的圖片尺寸為24*24,是剪切后的大小,通道數為3,代表圖片是彩色的有RGB三條通道 image_holder = tf.placeholder(tf.float32, [batch_size, 24, 24, 3]) label_holder = tf.placeholder(tf.int32, [batch_size])"""構建第一個卷積層第一層卷積的權重不進行L2正則化,w1控制L2正則權重,利用tf.nn.conv2d對image_holder數據進行訓練,然后經過relu非線性激活,之后最大池化,最后加入LRN層增加模型的泛化能力 """ weight1 = variable_with_weight_loss(shape=[5, 5, 3, 64], stddev=5e-2, w1=0.0) kernel1 = tf.nn.conv2d(image_holder, weight1, [1, 1, 1, 1], padding='SAME') bias1 = tf.Variable(tf.constant(0.0, shape=[64])) conv1 = tf.nn.relu(tf.nn.bias_add(kernel1, bias1))# 最大池化的尺寸和步長不一致,這樣可以增加數據的豐富性 pool1 = tf.nn.max_pool(conv1, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1], padding='SAME')# 應用局部相應歸一化層LRN,使得響應較大的值變得相對更大,并抑制其他反饋較小的神經元,增強了模型的泛化能力 # LRN對ReLU這種沒有上限邊界的激活函數比較有用,因為它會從附近的多個卷積核的響應中挑選比較大的反饋 # 但不適合sigmoid這種有固定邊界并且能抑制過大值的激活函數 norm1 = tf.nn.lrn(pool1, 4, bias=1.0, alpha=0.001 /9.0, beta=0.75)"""構建第二個卷積層,相比于第一層,調換了最大池化層與LRN層的順序,bias=0.1,而不是0,上一層的卷積核數量為64(即輸出64個通道),所以第三個維度(輸入的通道數)為64 """ weight2 = variable_with_weight_loss(shape=[5, 5, 64, 64], stddev=5e-2, w1=0.0) kernel2 = tf.nn.conv2d(norm1, weight2, [1, 1, 1, 1], padding='SAME') bias2 = tf.Variable(tf.constant(0.1, shape=[64])) conv2 = tf.nn.relu(tf.nn.bias_add(kernel2, bias2)) norm2 = tf.nn.lrn(conv2, 4, bias=1.0, alpha=0.001 / 9.0, beta=0.75) pool2 = tf.nn.max_pool(norm2, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1], padding='SAME')"""第一個全連接層,先把第二個卷積層的輸出結果進行扁平化,然后使所有的參數都被L2正則約束,最后relu激活tf.reshape函數將每個樣本都變成一維向量,get_shape函數獲取數據扁平化后的長度 """ reshape = tf.reshape(pool2, [batch_size, -1]) dim = reshape.get_shape()[1].value weight3 = variable_with_weight_loss(shape=[dim, 384], stddev=0.04, w1=0.004) bias3 = tf.Variable(tf.constant(0.1, shape=[384])) local3 = tf.nn.relu(tf.matmul(reshape, weight3) + bias3)"""第2個全連接層,隱含節點下降一半 """ weight4 = variable_with_weight_loss(shape=[384, 192], stddev=0.04, w1=0.004) bias4 = tf.Variable(tf.constant(0.1, shape=[192])) local4 = tf.nn.relu(tf.matmul(local3, weight4) + bias4)"""最后一層,不計入正則,不需要softmax就可以輸出分類結果,直接計算模型inferfence輸出結果,直接比較數值大小即可 """ weight5 = variable_with_weight_loss(shape=[192, 10], stddev=1/192.0, w1=0.0) bias5 = tf.Variable(tf.constant(0.0, shape=[10])) logits = tf.add(tf.matmul(local4, weight5), bias5) # 整個網絡結構部分已經完成def loss(logits, labels):"""logits: 輸出層的結果labels:實際結果計算CNN的loss,將softmax的計算和cross entropy loss的計算整合到一起使用tf.add_to_collection把cross entropy的loss添加到整體losses的collection中,使用tf.add_n將整體lossesDE collection中的全部loss求和,得到最終的loss,包括cross entropy loss,還有后面兩個全連接層weight的L2 loss"""labels = tf.cast(labels, tf.int64)cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=labels,name='cross_entropy_per_example')cross_entropy_mean = tf.reduce_mean(cross_entropy, name='cross_entropy')tf.add_to_collection('loss', cross_entropy_mean)return tf.add_n(tf.get_collection('losses'), name='total_loss') # 將logits節點和label_holder傳入loss函數 loss = loss(logits, label_holder)# 優化器選擇Adam train_op = tf.train.AdamOptimizer(1e-3).minimize(loss)# 使用tf.nn.in_top_k函數求出top1的準確率,輸出分數最高的那一類的準確率 # 測試集用 top_k_op = tf.nn.in_top_k(logits, label_holder, 1)# 創建默認的session,接著初始化全部模型參數 sess = tf.InteractiveSession() tf.global_variables_initializer().run()# 啟動前面圖片數據增強的線程隊列,共16個線程進行加速 tf.train.start_queue_runners()"""開始正式訓練,在每一個step的訓練過程中,我們先使用session的run方法執行images_train、label_train的計算,獲得一個batch的訓練數據,再將這個batch的數據傳入到train_op和loss的計算每隔10個step會計算并展示當前的loss,每秒鐘能訓練的樣本數量,以及訓練一個batch數據所花費的時間 """ for step in range(max_steps):start_time = time.time()image_batch, label_batch = sess.run([images_train, labels_train])_,loss_value = sess.run([train_op, loss],feed_dict={image_holder: image_batch, label_holder: label_batch})duration = time.time() - start_timeif step % 10 == 0:examples_per_sec = batch_size / durationsec_per_batch = float(duration)format_str=('step %d,loss=%.2f(%.1f examples/sec;%.3f sec/batch)')print(format_str % (step, loss_value, examples_per_sec, sec_per_batch))"""評測測試集的準確率 """ num_examples = 10000 # 測試集樣本數量# 返回多少個batch num_iter = int(math.ceil(num_examples / batch_size)) # math.ceil函數,返回數字的上入整數 true_count = 0 total_sample_count = num_iter * batch_size # 總樣本數 step = 0 while step < num_iter:image_batch, label_batch = sess.run([images_test, labels_test])predictions = sess.run([top_k_op],feed_dict={image_holder: image_batch,label_holder: label_batch})true_count += np.sum(predictions) # 匯總所有預測正確的結果step += 1 # 最后將評測結果計算出來 precision = true_count / total_sample_count print('precision @ 1 = %.3f' % precision)

    總結

    以上是生活随笔為你收集整理的TensorFlow基于cifar10数据集实现进阶的卷积网络的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。