NLP3/4 主要是教如何建立NLP Model
主要教了RNN, LSTM, Bidirection(LSTM)
下面是LSTM model建立的範例, 相當的簡單, 也很好理解, NLP難的還是在data processing
#Bidirectional 雙向LSTM
#LSTM(64)是output有64個cell
#但是Bidirectional會double output變成128
model = tf.keras.Sequential([
tf.keras.layers.Embedding(tokenizer.vocab_size, 64),
tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(64)),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')
])
#使用多層LSTM, 需要加入return_sequences=True, 讓LSTM output另一個LSTM必須放入序列,
#否則的話就只是一堆沒有排序的cell
model = tf.keras.Sequential([
tf.keras.layers.Embedding(tokenizer.vocab_size, 64),
tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(64), return_sequences=True),
tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(32)),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')
])
對於文本預測其他選項
- CNN
- Gated Recurrent Unit (GRUs)
CNN的範例
model = tf.keras.Sequential([
tf.keras.layers.Embedding(tokenizer.vocab_size, 64),
tf.keras.layers.Conv1D(128, 5, activation='relu'), #有128個filter, 每個有5個word
tf.keras.layers.GlobalMaxPooling1D(),
tf.keras.layers.Dense(24, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')
])
因為kernel是5個字, 所以120個字的input到這裡就會被刮掉4個, 跟之前CNN一樣
GRU的範例
model = tf.keras.Sequential([
tf.keras.layers.Embedding(tokenizer.vocab_size, 64),
tf.keras.layers.Bidirectional(tf.keras.layers.GRU(32)),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')
])
一般來說文字會比圖片來得overfitting, 因為validate中很多是training data裡面沒有的東西
創造文本
其實創造文本就是預測接下來該出現的下一個字
會發現創造出來的, 會有很多是有重複性的詞 (可能跟副歌會重複有關)
當預測的長度越長, 會越來越變得胡言亂語, 因為中間都是預測生成的字
加大corpus會對這件事有幫助
但是太大的corpus會導致memory 崩潰
最後可以參考這個範例, 如果都看得懂的話應該對NLP沒甚麼問題
https://www.tensorflow.org/tutorials/text/text_generation
NLP沒有coding的exercise必須寫我很意外,
沒有練習可以去知道自己缺少了甚麼, 這代表這部分要自己強加練習