NLP問題一些庫的學習,tensorflow1.5、keras2.1.6、pytorch0.4.0
tensorflow1.5、keras2.1.6、pytorch0.4.0
1.tensorflow
tensorflow中文文件:連結地址
基本使用:
- 使用圖 (graph) 來表示計算任務.
- 在被稱之為
會話 (Session)
的上下文 (context) 中執行圖. - 使用 tensor 表示資料.
- 通過
變數 (Variable)
維護狀態. - 使用 feed 和 fetch 可以為任意的操作(arbitrary operation) 賦值或者從其中獲取資料.
綜述
TensorFlow 是一個程式設計系統, 使用圖來表示計算任務. 圖中的節點被稱之為 op
Tensor
, 執行計算, 產生 0 個或多個 Tensor
. 每個 Tensor 是一個型別化的多維陣列. 例如, 你可以將一小組影象集表示為一個四維浮點數陣列, 這四個維度分別是 [batch, height, width, channels]
.
一個 TensorFlow 圖描述了計算的過程. 為了進行計算, 圖必須在 會話
裡被啟動. 會話
將圖的 op 分發到諸如 CPU 或 GPU 之類的 裝置
上, 同時提供執行 op 的方法. 這些方法執行後, 將產生的 tensor 返回. 在 Python 語言中, 返回的 tensor 是numpy ndarray
變數:建立、初始化、儲存和載入
當訓練模型時,用變數來儲存和更新引數。變數包含張量 (Tensor)存放於記憶體的快取區。建模時它們需要被明確地初始化,模型訓練後它們必須被儲存到磁碟。這些變數的值可在之後模型訓練和分析是被載入。
有tf.Variable類和tf.train.Saver類
建立
當建立一個常量或是隨機值。
注意,所有這些操作符都需要你指定張量的shape。那個形狀自動成為變數的shape。變數的shape通常是固定的,但TensorFlow提供了高階的機制來重新調整其行列數。
# Create two variables. weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35), name="weights") biases = tf.Variable(tf.zeros([200]), name="biases")
初始化
變數的初始化必須在模型的其它操作執行之前先明確地完成。最簡單的方法就是新增一個給所有變數初始化的操作,並在使用模型之前首先執行那個操作。
你或者可以從檢查點檔案中重新獲取變數值,詳見下文。
使用tf.initialize_all_variables()
新增一個操作對變數做初始化。記得在完全構建好模型並載入之後再執行那個操作。
# Create two variables.
weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35),
name="weights")
biases = tf.Variable(tf.zeros([200]), name="biases")
...
# Add an op to initialize the variables.
init_op = tf.initialize_all_variables()
# Later, when launching the model
with tf.Session() as sess:
# Run the init operation.
sess.run(init_op)
...
# Use the model
...
由另一個變數初始化
你有時候會需要用另一個變數的初始化值給當前變數初始化。由於tf.initialize_all_variables()
是並行地初始化所有變數,所以在有這種需求的情況下需要小心。
用其它變數的值初始化一個新的變數時,使用其它變數的initialized_value()
屬性。你可以直接把已初始化的值作為新變數的初始值,或者把它當做tensor計算得到一個值賦予新變數。
# Create a variable with a random value.
weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35),
name="weights")
# Create another variable with the same value as 'weights'.
w2 = tf.Variable(weights.initialized_value(), name="w2")
# Create another variable with twice the value of 'weights'
w_twice = tf.Variable(weights.initialized_value() * 0.2, name="w_twice")
儲存變數
用tf.train.Saver()
建立一個Saver
來管理模型中的所有變數。
# Create some variables.
v1 = tf.Variable(..., name="v1")
v2 = tf.Variable(..., name="v2")
...
# Add an op to initialize the variables.
init_op = tf.initialize_all_variables()
# Add ops to save and restore all the variables.
saver = tf.train.Saver()
# Later, launch the model, initialize the variables, do some work, save the
# variables to disk.
with tf.Session() as sess:
sess.run(init_op)
# Do some work with the model.
..
# Save the variables to disk.
save_path = saver.save(sess, "/tmp/model.ckpt")
print "Model saved in file: ", save_path
恢復變數
用同一個Saver
物件來恢復變數。注意,當你從檔案中恢復變數時,不需要事先對它們做初始化。
# Create some variables.
v1 = tf.Variable(..., name="v1")
v2 = tf.Variable(..., name="v2")
...
# Add ops to save and restore all the variables.
saver = tf.train.Saver()
# Later, launch the model, use the saver to restore variables from disk, and
# do some work with the model.
with tf.Session() as sess:
# Restore variables from disk.
saver.restore(sess, "/tmp/model.ckpt")
print "Model restored."
# Do some work with the model
...
2.keras
中文文件地址:連結地址
Keras 是一個用 Python 編寫的高階神經網路 API,它能夠以 TensorFlow, CNTK, 或者 Theano 作為後端執行。Keras 的開發重點是支援快速的實驗。能夠以最小的時延把你的想法轉換為實驗結果,是做好研究的關鍵。
如果你在以下情況下需要深度學習庫,請使用 Keras:
- 允許簡單而快速的原型設計(由於使用者友好,高度模組化,可擴充套件性)。
- 同時支援卷積神經網路和迴圈神經網路,以及兩者的組合。
- 在 CPU 和 GPU 上無縫執行。
快速開始:30 秒上手 Keras
Keras 的核心資料結構是 model,一種組織網路層的方式。最簡單的模型是 Sequential
順序模型,它是由多個網路層線性堆疊的棧。對於更復雜的結構,你應該使用 Keras 函式式 API,它允許構建任意的神經網路圖。
Sequential
順序模型如下所示:
from keras.models import Sequential
model = Sequential()
可以簡單地使用 .add()
來堆疊模型:
from keras.layers import Dense
model.add(Dense(units=64, activation='relu', input_dim=100))
model.add(Dense(units=10, activation='softmax'))
在完成了模型的構建後, 可以使用 .compile()
來配置學習過程:
model.compile(loss='categorical_crossentropy',
optimizer='sgd',
metrics=['accuracy'])
如果需要,你還可以進一步地配置你的優化器。Keras 的核心原則是使事情變得相當簡單,同時又允許使用者在需要的時候能夠進行完全的控制(終極的控制是原始碼的易擴充套件性)。
model.compile(loss=keras.losses.categorical_crossentropy,
optimizer=keras.optimizers.SGD(lr=0.01, momentum=0.9, nesterov=True))
現在,你可以批量地在訓練資料上進行迭代了:
# x_train 和 y_train 是 Numpy 陣列 -- 就像在 Scikit-Learn API 中一樣。
model.fit(x_train, y_train, epochs=5, batch_size=32)
或者,你可以手動地將批次的資料提供給模型:
model.train_on_batch(x_batch, y_batch)
只需一行程式碼就能評估模型效能:
loss_and_metrics = model.evaluate(x_test, y_test, batch_size=128)
或者對新的資料生成預測:
classes = model.predict(x_test, batch_size=128)
開始使用 Keras 順序 (Sequential) 模型
順序模型是多個網路層的線性堆疊。
你可以通過將層的列表傳遞給 Sequential
的建構函式,來建立一個 Sequential 模型:
from keras.models import Sequential
from keras.layers import Dense, Activation
model = Sequential([
Dense(32, input_shape=(784,)),
Activation('relu'),
Dense(10),
Activation('softmax'),
])
也可以使用 .add()
方法將各層新增到模型中:
model = Sequential()
model.add(Dense(32, input_dim=784))
model.add(Activation('relu'))
指定輸入資料的尺寸
模型需要知道它所期望的輸入的尺寸。出於這個原因,順序模型中的第一層(只有第一層,因為下面的層可以自動地推斷尺寸)需要接收關於其輸入尺寸的資訊。有幾種方法來做到這一點:
- 傳遞一個
input_shape
引數給第一層。它是一個表示尺寸的元組 (一個整數或None
的元組,其中None
表示可能為任何正整數)。在input_shape
中不包含資料的 batch 大小。 - 某些 2D 層,例如
Dense
,支援通過引數input_dim
指定輸入尺寸,某些 3D 時序層支援input_dim
和input_length
引數。 - 如果你需要為你的輸入指定一個固定的 batch 大小(這對 stateful RNNs 很有用),你可以傳遞一個
batch_size
引數給一個層。如果你同時將batch_size=32
和input_shape=(6, 8)
傳遞給一個層,那麼每一批輸入的尺寸就為(32,6,8)
。
因此,下面的程式碼片段是等價的:
model = Sequential()
model.add(Dense(32, input_shape=(784,)))
model = Sequential()
model.add(Dense(32, input_dim=784))
編譯
在訓練模型之前,您需要配置學習過程,這是通過 compile
方法完成的。它接收三個引數:
- 優化器 optimizer。它可以是現有優化器的字串識別符號,如
rmsprop
或adagrad
,也可以是 Optimizer 類的例項。詳見:optimizers。 - 損失函式 loss,模型試圖最小化的目標函式。它可以是現有損失函式的字串識別符號,如
categorical_crossentropy
或mse
,也可以是一個目標函式。詳見:losses。 - 評估標準 metrics。對於任何分類問題,你都希望將其設定為
metrics = ['accuracy']
。評估標準可以是現有的標準的字串識別符號,也可以是自定義的評估標準函式。
# 多分類問題
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
# 二分類問題
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy'])
# 均方誤差迴歸問題
model.compile(optimizer='rmsprop',
loss='mse')
# 自定義評估標準函式
import keras.backend as K
def mean_pred(y_true, y_pred):
return K.mean(y_pred)
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy', mean_pred])
關於Keras模型
在 Keras 中有兩類模型:Sequential 順序模型 和 使用函式式 API 的 Model 類模型。
Pytorch
中文文件地址:連結地址
三個框架對比
作者:Scofield
連結:https://www.zhihu.com/question/35396126/answer/308575020
來源:知乎
特點:
- tf:優雅,好理解
- pytorch:定製性好,可DIY指數高
- theano:定製性好,但需要充分造輪子
- keras:非常優雅、最易學好懂,可快速上手實現正常規矩的網路結構。
框架api難易順序(難->易):
theano -> tf -> pytorch -> keras