一原理
类似softmax,在中间加了一层。
h=a<w1,x>+b1,a是激活函数
o=<w2,h>+b2
y=softmax(o)


二pycharm环境代码实现
import torch
import torchvision
from torchvision import transforms
from torch.utils import data
import d2l
from torch import nn
import TIME1
import matplotlib.pyplot as plt
trans = transforms.ToTensor() #把图片转成预处理,转成张量
mnist_train = torchvision.datasets.FashionMNIST(
    root="D:\PycharmDocument\limu\data", train=True, transform=trans, download=True)
mnist_test = torchvision.datasets.FashionMNIST(
    root="D:\PycharmDocument\limu\data", train=False, transform=trans, download=True)
batch_size=256
train_iter = data.DataLoader(mnist_train, batch_size, shuffle=True,num_workers=0)
test_iter = data.DataLoader(mnist_test, batch_size, shuffle=True,num_workers=0)

num_inputs=784
num_outputs=10
num_hidden=256
W1=nn.Parameter(torch.randn(num_inputs,num_hidden,requires_grad=True))
b1=nn.Parameter(torch.zeros(num_hidden,requires_grad=True))
W2=nn.Parameter(torch.randn(num_hidden,num_outputs,requires_grad=True))
b2=nn.Parameter(torch.zeros(num_outputs,requires_grad=True))
params=[W1,b1,W2,b2]

def relu(x):
    a=torch.zeros_like(x)
    return torch.max(a,x)
def net(x):
    X=x.reshape(-1,num_inputs)
    H=relu(torch.matmul(X,W1)+b1)
    return torch.matmul(H,W2)+b2
loss=nn.CrossEntropyLoss()
num_epochs=10
lr=0.1

# for epoch in range(num_epochs):
#     for X,y in train_iter:
#         l=loss(net(X),y)
#         l.backward()
#         sgd(params,lr,batch_size)
#     print(f'epch: {epoch+1}, loss: {l.item()}')
def updater(batch_size):
    with torch.no_grad():
        for param in params:
            param -= lr * param.grad/batch_size
            param.grad.zero_()
def train_epoch(test_iter,train_iter,loss, updater,num_epochs,net):
    animit=d2l.Animator(xlabel='epoch',ylabel='loss',xlim=[0,15],ylim=[0,1]legend=['train loss', 'train acc', 'test acc'])
    for epoch in range(num_epochs):
        test_acc=TIME1.evaluate_accuracy(test_iter,net)
        train_metric=TIME1.train_epoch_ch3(net, train_iter, loss, updater)
        animit.add(epoch+1,train_metric+(test_acc,))

train_epoch(test_iter,train_iter,loss, updater,10,net)
plt.ioff()
plt.show(block=True)


更多推荐