程式碼研究室簡介
1. 事前準備
本程式碼研究室是以本系列中上一次程式碼研究室的最終結果為基礎,可用於使用 TensorFlow.js 進行垃圾留言偵測。
在最後一個程式碼研究室中,您已為虛構影片網誌建立了功能完善的網頁。
該程式碼研究室的最終結果顯示如下:
這項功能可以正常運作,但也有特殊案例要能夠偵測不到。您可以根據模型無法處理的情況,重新訓練模型。
本程式碼研究室聚焦於使用自然語言處理技術 (也就是瞭解電腦語言的藝術),並說明如何修改您建立的現有網頁應用程式 (強烈建議您按照程式碼研究室的順序處理問題),許多網頁開發人員在處理這類熱門網路應用程式時,確實會遇到許多問題。
在這個程式碼研究室中,我們將根據目前趨勢或熱門討論主題來重新訓練機器學習模型,以反映可能會隨時間改變的垃圾內容內容,進一步提升模型的執行速度。
必要條件
- 已完成本系列的第一項程式碼研究室。
- 熟悉網頁技術,包括 HTML、CSS 和 JavaScript。
建構項目
您將以同一個即時網誌的形式,將原先建立的網站重複使用,並且將即時評論區段升級,使用 TensorFlow.js 升級網站,以載入自訂訓練的垃圾內容偵測模型。當然,身為網頁程式開發人員和工程師的您,就可以變更這個假設機制,以便在您日常使用的任何網站上重複使用,並配合任何客戶的用途 (例如網誌、論壇) 或某種形式的 CMS (例如 Drupal) 調整解決方案。
讓我們開始遭到入侵...
您將會瞭解的內容
您將學會以下內容:
- 找出預先訓練模型失敗的邊緣案例
- 重新訓練使用 Model Maker 建立的垃圾內容分類模型。
- 將此 Python 模型匯出為 TensorFlow.js 格式供瀏覽器使用。
- 使用新訓練的模型更新託管模型及其字典,然後檢查結果
本研究室假設您已熟悉 HTML5、CSS 和 JavaScript 相關知識。此外,您也會透過「co lab」筆記本執行部分 Python 程式碼;這個筆記本可重新訓練使用 Model Maker 建立的模型,但不需要熟悉 Python 即可。
2. 設定程式碼
您同樣可以使用 Glitch.com 代管及修改網路應用程式。如果您尚未完成必備的程式碼研究室,可以在這裡複製最終結果做為起點。如果您對程式碼的運作方式有任何疑問,我們極力建議您完成先前的程式碼研究室,並按照指示完成建立這個網路應用程式的後續工作,再繼續操作。
在 Glitch 中,只要按一下 [重混此項目] 按鈕就能建立檔案,並製作一組可編輯的新檔案。
3. 探索之前的解決方案
如果開啟的是您剛複製完成的網站,並試著輸入一些評論,您會發現它的大部分時間可以正常運作,封鎖一些如預期般的垃圾留言,並允許透過正當的回覆。
不過,只要您有精心設計的成果,並嘗試打破語句,就能打破這個模式,因此可能在某段時間獲勝。有點試用期和錯誤時,您可以手動建立範例,如下所示。您可以嘗試將這些資訊貼到現有的網路應用程式中,並檢查主控台,看看是否出現垃圾留言,以及再次使用這些功能的可能性:
張貼無問題的留言 (真陰性):
- 「我超愛影片,真厲害。」疑似垃圾內容:47.91854%
- " 非常喜歡這些示範!瞭解詳情疑似垃圾內容:47.15898%
- “我可以到哪一個網站瞭解更多資訊瞭解詳情”疑似垃圾內容:15.32495%
上述所有優點都相當低,因此在執行任何動作前,預設的最低機率為 75% (SPAM_THRESHOLD
在先前程式碼研究室的 script.js
程式碼中定義)。
現在,請試著撰寫一些前所未見的垃圾留言,即使評論不是垃圾資訊也一樣...
合法的垃圾評論 (誤判情況):
- & 有人可藉由連結,使其與他所穿戴口罩的網站連結疑似垃圾內容:98.46466%
- " 我可以在 Spotify 上購買這首歌曲嗎?請告知對方!」疑似垃圾內容:94.40953%
- 「有人可否與我聯絡,以詳細瞭解如何下載 TensorFlow.js?"疑似垃圾內容:83.20084%
糟糕!這類合法留言似乎被標示為垃圾內容。問題修正方式
最簡單的方法就是將 SPAM_THRESHOLD
提升至超過 98.5% 的信心。在此情況下,系統會將這些分類錯誤的留言張貼。有鑑於此,讓我們繼續完成其他可能的結果...
垃圾留言被標為垃圾內容 (真實:):
- 「這個超棒,但看看我網站上的下載連結是否正確!」疑似垃圾內容:99.77873%
- “我知道有些能獲得你一些藥物的人只查看了我的 pr0file 瞭解”” 疑似垃圾內容:98.46955%
- 「立即查看我的個人資料,下載更精彩的影片! http://example.com"」疑似垃圾內容:96.26383%
沒問題,這原本是以原本 75% 的門檻運作,但由於在上一個步驟中將「SPAM_THRESHOLD
」變更為超過 98.5% 的信心,這表示這裡有 2 個範例可供參考,因此門檻可能過高。或許 96% 比較好?但如果您做的事情是,上述前幾則意見 (誤判情況) 會被視為垃圾內容,因為其評分為 98.46466%。
在此情況下,最好還是擷取所有實際的垃圾評論,然後針對這些故障進行重新訓練。將門檻設為 96% 時,系統仍會擷取所有正值,並刪除上述 2 個偽陽性。即便僅變更一個號碼也沒關係。
繼續...
允許張貼的垃圾留言 (偽陰性):
- 「查看我的個人資料,下載更精彩的影片!」疑似垃圾內容:7.54926%
- "在我們的健身房訓練課程中取得折扣,請見 pr0file!"疑似垃圾內容:17.49849%
- 答 GOOG 的 GOOG 股票剛剛開跑!太晚了!」疑似垃圾內容:20.42894%
對於這些註解,您只要進一步變更 SPAM_THRESHOLD
值即可。將垃圾留言門檻從 96% 調降至 9% 後,真實留言就會被標記為垃圾內容,即使其中 58% 是正常的,但其中 5 分都屬於正常評分。處理這類留言的唯一方法,是用訓練資料中的這類邊緣案例重新訓練模型,藉此判斷其是否能針對垃圾內容,調整其對於全球內容的看法。
雖然目前唯一的選項是重新訓練模型,但您也知道該如何調整判斷垃圾留言的門檻,藉此提升效能。作為一個人,75% 看似很自信,但對於此模型,您需要增加接近 81.5% 才能以實例進行更有效。
沒有特別的魔法價值適用於各種模型,而且在測試實際成效良好的實際數據後,仍需為每個模型設定這個門檻值。
在某些情況下,誤判 (或負面) 可能會造成嚴重後果 (例如在醫療產業中),因此您可以將門檻調整至極高,並為不符合上述門檻要求進行人工審查。您是開發人員,因此必須進行一些實驗。
4. 重新訓練垃圾留言偵測模型
在之前的章節中,您發現許多失敗的邊緣情況是失敗的模型,唯一的選項就是重新訓練模型,以找出這些情況。在實際工作環境中,當有人手動檢舉垃圾留言,或由管理員審核遭到檢舉的留言後,系統會判定這些留言並非垃圾內容,因此您可能會發現這些留言其實是垃圾內容。假設您已收集到這些邊緣案件的新資料 (為求最佳結果,請盡可能取得這些新句子的部分變化),接下來,我們會帶您瞭解如何重新訓練模型,以找出這些邊緣情況。
預製模型回顧
您所建立的預製模型是由第三方透過 Model Maker 所建立,並使用「平均文字嵌入」功能來執行模型。
模型是使用模型製作工具所建構,您必須暫時切換至 Python 來重新訓練模型,然後將匯出的模型匯出到 TensorFlow.js 格式,以便在瀏覽器中使用。幸好「模型製作工具」讓其模型變得非常容易,所以很容易跟上,因此我們會引導您完成相關程序,所以您從未使用過 Python!
Colab
您不熟悉這個程式碼研究室,並希望設定 Linux 伺服器並安裝各種 Python 公用程式,因此您可以使用「Colab 筆記本」透過網路瀏覽器執行程式碼。這些筆記本可以連線至「後端」,也就是已預先安裝部分伺服器的伺服器,方便您在網路瀏覽器內執行任何程式碼並查看結果。想要快速執行原型設計,或用於這類教學課程,這項功能就非常實用。
只要前往 colab.research.google.com,系統隨即會顯示歡迎畫面,如下所示:
現在,按一下彈出式視窗右下角的 [New Notebook] (新增筆記本) 按鈕,您應該會看到如下的空白 Colab:
漂亮!下一步是將前端 Colab 連結至部分後端伺服器,以便執行要編寫的 Python 程式碼。方法是按一下右上角的 [Connect] (連結),然後選取 [Connect to hostruntime] (連結至代管執行階段)。
連接完成後,您會看到 RAM 和磁碟圖示出現在位置,如下所示:
太棒了!您現在可以開始透過 Python 編寫程式碼,重新訓練 Model Maker 模型。方法很簡單,只要按照下方步驟進行即可。
步驟 1
在第一個空白儲存格中,複製下列程式碼。它會使用 Python 的套件管理工具,為您安裝 TensorFlow Lite Model Maker (稱為「pip」)。
!pip install -q tflite-model-maker
不過,將程式碼貼到儲存格中並不會執行。接著,將滑鼠遊標懸停到您貼上以上程式碼的灰色儲存格上方,儲存格左側就會顯示一個小「播放」圖示,如下所示:
按一下播放按鈕即可執行剛才在儲存格中輸入的程式碼。
你會看到安裝模型製作工具:
這個儲存格完成執行後,請繼續進行下一步。
步驟 2
接著,依照以下指示新增程式碼儲存格,以便在第一個儲存格後方貼上其他程式碼,然後分別執行這些程式碼:
執行下一個儲存格時會有多項匯入作業,因此匯入筆記本時必須使用的程式碼。複製下方的文字並貼到新建立的儲存格中:
import numpy as np
import os
from tflite_model_maker import configs
from tflite_model_maker import ExportFormat
from tflite_model_maker import model_spec
from tflite_model_maker import text_classifier
from tflite_model_maker.text_classifier import DataLoader
import tensorflow as tf
assert tf.__version__.startswith('2')
tf.get_logger().setLevel('ERROR')
很熟悉標準內容,即使您不熟悉 Python 也一樣。您只需匯入部分公用程式,以及垃圾郵件分類工具所需的「建築模型製作工具」功能即可。系統還會檢查您是否執行的是 TensorFlow 2.x,這是使用 Model Maker 的必要條件。
最後,和之前一樣,只要將滑鼠遊標移到儲存格上,按下「播放」圖示,最後執行新的程式碼儲存格,即可執行下一個步驟,以便執行儲存格。
步驟 3
接下來,您需要將遠端伺服器的資料下載到裝置上,並將 training_data
變數設為產生的本機檔案路徑:
data_file = tf.keras.utils.get_file(fname='comment-spam-extras.csv', origin='https://storage.googleapis.com/laurencemoroney-blog.appspot.com/jm_blog_comments_extras.csv', extract=False)
模型製作工具可以透過簡單的 CSV 檔案 (例如下載的檔案) 訓練模型。您只需要指定哪些資料欄含有這些文字,以及哪些資料欄含有標籤。請參閱步驟 5 的說明。如有需要,您可以直接下載 CSV 檔案,看看其中有什麼檔案。
您一定注意到,這個檔案的名稱是 jm_blog_comments
_extras
.csv
- 這個檔案只是我們用來產生第一個註解垃圾郵件模型的原始訓練資料,並結合了您所找到的新邊緣案件資料,因此這些資料全都集中在一個檔案中。_extras
除了您要學習的新句子以外,您也需要用於訓練模型的原始訓練資料。
選擇性:如果您下載這個 CSV 檔案並檢查最後幾行內容,就會發現先前無法正常運作的邊緣案例示例。這些模型已新增至現有訓練資料的結尾,該模型是預先訓練的模型。
執行這個儲存格,然後等到這個儲存格執行完畢之後新增一個儲存格,然後進行步驟 4。
步驟 4
使用「模型製作工具」時,您無法從頭開始建立模型。您通常會使用現有的模型,然後根據需求自訂模式。
「模型製作工具」提供許多預先學習的模型嵌入項目,但最快速且最快速的方法就是使用 average_word_vec
,也就是先前在程式碼研究室中用來建構網站的工具。程式碼如下:
spec = model_spec.get('average_word_vec')
spec.num_words = 2000
spec.seq_len = 20
spec.wordvec_dim = 7
將程式碼貼到新儲存格中後,即可直接執行。
瞭解
num_words
參數
這是您希望模型使用的字詞數量。您可能會認為頻率越高,但通常都是根據每個字詞的使用頻率提供一個最佳選擇。如果您用到整個語料庫裡所有的字,最後可能會被模型設定為只學習一次,並只分析一次只用到一次的權重。在這種情況下,這個功能就不太實用。您在任何文字語料庫中發現,許多字詞都只使用一、兩次,而且通常不適合用於模型,因為這類文字對整體情緒的影響不會太大。因此,您可以使用 num_words
參數調整模型的字數。這裡的數字越小、模型越小,速度越小,但系統辨識出的字數較少。這裡的數字越大,模型的數量可能較大且較慢。尋找甜蜜的景點十分重要,而身為機器學習工程師,您必須找出最適合您的用途。
瞭解
wordvec_dim
參數
wordvec_dim
參數是用來指定每個字詞向量的維度數量。這些維度基本上屬於不同的特徵 (在訓練過程中由機器學習演算法所建立),可用來評估特定字詞對於計畫的具體意義,可找出與有意義的關聯性相似的字詞,然後加以關聯。
舉例來說,假設某個維度是「醫療」這個字,一個字是一個類似「小」的字詞,其在這類維度中的分數可能較高,並與其他「高」的字詞 (例如「xray」和「cat」) 有關,因此在這項維度中分數偏低。「
若是在「醫療維度」中分數高的字詞,可能表示將第二個字詞與人類人體關聯性相關的第二個維度可能有幫助。如「腿」、「手臂」和「領袖」等字詞,其文字可能因此獲得高分,在醫學方面的表現也可能相當高。
然後,這個模型可運用這些維度來偵測更可能與垃圾郵件相關的字詞。包含垃圾郵件和人體部分文字的郵件,比較容易出現垃圾郵件。
根據研究結果,經驗法則是字詞數的四個根。因此,如果我使用 2000 字,那就有一個良好的起點是 7 個尺寸。如果您變更了使用的字詞數目,也可以變更這項設定。
瞭解
seq_len
參數
就輸入值而言,模型通常非常嚴謹。對語言模型而言,這表示語言模型可以分類特定靜態、長度或句子的句子。這個參數是由 seq_len
參數決定,此參數代表「序列長度」。當您將字詞轉換為數字 (或符記) 時,語句就會成為這些符記的序列。因此,您的模型將進行訓練 (在這個案例中),以分類並識別具有 20 個符記的語句。如果句子的長度超過此長度,就會被截斷。如果長度較短,系統將為邊框間距,就像這個系列中的第一個程式碼研究室一樣。
步驟 5 - 載入訓練資料
您先前已下載 CSV 檔案。現在不妨使用資料載入器,將模型轉換成訓練資料,以供模型識別。
data = DataLoader.from_csv(
filename=data_file,
text_column='commenttext',
label_column='spam',
model_spec=spec,
delimiter=',',
shuffle=True,
is_training=True)
train_data, test_data = data.split(0.9)
如果您在編輯器中開啟 CSV 檔案,就會發現每一行都只有兩個值,而檔案的第一行則是文字說明。一般來說,系統會將每個項目視為一個「欄'」。您會看到第一個資料欄的描述元是 commenttext
,而每一行的第一個項目就是註解文字。
同樣地,第二欄的描述元是 spam
,而您會發現每一行的第二個項目是 TRUE 或 FALSE,以表示該文字是否為垃圾留言。其他屬性會設定您在步驟 4 建立的模型規格,以及一個分隔符號字元 (在本例中為逗號分隔字元,因為檔案是以逗號分隔)。您也需要設定隨機播放參數,以隨機方式重新調整訓練資料,讓相似的資料或集合一起一起在資料集中隨機分配。
接著,您將使用 data.split()
將資料拆分為訓練和測試資料。.9 表示資料集中有 90% 將用於訓練,其餘內容則用於測試。
步驟 6 - 建立模型
新增其他儲存格,我們會在其中加入程式碼以建構模型:
model = text_classifier.create(train_data, model_spec=spec, epochs=50)
這會使用 Model Maker 建立文字分類程式模型,並指定您要使用的訓練資料 (在步驟 4 中定義)、模型規格 (也在步驟 4 中設定) 以及多個訓練週期,在本案例中為 50。
機器學習的基本原則是模式比對。一開始,它會載入預先訓練的字的權重,並嘗試使用「預測」進行分類;其中,如果將特定組件分組,代表垃圾內容,哪些則不會。第一次是在附近,它可能接近 50:50,因為模型只是始動,如下所示:
然後,它將測量此結果,並且變更模型的權重以調整其預測,然後重試。這是訓練週期。因此,通過指定 epochs=50,它通過“loop' 50 次,如圖所示:
因此,到了第 50 個訓練週期時,模型會回報更高的精確度。本例顯示 99.1%!
步驟 7 - 匯出模型
訓練完成後,您就可以匯出模型。TensorFlow 會以自己的格式訓練模型,必須轉換成 TensorFlow.js 格式供網頁使用。只要將以下內容貼到新的儲存格中,再執行:
model.export(export_dir="/js_export/", export_format=[ExportFormat.TFJS, ExportFormat.LABEL, ExportFormat.VOCAB])
!zip -r /js_export/ModelFiles.zip /js_export/
執行這個程式碼後,如果您按一下 Colab 左側的小資料夾圖示,即可前往先前匯出到上述資料夾 (位於根目錄 - 您可能需要前往該層級),然後找出 ModelFiles.zip
中已匯出檔案的 ZIP 檔案組合。
立即將 ZIP 檔案下載至您的電腦,因為檔案與第一個程式碼研究室一樣:
漂亮!Python 部分內容已結束,您現在可以回到您熟悉且喜愛的 JavaScript 土地。好啊!
5. 提供全新的機器學習模型
您現在可以開始載入模型了。在此之前,您必須上傳先前在程式碼研究室中下載的新模型檔案,以便代管並可在程式碼中使用。
首先,請先下載您剛剛執行過的 Model Maker Colab 筆記本下載的模型檔案。您應該會在下列資料夾中看到下列檔案:
你有哪些功能?
model.json
- 這些是構成訓練 TensorFlow.js 模型的其中一個檔案。您將會在 JS 程式碼中參照這個特定檔案。group1-shard1of1.bin
- 此二進位檔案包含已匯出的 TensorFlow.js 模型的大量儲存資料,因此必須儲存在伺服器中的某個位置,才能下載至上述的model.json
目錄。vocab
- 這個無副檔名的奇怪檔案是「模型製作工具」提供的一些內容,目的是說明如何將句子中的文字編碼,讓模型瞭解如何使用這些文字。下一節會進一步說明。labels.txt
:這個模型只包含模型預測後產生的類別名稱。開啟這個文字模式後,如果您在文字編輯器中開啟這個檔案,該檔案只會出現「false」和「true」字樣,代表「非垃圾郵件」或「垃圾郵件」是預測的輸出結果。
代管 TensorFlow.js 模型檔案
首先請將 model.json
和 *.bin
檔案產生在網路伺服器上,這樣您就可以透過網頁存取這些檔案。
刪除現有模型檔案
由於您是本系列中第一個程式碼研究室的最終建構,因此必須先刪除已上傳的現有模型檔案。如果您使用的是 Glitch.com,只需查看左側的「model.json
」和「group1-shard1of1.bin
」檔案面板,按一下個別檔案的三點選單下拉式選單,然後選取 [刪除] 即可,如下所示:
將新檔案上傳到 Glitch
漂亮!現在,請上傳新的:
- 開啟 Glitch 專案左側面板的 assets 資料夾,然後刪除名稱相同的所有舊資產。
- 按一下 [上傳素材資源],然後選取
group1-shard1of1.bin
即可上傳到這個資料夾。完成上述步驟後:
- 漂亮!現在,也可以替 Model.json 檔案進行相同設定,這樣素材資源檔案中應該有 2 個檔案,如下所示:
- 只要按一下剛才上傳的
group1-shard1of1.bin
檔案,即可將網址複製到該檔案的位置。立即複製此路徑,如下所示:
- 現在,按一下畫面左下方的 [Tools] (工具) > [Terminal] (終端機)。等待終端機視窗載入。
- 載入後,輸入以下內容並按下 Enter 鍵,將目錄變更為
www
資料夾:
terminal:
cd www
- 接著,使用
wget
下載您剛上傳的 2 個檔案,方法是將下列網址替換為 Glitch 資產資料夾中你為檔案產生的網址 (請檢查每個檔案的資產資料夾。
請注意,這兩個網址之間的空間和需要使用的網址不同,如下所示:
terminal
wget https://cdn.glitch.com/1cb82939-a5dd-42a2-9db9-0c42cab7e407%2Fmodel.json?v=1616111344958 https://cdn.glitch.com/1cb82939-a5dd-42a2-9db9-0c42cab7e407%2Fgroup1-shard1of1.bin?v=1616017964562
很棒!您已成功建立已上傳至 www
資料夾的檔案副本。
但現在只會以奇怪的名稱下載。如果您在終端機中輸入 ls
並按下 Enter 鍵,就會看到如下內容:
- 使用
mv
指令重新命名檔案。請在主控台輸入以下內容,然後在每一行之後按下 Enter 鍵:
terminal:
mv *group1-shard1of1.bin* group1-shard1of1.bin
mv *model.json* model.json
- 最後,在終端機上輸入
refresh
來重新整理 Glitch 專案,然後按下 Enter 鍵:
terminal:
refresh
重新整理後,您應該會在使用者介面的 www
資料夾中看到 model.json
和 group1-shard1of1.bin
:
漂亮!最後一步是更新 dictionary.js
檔案。
- 透過文字編輯器或自行使用這項工具,將新下載的 vocab 檔案轉換成正確的 JS 格式,並在
www
資料夾中將產生的輸出內容儲存為dictionary.js
。如果您已經擁有dictionary.js
檔案,只要將檔案內容複製貼上,即可儲存檔案。
太厲害了!您已成功更新所有變更檔案。現在,如果您嘗試使用網站,可看到經過重新訓練的模型如何找出從探索到且發現的邊緣情況,如下所示:
如您所見,前 6 個現在正複分化為非垃圾,第 6 批全部都被診斷為垃圾消息。太完美了!
你也可以嘗試一些變化,看看結果是否較籠統。原先的失敗語句如下:
[quot;omg GOOG 股票就對了!太晚了!」
如此一來,系統現在會將郵件正確歸類為垃圾郵件,但如果改用下列設定,會發生什麼事?
[quot;所以 XYZ 的庫存剛增加!立即購買,以免遲到!
如此一來,即使預測符號與字詞的用語稍有不同,系統仍可能將 98% 的垃圾內容判定為垃圾內容。
當然,如果真的嘗試打破這個新模式,你將能夠收集到更多的訓練資料,這樣在收集線上病網時,也更有機會收集更多獨特的變化。在未來的程式碼研究室中,我們將示範如何在標記標記的即時資料中持續改善模型。
6. 恭喜!
恭喜!您已重新訓練現有的機器學習模型,以便根據自己找到的邊緣情況自行更新模型,並使用 TensorFlow.js 在瀏覽器中進行這些變更,以實際執行應用程式。
重點回顧
在本程式碼研究室中,您:
- 發現使用邊緣式垃圾留言模型時,無法正常運作的邊緣
- 重新訓練 Model Maker 模型,將找到的邊緣案例列入考量
- 將新的訓練模型匯出為 TensorFlow.js 格式
- 已更新網頁應用程式以使用新檔案
後續步驟
因此,這項更新作業相當實用,不過就跟所有網路應用程式一樣,變更會隨時間改變。這樣可以更棒地持續改善應用程式,而不需要每次都手動手動操作。您認為有 100 則新留言被歸類為錯誤分類後,可以如何自動重新訓練模型?您可以善用一般的網頁工程帽,或許還能知道該如何建立管道,讓系統自動執行這項作業。如果還不擔心,請觀看本系列的下一個程式碼研究室,瞭解相關做法。
與我們分享您的成果
您也可以根據目前其他創意應用實例輕鬆調整目前製作的內容。不過,我們鼓勵您花太多心力思考新方法,並克服駭客入侵的問題。
別忘了使用 #MadeWithTFJS 主題標記在社交媒體上標記我們,這樣你的專案就有機會出現在 TensorFlow 網誌上,甚至還能在未來活動中顯示。我們非常期待看到你的創作內容。
可提供更多的 TensorFlow.js 程式碼研究室
結帳網站
- TensorFlow.js 官方網站
- TensorFlow.js 預製模型
- TensorFlow.js API
- TensorFlow.js Show & Tell - 汲取靈感,觀察他人製作的成果。