TensorFlow開發者證書 中文手冊

pepure發表於2020-06-10

經過一個月的準備,終於通過了TensorFlow的開發者認證,由於官方的中文文件較少,為了方便大家瞭解這個考試,同時分享自己的備考經驗,讓大家少踩坑,我整理並製作了這個中文手冊,請大家多多指正,有任何問題和建議都可以在文末聯絡到我~

同時,感謝各位大牛們期間對我的幫助和指導!

------------------------------------------------------------------------------------------------------------------------------------------------------------------

考試流程

TensorFlow Certificate 官方網站:https://tensorflow.google.cn/certificate?hl=vi

 

 

1. 閱讀考生手冊

提前閱讀最新的考生手冊,官方文件 TF_Certificate_Candidate_Handbook 的下載地址如下:

https://tensorflow.google.cn/site-assets/downloads/marketing/cert/TF_Certificate_Candidate_Handbook.pdf

考試細節

考核目的

本次測試是為了考核學員應用 TensorFlow 2.x 構建模型 解決實際問題的能力。

該等級的證照考試主考查開發人員將機器學習整合到工具和應用程式中的基本知識。要獲得證照需要理解如何使用計算機視覺、卷積神經網路、自然語言處理以及真實世界的影像資料和策略來構建TensorFlow模型。

為了成功地參加考試,考生應熟悉:

  • 機器學習和深度學習的基本規則和方法

  • 在TensorFlow 2.x中建立機器學習模型

  • 用深層神經網路和卷積神經網路建立影像識別、目標檢測、文字識別演算法

  • 使用不同尺寸的真實影像通過卷積提取體現特徵,理解計算機如何“看到”資訊,繪製損失和精度曲線

  • 嘗試防止過擬合的策略,包括資料增強和dropout

  • 用神經網路求解自然語言處理問題

考核內容

