* [ ] 每個**單詞**與一個唯一的**整數索引**相關聯
* [ ] 這個**整數索引*i***轉換為長度為*N*的**二進制向量**(*N*是詞表大小)
這個向量只有第*i*個元素是 1,其余元素都為 0
*****
**單詞級的 one-hot 編碼**
~~~
import numpy as np
samples = ['The cat sat on the mat.', 'The dog ate my homework.']
#初始數據:每個樣本是列表的一個元素(本例中的樣本是一個句子,但也可以是一整篇文檔)
token_index = {} #構建數據中所有標記的索引
for sample in samples:
for word in sample.split():
#利用split方法對樣本進行分詞。在實際應用中,還需要從樣本中去掉標點和特殊字符
if word not in token_index:
token_index[word] = len(token_index) + 1
#為每個唯一單詞指定一個唯一索引。注意,沒有為索引編號0指定單詞
max_length = 10 #對樣本進行分詞。只考慮每個樣本前max_length個單詞
results = np.zeros(shape=(len(samples),
max_length,
max(token_index.values()) + 1)) #將結果保存在results中
for i, sample in enumerate(samples):
for j, word in list(enumerate(sample.split()))[:max_length]:
index = token_index.get(word)
results[i, j, index] = 1.
~~~
**字符級的 one-hot 編碼**
~~~
import string
import numpy as np
samples = ['The cat sat on the mat.', 'The dog ate my homework.']
characters = string.printable #所有可打印的ASCII字符
token_index = dict(zip(range(1, len(characters) + 1), characters))
max_length = 50
results = np.zeros((len(samples), max_length, max(token_index.keys()) + 1))
for i, sample in enumerate(samples):
for j, character in enumerate(sample):
index = token_index.get(character)
results[i, j, index] = 1.
~~~
**Keras 實現單詞級的 one-hot 編碼**
* Keras 的內置函數可以對原始文本數據進行單詞級或字符級的 one-hot 編碼
* 實現了許多重要的特性,比如從字符串中去除特殊字符、只考慮數據集中前*N*個最常見的單詞(這是一種常用的限制,以避免處理非常大的輸入向量空間)
~~~
from keras.preprocessing.text import Tokenizer
samples = ['The cat sat on the mat.', 'The dog ate my homework.']
tokenizer = Tokenizer(num_words=1000)
#創建一個分詞器(tokenizer),設置為只考慮前1000個最常見的單詞
tokenizer.fit_on_texts(samples) #構建單詞索引
sequences = tokenizer.texts_to_sequences(samples)
#將字符串轉換為整數索引組成的列表
one_hot_results = tokenizer.texts_to_matrix(samples, mode='binary')
#也可以直接得到one-hot二進制表示。這個分詞器也支持除one-hot編碼外的其他向量化模式
word_index = tokenizer.word_index #找回單詞索引
~~~
**one-hot 散列技巧**(one-hot hashing trick)
* 詞表中唯一標記的數量太大而無法直接處理
* 將單詞散列編碼為固定長度的向量,通常用一個非常簡單的散列函數來實現
* 優點:避免了維護一個顯式的單詞索引,從而節省內存并允許數據的在線編碼(在讀取完所有數據之前,你就可以立刻生成標記向量)
* 缺點:可能會出現**散列沖突**(hash collision),即兩個不同的單詞可能具有相同的散列值,隨后任何機器學習模型觀察這些散列值,都無法區分它們所對應的單詞。
* 如果散列空間的維度遠大于需要散列的唯一標記的個數,散列沖突的可能性會減小。
~~~
import numpy as np
samples = ['The cat sat on the mat.', 'The dog ate my homework.']
dimensionality = 1000
#將單詞保存為長度為1000的向量。
# 如果單詞數量接近1000個(或更多),那么會遇到很多散列沖突,這會降低這種編碼方法的準確性
max_length = 10
results = np.zeros((len(samples), max_length, dimensionality))
for i, sample in enumerate(samples):
for j, word in list(enumerate(sample.split()))[:max_length]:
index = abs(hash(word)) % dimensionality
#將單詞散列為0~1000范圍內的一個隨機整數索引
results[i, j, index] = 1.
~~~
- 基礎
- 張量tensor
- 整數序列(列表)=>張量
- 張量運算
- 張量運算的幾何解釋
- 層:深度學習的基礎組件
- 模型:層構成的網絡
- 訓練循環 (training loop)
- 數據類型與層類型、keras
- Keras
- Keras 開發
- Keras使用本地數據
- fit、predict、evaluate
- K 折 交叉驗證
- 二分類問題-基于梯度的優化-訓練
- relu運算
- Dens
- 損失函數與優化器:配置學習過程的關鍵
- 損失-二分類問題
- 優化器
- 過擬合 (overfit)
- 改進
- 小結
- 多分類問題
- 回歸問題
- 章節小結
- 機械學習
- 訓練集、驗證集和測試集
- 三種經典的評估方法
- 模型評估
- 如何準備輸入數據和目標?
- 過擬合與欠擬合
- 減小網絡大小
- 添加權重正則化
- 添加 dropout 正則化
- 通用工作流程
- 計算機視覺
- 卷積神經網絡
- 卷積運算
- 卷積的工作原理
- 訓練一個卷積神經網絡
- 使用預訓練的卷積神經網絡
- VGG16
- VGG16詳細結構
- 為什么不微調整個卷積基?
- 卷積神經網絡的可視化
- 中間輸出(中間激活)
- 過濾器
- 熱力圖
- 文本和序列
- 處理文本數據
- n-gram
- one-hot 編碼 (one-hot encoding)
- 標記嵌入 (token embedding)
- 利用 Embedding 層學習詞嵌入
- 使用預訓練的詞嵌入
- 循環神經網絡
- 循環神經網絡的高級用法
- 溫度預測問題
- code
- 用卷積神經網絡處理序列
- GRU 層
- LSTM層
- 多輸入模型
- 回調函數
- ModelCheckpoint 與 EarlyStopping
- ReduceLROnPlateau
- 自定義回調函數
- TensorBoard_TensorFlow 的可視化框架
- 高級架構模式
- 殘差連接
- 批標準化
- 批再標準化
- 深度可分離卷積
- 超參數優化
- 模型集成
- LSTM
- DeepDream
- 神經風格遷移
- 變分自編碼器
- 生成式對抗網絡
- 術語表