pytorch筆記5 分類

2021-09-26 07:41:37 字數 4851 閱讀 6267

用簡單的例子看一下神經網路是怎麼分類的:

#有兩組資料,一組資料屬於分類1,一組資料屬於分類0

#建立資料

n_data=torch.ones(100,2)

data1=torch.normal(2*n_data,1) #其中一組資料的x座標和y座標都包含再data1中

label1=torch.zeros(100) #data1這堆資料的標籤都是0

data2=torch.normal(-2*n_data,1) #另一堆資料

label2=torch.ones(100) #data2這堆資料的標籤都是1

#資料data和每個資料所對應的分類labels

data=torch.cat((data1,data2),0).type(torch.floattensor) #所有的資料.cat:合併資料集

labels=torch.cat((label1,label2),0).type(torch.longtensor) #所有標籤

注:

torch.normal(measn,std,out=none) 返回乙個張量,包含從給定引數means,std的離散正態分佈中抽取隨機數。

均值和標準差的形狀可以不匹配,但每個張量的元素個數須相同

import torch

# method1,均值和標準差均為矩陣

means=2.0*torch.ones(3,2)

std=torch.ones(3,2)

tensor1=torch.normal(means,std)

print('tensor1:\n',tensor1)

# method2,樣本共享均值

tensor2=torch.normal(1,torch.arange(1.0,4.0))

print('tensor2:\n',tensor2)

# method3,樣本共享標準差

tensor3=torch.normal(torch.arange(1,0,-0.2),0.2)

print('tensor3:\n',tensor3)

執行結果:

tensor1:

tensor([[ 2.2218, 1.7356],

[ 2.3562, 1.8443],

[-0.3917, 1.4340]])

tensor2:

tensor([0.1562, 2.5264, 0.4343])

tensor3:

tensor([1.2139, 0.6693, 0.7391, 0.5015, 0.4305])

import torch

tensor1=torch.rand((3,2))

tensor2=torch.normal(torch.ones(3,2),0.4)

tensor_cat0=torch.cat((tensor1,tensor2),0)

tensor_cat1=torch.cat((tensor1,tensor2),1)

print(

'tensor_cat0:\n',tensor_cat0,

'\ntensor_cat1:\n',tensor_cat1

)

執行結果:

tensor_cat0:

tensor([[0.1172, 0.8874],

[0.5329, 0.3272],

[0.8525, 0.9647],

[1.4242, 0.8938],

[0.6884, 1.8814],

[0.9747, 0.9873]])

tensor_cat1:

tensor([[0.1172, 0.8874, 1.4242, 0.8938],

[0.5329, 0.3272, 0.6884, 1.8814],

[0.8525, 0.9647, 0.9747, 0.9873]])

#快速搭建神經網路

x=variable(data)

y=variable(labels)

#通過在sequential裡面搭神經層的方法構建神經網路

net=torch.nn.sequential(

torch.nn.linear(2,10),

torch.nn.relu(),

torch.nn.linear(10,10),

torch.nn.relu(),

torch.nn.linear(10,2)

) #輸入特徵是2個:座標x和y,輸出結果的分類為0和1

#訓練網路

optomizer=torch.optim.sgd(net.parameters(),lr=0.01)

loss_func=torch.nn.crossentropyloss() #交叉熵損失函式

for i in range(100):

out=net.forward(x)

loss=loss_func(out,y)

optomizer.zero_grad()

loss.backward()

optomizer.step()

#視覺化

if i%2==0:

plt.cla() #清楚原來的影象

prediction=torch.max(out,1)[1] #torch.max(out,1)返回每一行的最大值的值和索引。prediction表示所有最大值的索引,也就是分類

pred_y=prediction.data.numpy()

target_y=y.data.numpy()

plt.scatter(x.data.numpy()[:,0],x.data.numpy()[:,1],c=pred_y,s=100,cmap='rdylgn') #c:色彩或顏色序列,s:點的大小

accuracy=float((pred_y==target_y).astype(int).sum())/float(target_y.size) #astype()型別轉換

plt.text(1.5,-4,'accuracy=%.2f'%accuracy,fontdict=)

plt.pause(0.1)

plt.show()

注:torch.max()

import torch

data1=torch.tensor([[1,2,3],[4,5,6],[9,8,7]])

data2=torch.tensor([[2,2,3],[4,4,5],[8,9,8]])

print(torch.max(data1))

#執行結果

tensor(9)

import torch

data1=torch.tensor([[1,2,3,4],[4,5,6,7],[9,8,7,6]])

data2=torch.tensor([[2,2,3,5],[4,4,5,3],[8,9,8,10]])

print('返回每一列的最大值和索引:\n',torch.max(data1,dim=0)) #返回每一列的最大值及索引

print('返回每一行的最大值和索引:\n',torch.max(data1,dim=1)) #返回每一行的最大值及索引

print('只返回最大值:\n',torch.max(data1,dim=0)[0]) #只返回值

print('只返回索引:\n',torch.max(data1,dim=1)[1]) #只返回索引

#執行結果

返回每一列的最大值和索引:

torch.return_types.max(

values=tensor([9, 8, 7, 7]),

indices=tensor([2, 2, 2, 1]))

返回每一行的最大值和索引:

torch.return_types.max(

values=tensor([4, 7, 9]),

indices=tensor([3, 3, 0]))

只返回最大值:

tensor([9, 8, 7, 7])

只返回索引:

tensor([3, 3, 0])

import torch

data1=torch.tensor([[1,2,3,4],[4,5,6,7],[9,8,7,6]])

data2=torch.tensor([[2,2,3,5],[4,4,5,3],[8,9,8,10]])

print(torch.max(data1,data2))

#執行結果

tensor([[ 2, 2, 3, 5],

[ 4, 5, 6, 7],

[ 9, 9, 8, 10]])

五 分類 其它分類技術5

結構風險最小化理論 給出了線性分類器邊緣與其泛化誤差之間關係的形式化解釋 1.線性決策邊界wx b 0 2.線性分類器的邊緣 3.學習線性svm模型 拉格朗日乘子法 kkt條件 支援向量 對偶拉格朗日函式 軟邊緣,學習允許一定訓練錯誤的決策邊界 在優化問題的約束中引入正值的鬆弛變數 鬆弛變數提供了決...

pytorch二分類 視覺化

110865833 trick 純demo,心在 結果就在那裡 trick 一年沒用torch我都以為自己忘了,要什麼功能只能現查了,現在的目標是主tf2.x和keras,會用tf1.x coding utf 8 author szy create date 2019 10 25 step1 建立資...

深度學習 使用PyTorch模擬二分類

目標效果 生成隨機資料 n data torch.ones 100,2 生成全為1的100行2列的張量 x0 torch.normal 2 n data,1 返回一組張量,表示從均值為2 n data,標準差為1的正態分佈中隨機抽取的資料 y0 torch.zeros 100 生成全為0的100行1...