(1) 搭建和訓練神經網路模型

  • 使用 TensorFlow 2.x

  • 搭建、編譯和訓練 機器學習模型

  • 資料預處理

  • 使用模型進行推理

  • 搭建多層網路

  • 搭建和訓練二分類模型

  • 搭建和訓練多分類模型

  • 訓練過程的損失和精度資料圖表顯示

  • 調整策略防止過擬合,包括資料增強和dropout

  • 預訓練模型載入後繼續訓練(遷移學習

  • 從預訓練模型中提取特徵

  • 確保輸入資料的尺寸無誤

  • 確保測試集的尺寸和輸入的尺寸匹配

  • 確保網路輸出資料和測試集的尺寸匹配

  • 理解batch方式匯入資料的意義

  • 使用回撥方法觸發訓練迴圈的結束

  • 使用不同資源的datasets

  • 使用不同格式的datasets,包括json和csv

  • 使用tf.data.datasets中的datasets

(2) 影像分類

  • 使用 Conv2D和pooling層搭建卷積神經網路

  • 搭建和訓練模型處理實際影像資料

  • 理解如何使用卷積改善神經網路

  • 使用不同維度和尺寸的實際影像資料

  • 使用 ImageDataGenerator

  • 理解 ImageDataGenerator 是如何根據檔案目錄結構生成影像標籤的

  • 使用深度神經網路和卷積神經網路 搭建 影像分類和目標檢測的模型

(3) 自然語言處理(NLP)

  • 使用TensorFlow搭建自然語言處理系統

  • 準備模型使用的文字資料

  • 使用二分類搭建模型識別文字片段

  • 使用多分類搭建模型識別文字片段

  • 在你的模型中使用詞向量

  • 在模型中使用LSTMs對文字進行分類,以進行二進位制或多類分類

  • 模型中增加RNN和GRU層

  • 在模型中使用RNNS,LSTMs,GRU和CNNs處理文字

  • 在現有的文字上訓練LSTMs,以生成新的文字(例如歌曲和詩歌)

(4) 時間序列,序列和預測

  • 使用時間序列、序列和預測這些模型進行訓練和優化

  • 準備時間序列的資料

  • 理解MAE,並理解它用於評估序列模型精度的原理

  • 在時間序列,序列和預測中使用RNNs和CNNs

  • 知道何時使用尾隨視窗和中心視窗

  • 使用TensorFlow進行預測

  • 準備特徵值和標籤

  • 識別和補償序列偏差

  • 在時間序列,序列和預測中動態調整學習率

考試環境

後面會詳細說明如何進行考試環境配置,這裡先簡述如下:

  • 需要PyCharm IDE環境和網路,可隨時進行

  • 執行TensorFlow模型進行線上的效能測試

  • 需要在PyCharm IDE上安裝 Google TensorFlow 考試外掛

考試時間

考試時間5小時,你可以提前交卷,如果時間不足,到5小時會自動提交。

考試連結

https://app.trueability.com/google-certificates/tensorflow-developer

身份驗證

中國公民需要提供有效的護照資訊。

考試期間求助資源

考試期間只可以用瀏覽器訪問TensorFlow文件

考試資格

個人身份參加,不得以公司或者組織身份參加考試

如何註冊和支付

註冊地址如下:

https://app.trueability.com/google-certificates/tensorflow-developer

按照要求填寫資訊註冊,並支付單次考試100美元的費用。

查詢結果

提交考試後,它將被評分,分數將被張貼到候選人門戶,網站地址如下:https://app.trueability.com/user_sessions/new。 如果你通過了考試,證照將郵寄到註冊的電子郵件地址。 如果您通過了考試,但在10個工作日內沒有收到證照,或者如果您想選擇不接受您的證照,請在tensorflow-certificate-team@google.com與我們聯絡。

重新考試

每次考試必須重新支付費用,重新參加開始的規定如下:

  • 如果你不通過你的第一次嘗試,你必須等待14天才能再次參加考試

  • 如果你不通過你的第二次嘗試,你必須等待兩個月才能再次參加考試

  • 如果經過三次嘗試你仍然沒有通過考試,你必須等待一年才能再次參加考試

證照有效期

證照有效期為3年

2. 註冊考試

註冊考試只需要按照網頁提示的步驟進行即可,中國公民需要提供護照圖片和資訊,同時錄入個人信用卡的相關資訊,進行考試費用的預凍結。其中,區域編號如果不清楚可以直接填99613。

3. 準備考試

安裝PyCharm IDE

下載並安裝 PyCharm IDE

 

 

安裝TensorFlow

第一步,在Anaconda中新增環境,Python版本為 3.7.x,環境名為TDExams

conda create --name TFExams python=3.7

 

 

第二步,切換到新建立的環境TFExams,conda activate TFExams

第三步,安裝 tensorflow 2.0.0 和 tensorflow-datasets,conda install tensorflow==2.0.0conda install tensorflow-datasets==1.3.2

如下所示:

 

 

 

下載和安裝可能需要等待 5~10 分鐘,直到終端提示 done 代表全部正常安裝完成。

測試環境

安裝完成後,測試下tensorflow-gpu是否正確安裝

第一步,配置PyCharm的Python環境為先前安裝好TensorFlow-GPU的TFExams

進入 檔案 -> 設定

 

 

分別進入 專案並選擇:TFExams -> Project Interpreter -> 設定 -> System Interpreter -> D:\Anaconda3\envs\TFExams\python.exe

 

 

看到環境中的類庫正常識別,代表設定完成,如下圖所示:

 

 

第二步,新建測試程式並測試

新建程式 TF2_GPU_Test.py,輸入測試程式碼,如下:

import tensorflow as tf
print(tf.__version__)
print(tf.test.is_gpu_available())
print(tf.test.is_built_with_cuda())

如果程式正常輸出了 版本號和2個True ,就代表 tensorflow-gpu 已經安裝成功。

同時在PyCharm的Python Console裡輸入 print(sys.version) ,確認Python版本是否為 3.7.x

 

 

4. 線上課程

強烈推薦 Coursera 中的線上課程(也是 TensorFlow Certificate 官網推薦的視訊學習課程),由吳恩達 DeepLearning.ai 的 Laurence Moroney 老師主講 ,該課程對 TensorFlow Certificate 的知識面覆蓋很好,通過逐步的視訊、練習和測驗,可以基本掌握 TensorFlow 基礎的程式碼實戰能力,該課程總共分 4 個子課程,全部完成後可以獲得 5 個 DeepLearning.ai 頒發的結業證照。

如果你能獨立完成該專項課程的所有考試和程式碼,基本上通過 TensorFlow Certificate 是不太困難的。

 

 

此專項課程包含 4 門課程:

  1. 機器學習入門;

  2. 卷積神經網路;

  3. 自然語言識別;

  4. 時間序列預測。

 

 

 

線上課程地址為:https://www.coursera.org/specializations/tensorflow-in-practice?

下面簡單把每個課程的核心知識點梳理一下:

1. 機器學習入門

① 機器學習的HelloWorld:用單層DNN網路搭建簡單的線性迴歸模型

② keras搭建神經網路的3種方式:

  1. 序列式(sequential);2. 函式式(functional);3. 子類(subclassing)

③ 深度學習 4 步走:

  • 建立模型

    Sequential() 構建網路的通用寫法是 Sequential([layer1,……,layerN])

    常見的層如下:

    Dense():全連線層

    Flatten():展開層

    Dropout():捨棄層

    BatchNormalization():批量標準化層

    Conv1D(), Conv2D():一維、二維卷積層

    MaxPooling1D(),MaxPooling2D():一維、二維最大池化層

    AveragePooling1D(), AveragePooling2D():一維、二維平均池化層

    RNN():迴圈層

    GRU():門限迴圈單元層

    LSTM():長短期記憶層

    Bidiretional():雙向層

    Embedding():嵌入層

    Lambda():任意表示式封裝層

  • 編譯模型

    model.compile(optimizer, loss)

  • 模型訓練

    model.fit(x_train, y_train, epoch)

  • 模型預測

    model.predict(x_new)

④ Callback機制

通過特定的回撥方式,在每個epoch的結束的時候,設定loss或者accuracy的訓練停止機制,程式碼如下:

class myCallback(tf.keras.callbacks.Callback):
 def on_epoch_end(self, epoch, logs={}):
   if(logs.get('loss')<0.4):
     print("\nReached 0.4 loss so cancelling training!")
     self.model.stop_training = True

callbacks = myCallback()

……

model.fit(training_images, training_labels, epochs=5, callbacks=[callbacks])

⑤ CNN 網路中間卷積層提取的資訊視覺化

通過以影像的方式顯示網路中間卷積層的資料,可以從中一窺CNN的各個卷積層對影像進行特徵提取的原理,程式碼如下:

import matplotlib.pyplot as plt
f, axarr = plt.subplots(3,4)
FIRST_IMAGE=0
SECOND_IMAGE=7
THIRD_IMAGE=26
CONVOLUTION_NUMBER = 1
layer_outputs = [layer.output for layer in model.layers]
activation_model = tf.keras.models.Model(inputs = model.input, outputs = layer_outputs)
for x in range(0,4):
 f1 = activation_model.predict(test_images[FIRST_IMAGE].reshape(1, 28, 28, 1))[x]
 axarr[0,x].imshow(f1[0, : , :, CONVOLUTION_NUMBER], cmap='inferno')
 axarr[0,x].grid(False)
 f2 = activation_model.predict(test_images[SECOND_IMAGE].reshape(1, 28, 28, 1))[x]
 axarr[1,x].imshow(f2[0, : , :, CONVOLUTION_NUMBER], cmap='inferno')
 axarr[1,x].grid(False)
 f3 = activation_model.predict(test_images[THIRD_IMAGE].reshape(1, 28, 28, 1))[x]
 axarr[2,x].imshow(f3[0, : , :, CONVOLUTION_NUMBER], cmap='inferno')
 axarr[2,x].grid(False)

⑥ 影像預處理 ImageDataGenerator() 初識

ImageDataGenerator 可以在訓練時,對影像進行按需實時(on the fly)的處理,而不必改變原始圖片,操作完成在記憶體中進行,用完銷燬,十分方便。

下述示例為影像歸一化:

train_datagen = ImageDataGenerator(rescale=1.0/255.0)

 

2. 卷積神經網路

① 資料增強 ImageDataGenerator() 深入

資料增強是影像分類中提高精度,防止過擬合的一個有效方式,通過ImageDataGenerator() 可以十分方便地進行資料增強,常用的資料增強的引數設定如下:

  • rotation_range:旋轉圖片 40 度

  • width_shift_range:橫向移動 20%

  • height_shift_range:縱向移動 20%

  • shear_range:逆時針剪下 20% 強度

  • zoom_range:放大 20% 強度

  • horizontal_filp:是否水平翻轉

  • fill_mode:缺失值如何被填滿

② 遷移學習 transfer learning

資料集不足的時候(這在工業領域非常常見,一般缺陷品數量會遠遠少於良品),除了資料增強以外,另一個有效的方式是遷移學習 transfer learning,俗稱 “站在巨人的肩膀上”。

簡單地敘述,遷移學習一般的流程為:載入成熟的模型 -> 載入超大資料集訓練出的引數 -> 鎖住預訓練模型中的引數不參與新的訓練 -> 從預訓練模型的後面幾層 連線新的幾層DNN網路 -> 使用新的資料集重新訓練最後新增的幾層網路

常用的使用InceptionV3的遷移學習程式碼如下:

  
from tensorflow.keras.applications.inception_v3 import InceptionV3

local_weights_file = '/tmp/inception_v3_weights_tf_dim_ordering_tf_kernels_notop.h5'

pre_trained_model = InceptionV3(input_shape = (150, 150, 3),
                               include_top = False,
                               weights = None)

pre_trained_model.load_weights(local_weights_file)

for layer in pre_trained_model.layers:
 layer.trainable = False
 
# pre_trained_model.summary()

last_layer = pre_trained_model.get_layer('mixed7')
print('last layer output shape: ', last_layer.output_shape)
last_output = last_layer.output

from tensorflow.keras.optimizers import RMSprop

# Flatten the output layer to 1 dimension
x = layers.Flatten()(last_output)
# Add a fully connected layer with 1,024 hidden units and ReLU activation
x = layers.Dense(1024, activation='relu')(x)
# Add a dropout rate of 0.2
x = layers.Dropout(0.2)(x)                  
# Add a final sigmoid layer for classification
x = layers.Dense (1, activation='sigmoid')(x)          

model = Model( pre_trained_model.input, x)

model.compile(optimizer = RMSprop(lr=0.0001),
             loss = 'binary_crossentropy',
             metrics = ['accuracy'])

 

3. 自然語言識別

① keras 單詞編碼工具包 Tokenizer

使用Tokenizer對句子中的詞語進行編碼,並生成編解碼字典。程式碼如下:

import tensorflow as tf
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences

tokenizer = Tokenizer()
tokenizer.fit_on_texts(sentences)

word_index = tokenizer.word_index
vocab_size=len(word_index)

sequences = tokenizer.texts_to_sequences(sentences)
padded = pad_sequences(sequences, maxlen=max_length, padding=padding_type, truncating=trunc_type)

其中,fit_on_texts 根據句子中的詞頻自動生成詞編碼;word_index 用於獲取生成的編碼字典;texts_to_sequences 應用生成的編碼字典將句子轉換成整數序列;pad_sequences 將編碼後的序列列表的各個元素進行填充,以確保列表中各序列的長度一致;

如果是小訓練集進行生成,可能存在詞種類不足,解決方法是用 oov_token 來表示未知新詞,OOV 是 Out-Of-Vocabulary 的縮寫,只需在 Tokenizer 裡面多加一個引數 oov_token="< OOV >" 。

 

② keras word2vec工具包 Embedding

Tokenizer 只是將詞簡單地按照詞頻轉換成整數序列,並沒有理解詞與詞之間的關係,這樣就無法準確理解句子的含義或者生成有意義的新句子。一般的解決方案是把整數序列用 one-hot 編碼轉成高維稀疏向量再轉成低維密集向量,因此一個詞可能用 100D, 300D 或 500D 的向量來表示,而詞與詞之間的相似度就用向量之間內積表示。這個過程就叫做 word2vec,即把單詞轉成換向量的過程,在 keras 裡用 Embedding() 來實現。這個操作放在最開始,一個好的 embedding 是整個模型好快的關鍵。之後可以用 LSTM 層 或 Conv1D 層 來拼接。程式碼如下:

embeddings_matrix = np.zeros((vocab_size+1, embedding_dim));
for word, i in word_index.items():
   embedding_vector = embeddings_index.get(word);

model = tf.keras.Sequential([
   tf.keras.layers.Embedding(vocab_size+1, embedding_dim, input_length=max_length, weights=[embeddings_matrix], trainable=False),
   tf.keras.layers.Dropout(0.2),
   tf.keras.layers.Conv1D(64, 5, activation='relu'),
   tf.keras.layers.MaxPooling1D(pool_size=4),
   tf.keras.layers.LSTM(64),
   tf.keras.layers.Dense(1, activation='sigmoid')
])
model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])

 

