Skip to content

Commit

Permalink
add 9 RNN temp
Browse files Browse the repository at this point in the history
  • Loading branch information
yenlung committed May 10, 2019
1 parent 48e022d commit 6098e00
Show file tree
Hide file tree
Showing 5 changed files with 370 additions and 36 deletions.
2 changes: 1 addition & 1 deletion 01. 用 Python 畫個圖.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -403,7 +403,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.5"
"version": "3.6.7"
}
},
"nbformat": 4,
Expand Down
2 changes: 1 addition & 1 deletion 03. Python 資料分析主流環境 Jupyter.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -974,7 +974,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.6"
"version": "3.6.7"
}
},
"nbformat": 4,
Expand Down
66 changes: 33 additions & 33 deletions 06. 迴歸函數生成機.ipynb

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion 07. 標準神經網路做手寫辨識.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -1058,7 +1058,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.6"
"version": "3.6.7"
}
},
"nbformat": 4,
Expand Down
334 changes: 334 additions & 0 deletions 09. 用RNN做情意分析.ipynb
Original file line number Diff line number Diff line change
@@ -0,0 +1,334 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"我們終於要介紹三大神經網路的最後一個, 也就是 RNN。RNN 有不少的變型, 例如 LSTM 和 GRU 等等, 不過我們都通稱叫 RNN。RNN 是一種「有記憶」的神經網路, 非常適合時間序列啦, 或是不定長度的輸入資料。\n",
"\n",
"我們來看看怎麼樣用 RNN 做電影評論的「情意分析」, 也就是知道一則評論究竟是「正評」還是「負評」。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 09-01 初始準備\n",
"\n",
"基本上和之前是一樣的, 我們就不再說明。"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"env: KERAS_BACKEND=tensorflow\n"
]
}
],
"source": [
"%env KERAS_BACKEND=tensorflow"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"nbpresent": {
"id": "a73ce944-1f06-4b48-91eb-da5ff43936f9"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 09-02 讀入 IMDB 電影數據庫\n",
"\n",
"今天我們要評入 IMDB 電影數據庫影評的部份。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"要注意這裡我們限制只選「最常用」1 萬字, 也就是超過這範圍的就當不存在。這是文字分析常會做的事。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 輸入資料部份\n",
"\n",
"我們來看一下輸入部份長什麼樣子?"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"注意這其實是一個 list 而不是 array, 原因是每筆資料 (每段影評) 長度自然是不一樣的! 我們檢查一下前 10 筆的長度就可以知道。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"最後要說明的是, 在每筆輸入資料的數字都代表英文的一個單字。編號方式是在我們資料庫裡所有文字的排序: 也就是出現頻率越高, 代表的數字就越小。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 輸出資料部份\n",
"\n",
"輸出方面應該很容易想像, 我們來看看前 10 筆。結果自然就是 0 (負評) 或 1 (正評)。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 送入神經網路的輸入處理\n",
"\n",
"雖然 RNN 是可以處理不同長度的輸入, 在寫程式時我們還是要\n",
"\n",
"* 設輸入文字長度的上限\n",
"* 把每段文字都弄成一樣長, 太短的後面補上 0"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"至此我們可以來寫我們的第一個 RNN 了!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 09-03 打造你的 RNN\n",
"\n",
"這裡我們選用 LSTM, 基本上用哪種 RNN 寫法都是差不多的!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 決定神經網路架構\n",
"\n",
"* 先將 10000 維的文字壓到 N 維\n",
"* 然後用 K 個 LSTM 神經元做隱藏層\n",
"* 最後一個 output, 直接用 sigmoid 送出"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 建構我們的神經網路\n",
"\n",
"文字我們用 1-hot 表示是很標準的方式, 不過要注意的是, 因為我們指定要 1 萬個字, 所以每個字是用 1 萬維的向量表示! 這一來很浪費記憶空間, 二來字和字間基本上是沒有關係的。我們可以用某種「合理」的方式, 把字壓到比較小的維度, 這些向量又代表某些意思 (比如說兩個字代表的向量角度小表相關程度大) 等等。\n",
"\n",
"這聽來很複雜的事叫 \"word embedding\", 而事實上 Keras 會幫我們做。我們只需告訴 Keras 原來最大的數字是多少 (10000), 還有我們打算壓到幾維 (N)。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"LSTM 層, 我們做 K 個 LSTM Cells。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"單純透過 sigmoid 輸出。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 組裝\n",
"\n",
"這次我們用 binary_crossentropy 做我們的 loss function, 另外用一個很潮的 Adam 學習法。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 09-04 訓練"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"我們用的 embedding 中, 會被 batch_size 影響輸入。輸入的 shape 會是\n",
"\n",
" (batch_size, 每筆上限)\n",
" \n",
"也就是 (32,100) 輸出是 (32,100,128), 其中 128 是我們決定要壓成幾維的向量。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 09-05 檢視結果"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 分數\n",
"\n",
"我們照例來看看測試資料的分數。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 儲存結果\n",
"\n",
"這裡有 8 成我們可以正確分辨, 看來還不差, 照例我們把結果存檔。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"anaconda-cloud": {},
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.7"
}
},
"nbformat": 4,
"nbformat_minor": 2
}

0 comments on commit 6098e00

Please sign in to comment.