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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

TensorFlow2-高层API接口Keras

發布時間:2024/4/11 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TensorFlow2-高层API接口Keras 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

TensorFlow2高層API接口Keras

簡介

Keras是方便神經網絡構建的一個高層API庫,其本身并沒有實現任何的矩陣運算以及GPU加速運算的功能,它只是為深度學習框架提供一個更方便但也更加生硬的接口,底層的運算都是由深度學習框架完成的(支持TensorFlow、Theano、MXNet)。

由于Keras的實用性,Google隨后收購了Keras并將其功能全部集成到了TensorFlow中,TensorFlow2同樣支持這些Keras的內容,均在tf.keras模塊下(Keras是一個第三方庫,使用pip安裝,支持但不限于TensorFlow這類多種后端,而tf.keras是集成Keras功能的TensorFlow子模塊,建議使用tf.keras而不是Keras這個第三方庫)。

使用keras模塊主要使用其五個主要模塊,為datasets、layers、losses、metrics以及optimizers

五大模塊

  • datasets
    • 前文已經提到,封裝了一些對常見的小型數據集的預處理(如MNIST),自動下載并處理數據為numpy矩陣。
  • layers
    • 在Keras的神經網絡模型概念中,網絡是可以按照層進行區分的,一層完成一個或者幾個張量運算,如卷積層、池化層等。Keras對這些層進行了封裝,只要傳入張量,則按照層的運算方式輸出運算結果張量。
  • losses
    • 損失函數及損失函數的優化是神經網絡這類端到端模型關注的重點話題,對于不同的任務不同的損失函數會有不同的效果,一個合適的損失函數非常重要,一般的實際任務中需要設計一個很好的損失函數。Keras對于MSE、CE這類常見的損失函數進行了封裝,實例化該損失函數則會自動計算loss值。
  • metrics
    • 該模塊下封裝了很多評估類,用于對數值進行評估,如準確率(Accuracy)、均值(Mean)等。
    • 實例化一個指標對象;調用update_state方法傳入數值數據;通過調用result方法得到計算到的指標值;調用reset_states方法清除緩存,重新傳入數據。
  • optimizers
    • 優化器的選擇對于神經網絡龐大的參數優化問題是非常重要的,在過去的一段時間內SGD(隨機梯度下降)就是非常優秀的優化器了,但是SGD有著很多問題,這就有了依據梯度下降思想產生的動量SGD、Adam、RAdam等等后起之秀。當然,對于一個模型優化問題,往往沒有最好的只有最合適的優化器,對于有的任務SGD就是最快最好的方法,而對于有的任務RAdam才是合適的選擇。

快捷訓練

