讀研伊始,簡單了解了一下pytorch構建神經網路的方法,特記錄。
1、利用pytorch實現神經網路時,要注意:
numpy和tensor的互化2、網路的搭建資料型別的轉化,包括numpy的int32、float64等,注意numpy中
astype()
的用法。注意conv接收的資料為4維:
batch, channel, h, w
,維度的增加和減少要記住squeeze()
和unsqueeze()
的用法,改變tensor尺寸要熟悉view()
的用法。想要手動定義卷積核,可以使用
torch.nn.functional
中的conv2d()
,它和torch.nn
中的conv2d
不太一樣,注意區別功能和函式名的大小寫。
網路的搭建大多是定義類,可以選擇將優化器、loss寫在類內,也可以在後續訓練模型時單獨寫優化器和loss。
例1:構建乙個簡單的全連線網路,就是最熟悉的輸入層——隱含層——輸出層。
class
net(torch.nn.module)
:def
__init__
(self, n_feature, n_hidden, n_output)
:super
(net, self)
.__init__(
) self.hidden = torch.nn.linear(n_feature, n_hidden)
#self.hidden2 = torch.nn.linear(n_hidden, n_hidden)
self.out = torch.nn.linear(n_hidden, n_output)
defforward
(self,x)
: x = f.relu(self.hidden(x)
)#x = f.relu(self.hidden2(x))
x = self.out(x)
return x
#輸出網路結構
net_test=net(4,
7,3)
print
(net_test)
輸出:
net(
(hidden): linear(in_features=4, out_features=7, bias=true)
(out): linear(in_features=7, out_features=3, bias=true)
)
這時如果使用梯度下降,那麼:
net = net(n_feature=
4, n_hidden=
20, n_output=3)
#定義網路
optimizer = torch.optim.sgd(net.parameters(
), lr=
0.01
)# sgd:隨機梯度下降法
for i in
range
(iters)
: out = net(train_data)
#獲取輸出
criteria=nn.crossentropyloss(
) loss = criteria(out,y)
# 1、定義loss,輸出與原始標籤對比
optimizer.zero_grad(
)# 2、初始化梯度
loss.backward(
)# 3、反向傳播
optimizer.step(
)# 4、更新引數
'''注意!!對於crossentropyloss(),有時不能直接用
crossentropyloss(predict,y)
樓主還是初學,暫時不知道原因,但是mseloss()可以直接把引數放進去
懇求大家指導
'''
例2:搭建網路的同時定義優化器和loss。
# **參考其它部落格
# class
mynet
(nn.module)
:def
__init__
(self)
:super
(mynet, self)
.__init__(
)# 容器,使用時順序呼叫各個層
self.fc = nn.sequential(
# 定義三層
nn.linear(2,
4), nn.linear(4,
4), nn.linear(4,
1),)
# 優化器
# params:優化物件
# lr:學習率
self.opt = torch.optim.adam(params=self.parameters(
), lr=
0.001
) self.mls = torch.nn.mseloss(
)#定義損失函式
defforward
(self, inputs)
:return self.fc(inputs)
deftrain
(self, x, y)
:# 訓練
out = self.forward(x)
# 得到輸出結果
loss = self.mls(out, y)
#1、計算loss
self.opt.zero_grad(
)#2、初始化梯度
loss.backward(
)#3、反向傳播
self.opt.step(
)#4、梯度更新
deftest
(self, x)
:# 測試,就是前向傳播的過程
return self.forward(x)
這時如果想要訓練模型,那麼:
if __name__==
'__main__':
net = mynet(
)for i in
range
(iters)
: net.train(x, y)
out = net.test(待測值)
3、其他
我會把學習過程中的notebook放在github上:cca8290的github
pytorch入門1 1(基本操作)
本節繼續來講pytorch的入門級操作,加加減減 拍平拉直的操作。在操作張量的的時候,肯定少不了張量之間的加減乘除。二維世界的張量就是矩陣,是不是像我們學數學那樣直接用 直接操作就好了呢?x torch.tensor 1,2 3,4 y torch.ones 2,2 x y 對應元素相加 x y 對...
pytorch入門1 0(基本操作)
pytorch入門1.0 主要是關於張量的建立 運算 索引等一些基本操作。隨便練習一下,增加對張量操作的熟悉程度。1.pytorch是什麼?pytorch是2017年由facebook人工智慧研究院 fair 基於torch推出的乙個開源python機器學習庫。該庫能借助gpu加速張量的計算 亦具有...
利用pytorch構建簡單神經網路
省略了資料集的處理過程 轉為tensor x torch.tensor input features,dtype float y torch.tensor labels,dtype float 權重引數初始化,設計網路結構 輸入348 14 weights torch.randn 14 128 dt...