目錄
1.定義模型類
2.模型層
nn.Flatten
nn.Dense
nn.ReLU
nn.SequentialCell
nn.Softmax
3.模型參數
代碼實現:
總結
神經網絡模型是由神經網絡層和Tensor操作構成的,
mindspore.nn提供了常見神經網絡層的實現,
在MindSpore中,Cell類是構建所有網絡的基類,也是網絡的基本單元。
一個神經網絡模型表示為一個Cell
,它由不同的子Cell
構成。
使用這樣的嵌套結構,可以簡單地使用面向對象編程的思維,對神經網絡結構進行構建和管理。
1.定義模型類
定義神經網絡時,可以繼承nn.Cell
類,在__init__
方法中進行子Cell的實例化和狀態管理,在construct
方法中實現Tensor操作。
construct
意為神經網絡(計算圖)構建
構建完成后,實例化Network
對象,并查看其結構:
三個全連接層(Dense)和兩個ReLU激活函數的序列模型
class Network(nn.Cell):def __init__(self):super().__init__()self.flatten = nn.Flatten()self.dense_relu_sequential = nn.SequentialCell(nn.Dense(28*28, 512, weight_init="normal", bias_init="zeros"),nn.ReLU(),nn.Dense(512, 512, weight_init="normal", bias_init="zeros"),nn.ReLU(),nn.Dense(512, 10, weight_init="normal", bias_init="zeros"))def construct(self, x):x = self.flatten(x)logits = self.dense_relu_sequential(x)return logitsmodel = Network()
print(model)
我們構造一個輸入數據,直接調用模型,可以獲得一個十維的Tensor輸出,其包含每個類別的原始預測值。
model.construct()
方法不可直接調用。在此基礎上,我們通過一個
nn.Softmax
層實例來獲得預測概率。
X = ops.ones((1, 28, 28), mindspore.float32)
logits = model(X)
# print logits
logits
pred_probab = nn.Softmax(axis=1)(logits)
y_pred = pred_probab.argmax(1)
print(f"Predicted class: {y_pred}")
2.模型層
我們分解上面構造的神經網絡模型中的每一層。首先我們構造一個shape為(3, 28, 28)的隨機數據(3個28x28的圖像),依次通過每一個神經網絡層來觀察其效果。
input_image = ops.ones((3, 28, 28), mindspore.float32)
print(input_image.shape)
nn.Flatten
實例化nn.Flatten層,將28x28的2D張量轉換為784大小的連續數組。
nn.Dense
nn.Dense為全連接層,其使用權重和偏差對輸入進行線性變換。
nn.ReLU
nn.ReLU層給網絡中加入非線性的激活函數,幫助神經網絡學習各種復雜的特征。
nn.SequentialCell
nn.SequentialCell是一個有序的Cell容器。輸入Tensor將按照定義的順序通過所有Cell。我們可以使用
SequentialCell
來快速組合構造一個神經網絡模型。
nn.Softmax
最后使用nn.Softmax將神經網絡最后一個全連接層返回的logits的值縮放為[0, 1],表示每個類別的預測概率。
axis
指定的維度數值和為1。
3.模型參數
網絡內部神經網絡層具有權重參數和偏置參數(如nn.Dense
),這些參數會在訓練過程中不斷進行優化,可通過?model.parameters_and_names()
?來獲取參數名及對應的參數詳情。
代碼實現:
總結
構建網絡,定義模型類時,要有這個框架,繼承類,在他里面進行實例化和狀態管理:
class Network(nn.Cell)
: 定義了一個類,繼承自nn.Cell
。
def __init__(self)
:??Network
類的構造函數,初始化類的屬性。
super().__init__()
: 調用父類nn.Cell
的構造函數。
def construct(self, x)
: 定義了Network
類的construct
方法,它是MindSpore中定義模型前向傳播邏輯的方法。參數x
表示輸入數據。
x = self.flatten(x)
: 使用self.flatten
層將輸入數據x
展平。
logits = self.dense_relu_sequential(x)
: 將展平后的數據x
通過self.dense_relu_sequential
序列模型進行前向傳播,得到模型的原始輸出logits
。在分類任務中,logits
是模型的線性輸出
return logits
: 返回模型的輸出logits
。
class Network(nn.Cell):def __init__(self):super().__init__()def construct(self, x):x = self.flatten(x)logits = self.dense_relu_sequential(x)return logits
self.flatten = nn.Flatten()
: 初始化一個nn.Flatten
層,這個層用于將多維輸入數據展平為一維數據。在處理圖像數據時,通常需要將圖像的二維數據(例如,28x28像素)展平為一維向量。
self.dense_relu_sequential = nn.SequentialCell(...)
: 初始化一個序列模型,包含三個全連接層(nn.Dense
)和兩個ReLU激活函數(nn.ReLU
)。這個序列模型的初始化與之前解釋的相同。
預測的時候:
1. pred_probab = nn.Softmax(axis=1)(logits)
: 使用了nn.Softmax
函數來將模型的輸出logits
轉換為概率分布。
Softmax
函數通常用于多類分類問題的輸出層,它可以將一個向量的元素轉換為一個概率分布,使得所有元素的和為1。參數
axis=1
表示Softmax
函數將在第二個維度(通常是特征維度)上應用,即對于每個樣本,將其對應的logits
轉換為概率。
2. y_pred = pred_probab.argmax(1)
: 這行代碼使用了argmax
函數來找到每個樣本概率最高的類別索引。argmax
函數返回輸入數組中最大元素的索引。在這里,它沿著第二個維度(即每個樣本的概率分布)找到最大值的索引,這代表了模型預測的類別。
pred_probab = nn.Softmax(axis=1)(logits)
y_pred = pred_probab.argmax(1)
print(f"Predicted class: {y_pred}")
別的也沒什么了吧~~~