###本篇是pytorch實戰,根據子豪兄的教程及**學習
# 資料預處理:標準化影象資料,使得灰度資料在-1到+1之間
transform = transforms.compose(
[transforms.totensor(
),transforms.normalize(
(0.5,)
,(0.5,))
])trainset = datasets.fashionmnist(
'dataset/'
, download=
true
, train=
true
, transform=transform)
trainloader = torch.utils.data.dataloader(trainset, batch_size=
64, shuffle=
true
)testset = datasets.fashionmnist(
'dataset/'
, download=
true
, train=
false
, transform=transform)
testloader = torch.utils.data.dataloader(testset, batch_size=
64, shuffle=
true
)
神經網路的輸入為28 * 28 = 784 個畫素
第乙個隱含層包含256個神經元
第二個隱含層包含128個神經元
第三個隱含層包含64個神經元
輸出層輸出10個結果,對應的10種分類
)#softmax函式進行是個種類的分類
x = f.log_softmax(self.fc4(x)
, dim=1)
return x
# 對上面定義的classifier類進行例項化
model = classifier(
)# 定義損失函式為負對數損失函式 目的:使得損失函式最小
criterion = nn.nllloss(
)# 優化方法為 adam梯度下降 方法,學習率為0.003
optimizer = optim.adam(model.parameters(
), lr=
0.003
)# 對訓練集的全部資料學習 15 遍,這個數字越大,訓練時間越長
epochs =
15# 將每次訓練的訓練誤差和測試誤差儲存在這兩個列表裡,後面繪製誤差變化折線圖用
train_losses, test_losses =
,print
('開始訓練'
)for e in
range
(epochs)
: running_loss =
0# 對訓練集中的所有都過一遍
for images, labels in trainloader:
# 將優化器中的求導結果都設為0,否則會在每次反向傳播之後疊加之前的
optimizer.zero_grad(
)# 對64張進行推斷,計算損失函式,反向傳播優化權重,將損失求和
log_ps = model(images)
loss = criterion(log_ps, labels)
loss.backward(
) optimizer.step(
) running_loss += loss.item(
)# 誤差相加
# 每次學完一遍資料集,都進行以下測試操作
else
: test_loss =
0 accuracy =
0# 測試的時候不需要開自動求導和反向傳播
with torch.no_grad():
# 關閉dropout
model.
eval()
# 對測試集中的所有都過一遍
for images, labels in testloader:
# 對傳入的測試集進行正向推斷、計算損失,accuracy為測試集一萬張中模型**正確率
log_ps = model(images)
test_loss += criterion(log_ps, labels)
ps = torch.exp(log_ps)
top_p, top_class = ps.topk(
1, dim=1)
equals = top_class == labels.view(
*top_class.shape)
# 等號右邊為每一批64張測試中**正確的佔比
accuracy += torch.mean(equals.
type
(torch.floattensor)
)# 恢復dropout
model.train(
)# 將訓練誤差和測試誤差存在兩個列表裡,後面繪製誤差變化折線圖用
len(trainloader)
)len
(testloader)
)print
("訓練集學習次數: {}/{}.. "
.format
(e+1
, epochs)
,"訓練誤差: .. "
.format
(running_loss/
len(trainloader)),
"測試誤差: .. "
.format
(test_loss/
len(testloader)),
"模型分類準確率: "
.format
(accuracy/
len(testloader)
))
# 構造dropout方法,在每次訓練過程中都隨機「掐死」百分之二十的神經元,防止過擬合。
self.dropout = nn.dropout(p=
0.2)
defforward
(self, x)
:# 確保輸入的tensor是展開的單列資料,把每張的通道、長度、寬度三個維度都壓縮為一列
x = x.view(x.shape[0]
,-1)
# 在訓練過程中對隱含層神經元的正向推斷使用dropout方法
x = self.dropout(f.relu(self.fc1(x)))
x = self.dropout(f.relu(self.fc2(x)))
x = self.dropout(f.relu(self.fc3(x)
))
斯特林數物品分類
問題描述 對於n個不同的物品分成k個非空集合,求分類方案數。對於這種分類的方法,可以採用斯特林數的方法來解決。下面說下第二類斯特林數 dp i j dp i 1 j 1 j dp i 1 j 這個問題可以看成 1,n 1個物品分成了k 1集合,那麼還有最後乙個物品就只能在最後乙個集合中 2,n 1個...
鳶尾花資料分類實戰
資料集大概是這樣子的 將資料預處理一下 def get data loc iris.csv with open loc,r as fr lines csv.reader fr data file np.array list lines data data file 1 0 1 astype floa...
機器學習實戰學習筆記 分類
k 近鄰演算法 優點 精度高 對異常值不敏感 無資料輸入假定 簡單有效 缺點 計算複雜度高 空間複雜度高 非常耗時 關鍵 對訓練集到資料向量的距離進行排序,選出到資料向量最近的k個訓練集向量,然後對k個向量標籤出現的次數進行排序,出現次數最多的就是資料向量的 標籤 備註 需要對各特徵進行歸一化 決策...