1. 程式人生 > >NLP問題一些庫的學習,tensorflow1.5、keras2.1.6、pytorch0.4.0

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

 (operation 的縮寫). 一個 op 獲得 0 個或多個 Tensor, 執行計算, 產生 0 個或多個 Tensor. 每個 Tensor 是一個型別化的多維陣列. 例如, 你可以將一小組影象集表示為一個四維浮點數陣列, 這四個維度分別是 [batch, height, width, channels].

一個 TensorFlow 圖描述了計算的過程. 為了進行計算, 圖必須在 會話 裡被啟動. 會話 將圖的 op 分發到諸如 CPU 或 GPU 之類的 裝置 上, 同時提供執行 op 的方法. 這些方法執行後, 將產生的 tensor 返回. 在 Python 語言中, 返回的 tensor 是numpy ndarray

 物件(python)。


變數:建立、初始化、儲存和載入

當訓練模型時,用變數來儲存和更新引數。變數包含張量 (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,它能夠以 TensorFlowCNTK, 或者 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
來源:知乎

特點

  1. tf:優雅,好理解
  2. pytorch:定製性好,可DIY指數高
  3. theano:定製性好,但需要充分造輪子
  4. keras:非常優雅、最易學好懂,可快速上手實現正常規矩的網路結構。

框架api難易順序(難->易)

theano -> tf -> pytorch -> keras