4. 時間序列預測

簡單地說,時間序列預測就是給定一段序列 S(1), S(2), ... S(t),預測 S(t+1)。一般的時間序列由下面的結構組成:

時間序列 = 季節性 + 趨勢 + 自相關 + 噪聲

一般的時間預測流程為:使用 windowed 製作訓練集和驗證集 -> 搭建不同的 Dense 層, LSTM 層和 Conv1D 層 -> 模型編譯、訓練和預測。

自動滑動窗體生成訓練集的程式碼如下:

def windowed_dataset(series, window_size, batch_size, shuffle_buffer):
   series = tf.expand_dims(series, axis=-1)
   ds = tf.data.Dataset.from_tensor_slices(series)
   ds = ds.window(window_size + 1, shift=1, drop_remainder=True)
   ds = ds.flat_map(lambda w: w.batch(window_size + 1))
   ds = ds.shuffle(shuffle_buffer)
   ds = ds.map(lambda w: (w[:-1], w[1:]))
   return ds.batch(batch_size).prefetch(1)

搭建模型和編譯訓練:

model = tf.keras.models.Sequential([
 tf.keras.layers.Conv1D(filters=32, kernel_size=5,
                     strides=1, padding="causal",
                     activation="relu",
                     input_shape=[None, 1]),
 tf.keras.layers.LSTM(64, return_sequences=True),
 tf.keras.layers.LSTM(64, return_sequences=True),
 tf.keras.layers.Dense(30, activation="relu"),
 tf.keras.layers.Dense(10, activation="relu"),
 tf.keras.layers.Dense(1),
 tf.keras.layers.Lambda(lambda x: x * 400)
])

