使用OneFlow搭建神经网络
使用OneFlow搭建神經網絡
在 識別 MNIST 手寫體數字 的例子中,通過 flow.layers 和 flow.nn 中提供的接口搭建了一個簡單的 LeNet 網絡。下面,將通過LeNet來介紹 Onflow 中網絡搭建的核心元素—算子(op)和層(layer)。
LeNet 是一個主要由卷積層、池化層和全連接層組成的神經網絡。
上圖中有兩類元素,一類是方框代表的運算單元,包括 op 和 layer 兩類,比如 conv2d 、 dense 、 max_pool2d 等;一類是箭頭代表的數據。對應了以下代碼:
def lenet(data, train=False):
initializer = flow.truncated_normal(0.1)
conv1 = flow.layers.conv2d(
data,
32,
5,
padding=“SAME”,
activation=flow.nn.relu,
name=“conv1”,
kernel_initializer=initializer,
)
pool1 = flow.nn.max_pool2d(
conv1, ksize=2, strides=2, padding=“SAME”, name=“pool1”, data_format=“NCHW”
)
conv2 = flow.layers.conv2d(
pool1,
64,
5,
padding=“SAME”,
activation=flow.nn.relu,
name=“conv2”,
kernel_initializer=initializer,
)
pool2 = flow.nn.max_pool2d(
conv2, ksize=2, strides=2, padding=“SAME”, name=“pool2”, data_format=“NCHW”
)
reshape = flow.reshape(pool2, [pool2.shape[0], -1])
hidden = flow.layers.dense(
reshape,
512,
activation=flow.nn.relu,
kernel_initializer=initializer,
name=“dense1”,
)
if train:
hidden = flow.nn.dropout(hidden, rate=0.5, name=“dropout”)
return flow.layers.dense(hidden, 10, kernel_initializer=initializer, name=“dense2”)
作業函數運行時,data 是形狀為 100x1×28×28 的數據,data 首先作為 conv2d 的輸入參與卷積計算,得到計算結果conv1 ,然后 conv1 作為輸入傳給 max_pool2d ,依此類推。
op 和 layer
算子(Op)是比較常用的一種概念,是 OneFlow 中基本的運算單元,上文代碼中的 reshape 和 nn.max_pool2d 就是兩種算子。
layers.conv2d 和 layers.dense 不是基本的運算單元,由算子組合成的特定的運算層(layer)。層的存在使得搭建神經網絡更方便,相關接口使用請參考 oneflow.layers API。
通過閱讀 oneflow.layers 源碼 ,可以學習由基本算子構建運算層的細節。
網絡構建過程中的數據塊
OneFlow 默認模式是靜態圖機制,網絡的構建和運行過程其實是分開的。因此,在定義網絡時,各個變量中 并沒有 真實的數據,只是數據的占位符。對于真實數據的計算發生在作業函數的調用過程中。
在構建網絡時,只是描述了網絡中各個節點的性質、形狀(如 shape、dtype)與連接關系等,這些節點中沒有具體的數值,僅僅只是 數據占位符, OneFlow 可以根據這種數據占位符進行編譯推理,得到計算圖。
這種數據占位符在 OneFlow 的語境中被稱作 Blob ,在 OneFlow 中有對應的基類 BlobDef。
搭建網絡時可以打印 Blob 的屬性,比如以下代碼打印 conv1 的 shape 和 dtype :
print(conv1.shape, conv1.dtype)
Blob 的運算符重載 BlobDef 中定義了運算符重載,也就是說,BlobDef 對象之間可以進行加減乘除等操作。
例如下面這句代碼中的加號:
output = output + fc2_biases
這句代碼等價于:
output = flow.broadcast_add(output, fc2_biases)
總結
使用 OneFlow 進行神經網絡搭建,需要 OneFlow 提供的算子或層作為計算單元。數據占位符 Blob 作為算子和層的輸入和輸出,運算符重載幫助簡化了部分語句。
OneFlow 提供的算子可以參閱 API 文檔中的:oneflow.nn、oneflow.math、oneflow.layers 等模塊。
總結
以上是生活随笔為你收集整理的使用OneFlow搭建神经网络的全部內容,希望文章能夠幫你解決所遇到的問題。