# 循環神經網絡層(RNN)
## 定義方式如下
~~~
{
# 層名
"name": "rnn_1",
# 層類型,循環神經網絡層 目前只支持 n->1 輸出
"type": "rnn",
# 神經元個數
"neurons_number": 128,
# 權重初始化方式 msra/xavier/gaussian
"weight_init": "msra"
},
~~~
## 參數說明:
name:層名稱,無限制,隨便取
type:層類型,必須為 `rnn`,區分大小寫
neurons_number:神經元個數
weight_init:權重初始化方式 ,必須為:`msra/xavier/gaussian`之一
* msra:何凱明初始化,主要針對relu激活函數
* xavier,Xavier初始化,主要針對tanh激活函數
* gaussian:高斯初始化,均值為0,方差為0.01的高斯分布
> 循環神經網絡層 目前只支持 n->1 輸出
## 完整例子
~~~
"""
預測下一個字母
"""
import numpy as np
np.random.seed(1337)
from AADeepLearning import AADeepLearning
# 網絡配置文件
config = {
# 初始學習率
"learning_rate": 0.001,
# 優化策略: sgd/momentum/rmsprop
"optimizer": "sgd",
# 訓練多少次
"number_iteration": 5000,
# 每次用多少個樣本訓練
"batch_size": 2,
# 迭代多少次打印一次信息
"display": 500,
}
net = [
{
# 層名
"name": "rnn_1",
# 層類型,循環神經網絡層 目前只支持 n->1 輸出
"type": "rnn",
# 神經元個數
"neurons_number": 128,
# 權重初始化方式 msra/xavier/gaussian
"weight_init": "msra"
},
{
# 層名
"name": "softmax",
# 層類型
"type": "softmax"
}
]
def str2onehot(str):
"""
字符串轉 one hot 向量
:param str: 字符串
:return: one hot 向量
"""
word2int = {'a': 0, 'b': 1, 'c': 2, 'd': 3, 'e': 4, 'f': 5, 'g': 6, 'h': 7, 'i': 8, 'j': 9, 'k': 10
, 'l': 11, 'm': 12, 'n': 13, 'o': 14, 'p': 15, 'q': 16, 'r': 17, 's': 18, 't': 19,
'u': 20, 'v': 21, 'w': 22, 'x': 23, 'y': 24, 'z': 25}
element_vector = [0] * 26
element_vector[word2int[str]] = 1
return element_vector
def onehot2str(element_vector):
"""
one hot 向量轉字符串
:param element_vector:one hot 向量
:return: 字符串
"""
int2word = {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f', 6: 'g', 7: 'h', 8: 'i',
9: 'j', 10: 'k', 11: 'l', 12: 'm', 13: 'n', 14: 'o', 15: 'p', 16: 'q', 17: 'r',
18: 's', 19: 't', 20: 'u', 21: 'v', 22: 'w', 23: 'x', 24: 'y', 25: 'z'}
i = np.argmax(element_vector)
return int2word[i]
def list2vector(x, y):
"""
列表轉one hot 向量
:param x: 數據
:param y: 標簽
:return: one hot 向量
"""
x_vector = np.zeros((len(x), len(x[0]), 26))
y_vector = np.zeros((len(y), 26))
for i, value in enumerate(x):
j = 0
for letter in value:
x_vector[i][j] = str2onehot(letter)
j = j + 1
y_vector[i] = str2onehot(y[i])
return x_vector, y_vector
x = ['abc', 'bcd', 'cde', 'def', 'efg', 'fgh', 'ghi', 'hij', 'ijk', 'jkl', 'klm', 'lmn', 'mno', 'nop', 'opq', 'pqr',
'qrs', 'rst', 'stu', 'tuv', 'uvw', 'vwx', 'wxy', 'xyz', 'yza', 'zab']
y = ['d', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
'a', 'b', 'c']
# 訓練數據
x_train, y_train = list2vector(x, y)
# 預測數據
x = ['bcd']
y = ['e']
x_test, y_test = list2vector(x, y)
print("x_train.shape:",x_train.shape)
print("y_train.shape:",y_train.shape)
print("x_test.shape:",x_test.shape)
print("y_test.shape:",y_test.shape)
# 定義模型,傳入網絡結構和配置項
AA = AADeepLearning(net=net, config=config)
# 訓練模型
AA.train(x_train=x_train, y_train=y_train)
# 使用測試集預測,返回概率分布和準確率, score:樣本在各個分類上的概率, accuracy:準確率
result, accuracy = AA.predict(x_test=x_test, y_test=y_test)
print("accuracy:", accuracy)
print("test letter: " + x[0])
print("true letter: " + y[0])
print("predict letter: " + onehot2str(result[0]))
~~~
> 經過實驗,RNN存在嚴重梯度消失的問題,所以只能完成數據量較小的任務,下一章將使用LSTM完成mnist識別
- 序言
- 安裝
- 快速體驗
- 配置
- 層(layer)
- 展平(flatten)
- 全連接(fully connected)
- 卷積(convolutional)
- 池化(pooling)
- 標準化(batch normalization)
- 失活(dropout)
- 循環(RNN)
- 長短期記憶(LSTM)
- 激活函數(activation)
- relu
- sigmoid
- tanh
- 損失(loss)
- 交叉熵損失(softmax)
- 折頁損失(SVM或Hinge)
- 優化器(optimizer)
- 帶動量學習率自適應(adam)
- 動量(momentum)
- 學習率自適應(rmsprop)
- 隨機梯度下降(sgd)
- 模型(model)
- 保存(save)
- 載入(reload)
- 繼續訓練(continue train)
- 數據集(datasets)
- 手寫數字(mnist)
- 時尚物品(Fashion-MNIST)
- 10種物體分類(cifar10)
- 100種物體分類(cifar100)
- 電影評論情感分類(imdb)
- 路透社新聞主題分類(reuters)
- 可視化(visualization)
- 損失曲線(loss)
- 準確率曲線(accuracy)