日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

mxnet创建新的操作(层)

發布時間:2025/3/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mxnet创建新的操作(层) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

mxnet創建新的操作(層)

這篇blog將會告訴你如何創建新的MXNet操作(層)。

我們竭盡所能提供最好的操作對于絕大多數的使用場景。然而,如果你發現自己需要自定義層,你有3個選擇:

1.使用原生的語言和它的矩陣庫(numpy in Python)。這不需要過多的能力和對MXNet的了解。但是他會影響性能。

2.使用原生的語言和mxnet.rtc和mxnet.ndarray。這將給你更好的性能,但是相應的你需要了解更多的MXNet的知識。你可以寫CUDA的內核通過Python的方式,并且在運行時進行編譯。

3.使用 C++/MShadow(CUDA).這需要你對MXNet,mshadow和Cuda都熟悉。(大神的選擇)


Python/Numpy

執行一個python里面的操作和c++里面的操作相似但是更簡單了。讓我們來創建一個softmax操作,我們通過用mxnet.operator.NumpyOp來開始,然后重寫一些方法。

首先,我們調用我們的基礎構造器使用need_top_grad=false:

class NumpySoftmax(mx.operator.NumpyOp):def __init__(self):super(NumpySoftmax, self).__init__(False)

這將告訴引擎我們不需要梯度來自后向傳播。

然后我們定義我們的輸入和輸出

def list_arguments(self):return ['data', 'label']def list_outputs(self):return ['output'] 我們推薦的參數排序方式

['input1',?'input2',?...?,?'weight1',?'weight2',?...]

接下去我們需要提供infer_shape來聲明我們的output/weight并且檢查輸入形狀的一致性。

def infer_shape(self, in_shape):data_shape = in_shape[0]label_shape = (in_shape[0][0],)output_shape = in_shape[0]return [data_shape, label_shape], [output_shape] 我們的第一個維度總是batch size。我們的標簽是一系列的整數,我們的輸出和輸入有相同的形狀大小。Infer_size應該返回兩列,即使他們是空的。

def forward(self, in_data, out_data):x = in_data[0]y = out_data[0]y[:] = np.exp(x - x.max(axis=1).reshape((x.shape[0], 1)))y /= y.sum(axis=1).reshape((x.shape[0], 1))def backward(self, out_grad, in_data, out_data, in_grad):l = in_data[1]l = l.reshape((l.size,)).astype(np.int)y = out_data[0]dx = in_grad[0]dx[:] = ydx[np.arange(l.shape[0]), l] -= 1.0 記住你需要創建一個新的實例對于每一個symbol。

全部的代碼在examples/numpy-ops/numpy_softmax.py

別的兩種選擇比較麻煩,這里就不講了。

總結

以上是生活随笔為你收集整理的mxnet创建新的操作(层)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。