用簡單的例子看一下神經網路是怎麼分類的:
#有兩組資料,一組資料屬於分類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...