縱觀神經網絡的訓練流程,大致流程如下。

  • 傳入輸入張量
  • 進行矩陣運算得到輸出張量
  • 計算損失并將損失反向傳播
  • 根據反向傳播的梯度值依據梯度更新算法更新參數
  • 根據訓練好的參數對驗證集預測,驗證模型預測能力
  • 重復上面步驟多次,每次稱為一個輪次(epoch)的訓練。
  • 顯然,這整個過程可以理解為一個端到端的過程,輸入張量,輸出預測結果。至于中間的張量流動,是個可以進一步封裝的整個模型,Keras實現了這個工作,在Keras中,處理這一切運算的模型是由Model類衍生的。

    這個model實例主要實現四個方法,compile,fit, evaluate, predict,通過這四個封裝的方法完成了很大代碼量的神經網絡構建和訓練過程。

    • compile方法編譯模型,要求至少傳入優化器(optimizer)、損失函數(loss function)和評估指標(metrics)。
    • fit方法訓練模型,要求至少傳入訓練的數據和輪次(epoch)。也可以傳入驗證數據validation_data和validation_freq,前者表示驗證集數據,后者表示多少個epoch進行一次驗證集測試。
    • evaluate方法要求輸入驗證數據集的x和y,然后按照模型編譯指定的metrics給出預測的結果評估。
    • predict方法要求輸入測試集的x,根據訓練好的網絡參數返回模型的預測結果。

    自定義網絡結構

    深度學習的網絡模型結構五花八門,大體上就有卷積神經網絡(CNN)、循環神經網絡(RNN)、圖卷積神經網絡(GCN)等等。要想利用Keras這樣并不靈活的頂層API實現具體的網絡模型,預定義的網絡層注定是不夠的,自定義網絡層的API就顯得非常重要了。

    在Keras中,要想實現自定義網絡模型,需要用到三個至關重要的類,keras.Sequential,keras.layers.Layer,keras.Model。其中,Sequential是一個容器,它支持以列表的形式傳入多個繼承自keras.layers.Layer的實例對象,張量會從輸入流經列表中的每一個Layer運算,所以本質上,Sequential表示的是張量的流動,Layer封裝的是張量的運算過程

    最終,張量數據的入口是Sequential實例(其實,Sequential類是keras.Model的子類)或者keras.Model的實例,具體的運算流程由keras.layers.Layer完成,keras.Model封裝了compile、fit等方法。**所以,自定義的層級運算繼承自keras.layers.Layer,自定義的模型繼承自keras.Model。**下面演示自定義Layer和Model,注意無論哪種方法,直接使用對象實例處理張量(如layer(x)或者model(x)),相當于調用call方法,經過實例內部的所有張量運算。

    模型的保存與加載

    一方面,作為深度模型最終是需要落地的,因此保存訓練好的參數或者干脆保存訓練好的整個模型是非常重要的;另一方面,深度模型非常龐大,訓練過程有時候很長(幾周甚至幾個月),很容易出現斷電等情況,定時保存模型已經訓練的參數是非常重要的。

    Keras實現了很方便的模型保存接口,一般有兩種方法save/load weights和save/load entire model,前者表示只保存模型參數,占用內存少,需要重新構建保存參數時的Model對象;后者表示保存整個模型對象,占用內存大,不需要重新構建相同的Model對象,load得到的就是Model對象。Keras保存的本地文件使用HDF5文件實現的。

    但是,在工業界部署時,一般不使用效率較低的Python環境而是使用C++環境,此時保存Python對象就顯得沒有意義,而要保存一種通用協議的文件,TensorFlow2也提供了這種接口(所以說TensorFlow在工業界的地位無可替代)。事實上,只需要給出保存目錄即可,保存的是一系列相關文件。

    Keras API實現自定義網絡分類CIFAR

    通過對CIFAR10數據集圖片進行訓練并預測類別。

    """ Author: Zhou Chen Date: 2019/10/17 Desc: About """ import tensorflow as tf from tensorflow.keras import datasets, layers, optimizers, Sequential, metrics from tensorflow import keras import osos.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'def preprocess(x, y):# [0~255] => [-1~1]x = 2 * tf.cast(x, dtype=tf.float32) / 255. - 1.y = tf.cast(y, dtype=tf.int32)return x, ybatch_size = 128 # [50k, 32, 32, 3], [10k, 1] (x, y), (x_val, y_val) = datasets.cifar10.load_data() y = tf.squeeze(y) y_val = tf.squeeze(y_val) y = tf.one_hot(y, depth=10) # [50k, 10] y_val = tf.one_hot(y_val, depth=10) # [10k, 10] print('datasets:', x.shape, y.shape, x_val.shape, y_val.shape, x.min(), x.max())train_db = tf.data.Dataset.from_tensor_slices((x, y)) train_db = train_db.map(preprocess).shuffle(10000).batch(batch_size) test_db = tf.data.Dataset.from_tensor_slices((x_val, y_val)) test_db = test_db.map(preprocess).batch(batch_size)class MyDense(layers.Layer):def __init__(self, inp_dim, outp_dim):super(MyDense, self).__init__()self.kernel = self.add_variable('w', [inp_dim, outp_dim])def call(self, inputs, training=None):x = inputs @ self.kernelreturn xclass MyNetwork(keras.Model):def __init__(self):super(MyNetwork, self).__init__()self.fc1 = MyDense(32 * 32 * 3, 256)self.fc2 = MyDense(256, 128)self.fc3 = MyDense(128, 64)self.fc4 = MyDense(64, 32)self.fc5 = MyDense(32, 10)def call(self, inputs, training=None):""":param inputs: [b, 32, 32, 3]:param training::return:"""x = tf.reshape(inputs, [-1, 32 * 32 * 3])# [b, 32*32*3] => [b, 256]x = self.fc1(x)x = tf.nn.relu(x)# [b, 256] => [b, 128]x = self.fc2(x)x = tf.nn.relu(x)# [b, 128] => [b, 64]x = self.fc3(x)x = tf.nn.relu(x)# [b, 64] => [b, 32]x = self.fc4(x)x = tf.nn.relu(x)# [b, 32] => [b, 10]x = self.fc5(x)return xnetwork = MyNetwork() network.compile(optimizer=optimizers.Adam(lr=1e-3),loss=tf.losses.CategoricalCrossentropy(from_logits=True),metrics=['accuracy']) network.fit(train_db, epochs=15, validation_data=test_db, validation_freq=1)network.evaluate(test_db) network.save_weights('ckpt/weights.h5') del network print('saved to ckpt/weights.h5')network = MyNetwork() network.compile(optimizer=optimizers.Adam(lr=1e-3),loss=tf.losses.CategoricalCrossentropy(from_logits=True),metrics=['accuracy']) network.load_weights('ckpt/weights.h5') print('loaded weights from file') network.evaluate(test_db)

    補充說明

    本文主要針對TensorFlow2中Keras這個高層API進行了簡單使用上的介紹,其實,Keras是一個很值得學習的大型框架,感興趣可以查看我的Keras專欄。具體代碼上傳至我的Github,歡迎star或者fork。

    總結

    以上是生活随笔為你收集整理的TensorFlow2-高层API接口Keras的全部內容,希望文章能夠幫你解決所遇到的問題。

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