lr_schedule = tf.keras.callbacks.LearningRateScheduler(
   lambda epoch: 1e-8 * 10**(epoch / 20))
optimizer = tf.keras.optimizers.SGD(lr=1e-8, momentum=0.9)
model.compile(loss=tf.keras.losses.Huber(),
             optimizer=optimizer,
             metrics=["mae"])
history = model.fit(train_set, epochs=100, callbacks=[lr_schedule])

模型預測,計算mae:

def model_forecast(model, series, window_size):
   ds = tf.data.Dataset.from_tensor_slices(series)
   ds = ds.window(window_size, shift=1, drop_remainder=True)
   ds = ds.flat_map(lambda w: w.batch(window_size))
   ds = ds.batch(32).prefetch(1)
   forecast = model.predict(ds)
   return forecast

rnn_forecast = model_forecast(model, series[..., np.newaxis], window_size)
rnn_forecast = rnn_forecast[split_time - window_size:-1, -1, 0]

tf.keras.metrics.mean_absolute_error(x_valid, rnn_forecast).numpy()

超引數之學習率的選擇

時間序列預測問題,最佳學習率的選擇是比較困難的,一般通過 LearningRateScheduler 作為 callbacks 找到一個最優學習率,然後設定該學習率進行重新訓練。

程式碼如下:

