
- Microsoft Cognitive Toolkit (CNTK) 教程
- 首頁
- 介紹
- 入門
- CPU 和 GPU
- CNTK - 序列分類
- CNTK - 邏輯迴歸模型
- CNTK - 神經網路 (NN) 概念
- CNTK - 建立第一個神經網路
- CNTK - 訓練神經網路
- CNTK - 記憶體資料集和大型資料集
- CNTK - 效能測量
- 神經網路分類
- 神經網路二元分類
- CNTK - 神經網路迴歸
- CNTK - 分類模型
- CNTK - 迴歸模型
- CNTK - 記憶體不足的資料集
- CNTK - 監控模型
- CNTK - 卷積神經網路
- CNTK - 迴圈神經網路
- Microsoft Cognitive Toolkit 資源
- Microsoft Cognitive Toolkit - 快速指南
- Microsoft Cognitive Toolkit - 資源
- Microsoft Cognitive Toolkit - 討論
CNTK - 序列分類
本章將詳細講解 CNTK 中的序列及其分類。
張量
CNTK 工作的基礎概念是張量。基本上,CNTK 的輸入、輸出以及引數都組織為張量,通常被認為是廣義矩陣。每個張量都有一個秩 -
秩為 0 的張量是標量。
秩為 1 的張量是向量。
秩為 2 的張量是矩陣。
這裡,這些不同的維度被稱為軸。
靜態軸和動態軸
顧名思義,靜態軸在整個網路的生命週期中長度相同。另一方面,動態軸的長度在不同的例項之間可能會有所不同。事實上,在呈現每個小批次之前,通常不知道它們的長度。
動態軸與靜態軸類似,因為它們也定義了張量中包含數字的有意義的組合。
示例
為了更清楚地說明,讓我們看看如何在 CNTK 中表示短影片剪輯的小批次。假設影片剪輯的解析度都是 640 * 480。而且,剪輯也是彩色的,通常用三個通道編碼。這意味著我們的迷你批次具有以下內容:
長度分別為 640、480 和 3 的 3 個靜態軸。
兩個動態軸;影片的長度和迷你批次軸。
這意味著,如果一個迷你批次包含 16 個影片,每個影片長 240 幀,則將表示為16*240*3*640*480 張量。
在 CNTK 中使用序列
讓我們首先了解長短期記憶網路,然後理解 CNTK 中的序列。
長短期記憶網路 (LSTM)

長短期記憶 (LSTM) 網路由 Hochreiter & Schmidhuber 提出。它解決了使基本迴圈層長時間記住事物的問題。LSTM 的架構如上圖所示。我們可以看到它具有輸入神經元、記憶單元和輸出神經元。為了克服梯度消失問題,長短期記憶網路使用顯式記憶單元(儲存先前值)和以下門:
遺忘門 - 顧名思義,它告訴記憶單元忘記先前的值。記憶單元儲存值,直到門,即“遺忘門”告訴它忘記它們。
輸入門 - 顧名思義,它向單元新增新內容。
輸出門 - 顧名思義,輸出門決定何時將向量從單元傳遞到下一個隱藏狀態。
在 CNTK 中使用序列非常容易。讓我們透過以下示例來了解它:
import sys import os from cntk import Trainer, Axis from cntk.io import MinibatchSource, CTFDeserializer, StreamDef, StreamDefs,\ INFINITELY_REPEAT from cntk.learners import sgd, learning_parameter_schedule_per_sample from cntk import input_variable, cross_entropy_with_softmax, \ classification_error, sequence from cntk.logging import ProgressPrinter from cntk.layers import Sequential, Embedding, Recurrence, LSTM, Dense def create_reader(path, is_training, input_dim, label_dim): return MinibatchSource(CTFDeserializer(path, StreamDefs( features=StreamDef(field='x', shape=input_dim, is_sparse=True), labels=StreamDef(field='y', shape=label_dim, is_sparse=False) )), randomize=is_training, max_sweeps=INFINITELY_REPEAT if is_training else 1) def LSTM_sequence_classifier_net(input, num_output_classes, embedding_dim, LSTM_dim, cell_dim): lstm_classifier = Sequential([Embedding(embedding_dim), Recurrence(LSTM(LSTM_dim, cell_dim)), sequence.last, Dense(num_output_classes)]) return lstm_classifier(input) def train_sequence_classifier(): input_dim = 2000 cell_dim = 25 hidden_dim = 25 embedding_dim = 50 num_output_classes = 5 features = sequence.input_variable(shape=input_dim, is_sparse=True) label = input_variable(num_output_classes) classifier_output = LSTM_sequence_classifier_net( features, num_output_classes, embedding_dim, hidden_dim, cell_dim) ce = cross_entropy_with_softmax(classifier_output, label) pe = classification_error(classifier_output, label) rel_path = ("../../../Tests/EndToEndTests/Text/" + "SequenceClassification/Data/Train.ctf") path = os.path.join(os.path.dirname(os.path.abspath(__file__)), rel_path) reader = create_reader(path, True, input_dim, num_output_classes) input_map = { features: reader.streams.features, label: reader.streams.labels } lr_per_sample = learning_parameter_schedule_per_sample(0.0005) progress_printer = ProgressPrinter(0) trainer = Trainer(classifier_output, (ce, pe), sgd(classifier_output.parameters, lr=lr_per_sample),progress_printer) minibatch_size = 200 for i in range(255): mb = reader.next_minibatch(minibatch_size, input_map=input_map) trainer.train_minibatch(mb) evaluation_average = float(trainer.previous_minibatch_evaluation_average) loss_average = float(trainer.previous_minibatch_loss_average) return evaluation_average, loss_average if __name__ == '__main__': error, _ = train_sequence_classifier() print(" error: %f" % error)
average since average since examples loss last metric last ------------------------------------------------------ 1.61 1.61 0.886 0.886 44 1.61 1.6 0.714 0.629 133 1.6 1.59 0.56 0.448 316 1.57 1.55 0.479 0.41 682 1.53 1.5 0.464 0.449 1379 1.46 1.4 0.453 0.441 2813 1.37 1.28 0.45 0.447 5679 1.3 1.23 0.448 0.447 11365 error: 0.333333
上述程式的詳細解釋將在接下來的章節中介紹,尤其是在構建迴圈神經網路時。