lr_schedule = tf.keras.callbacks.LearningRateScheduler(
   lambda epoch: 1e-8 * 10**(epoch / 20))
optimizer = tf.keras.optimizers.SGD(lr=1e-8, momentum=0.9)
model.compile(loss=tf.keras.losses.Huber(),
             optimizer=optimizer,
             metrics=["mae"])
history = model.fit(train_set, epochs=100, callbacks=[lr_schedule])

 

5. 參加考試

考試時間總共有 5 小時,在下載並註冊考試外掛後開始計時。如果沒能在 5 小時內完成考試,那到時間也會自動提交程式碼。 整場考試主要測試學生使用 TensorFlow 構建模型、解決問題的能力。在考試中,參與者需要完成 5 個模型,每一個都屬於不同的類別。考試總分 100 分,過了 90 分就算合格,也就是說 5 個模型都要完成,且只能有一些小錯誤。 考試涉及的模型類別如下:

第一類:基礎、簡單模型

第二類:基於學習資料集的模型

第三類:採用真實影像資料訓練卷積神經網路

第四類:採用真實文字資料訓練 NLP 文字分類模型

第五類:採用真實數值資料訓練序列模型

注意事項:每一題完成後都需要單獨提交和測試,並確認得分情況,確保儘量全部滿分後,再提交全部試題。

6. 查詢成績

考試結束後,可以直接登陸註冊的網站,查詢是否通過。(一般情況下,提交併結束考試後是可以立即知道結果的,官方的說明是24小時內告知結果。)

如果通過的話,你會在2周內收到TensorFlow發放的證照,並在全球 TensorFlow Certificate 證照網路中看到你的個人資訊。

7. 展示成果

最後,就是展示成果的環節啦,你可以在LinkedIn等平臺上登陸並展示你的證照!

祝你通過上述的學習 也能順利通過 TensorFlow Certificate 認證!

 

-------------------------------------------------------------------------------------------------------------------------------------------------


加入TFUG蘇州

 

參與TFUG社群活動,可以是組織者,志願者,講師(不一定是大牛,只要能分享相關經驗即可)等;也可以是合作伙伴,為社群提供各種資源。

 

如果您想作為TFUG蘇州的組織者或志願者,或者有任何意見或建議,歡迎給我們的公眾號留言!

 

微信公眾號: TFUG蘇州

 

  



Join Us

 

If you love TensorFlow, machine learning and willing to share, if you have other great ideas about our activities, if you are interested in our community and activities here, please contact us! 

 

WeChat: TFUGSuzhou

 



 

關注我們的公眾號,第一時間獲取最新活動訊息

 

 

 

 

Gmail: tfugsuzhou@gmail.com 

 

微訊號:

 

 

相關文章