이전 글에서는 기능 정규화와 텐서에 대해 소개했습니다. 다음으로는 PyTorch의 간단한 실습을 주로 소개하는 두 가지 간결한 PyTorch 튜토리얼을 작성하겠습니다.
1 그림 1import torcha = torch.tensor([2, 3, 4])b = torch.tensor([3, 4, 5])print("a + b: ", (a + b).numpy())print("a - b: ", (a - b).numpy())print("a * b: ", (a * b).numpy())print("a / b: ", (a / b).numpy())
(1) 기본 함수로 시작합니다. torch.manual_seed(42)는 생성된 난수 시퀀스가 매번 동일하도록 난수 생성기의 시드를 설정하는 데 사용됩니다. run. 이 함수는 정수 매개변수를 시드로 받아들이며 결과의 반복성을 보장하기 위해 신경망 훈련과 같은 난수가 필요한 시나리오에서 사용할 수 있습니다.
torch.nn.Sequential(torch.nn.Linear(1, 1,bias=False))은 nn.Sequential 클래스의 생성자를 사용하고 선형 레이어를 다음과 같이 전달합니다. 선형 레이어를 포함하는 신경망 모델 build_model2에는 add_module() 메서드를 사용하여 선형이라는 하위 모듈을 추가하는 등의 기능이 있습니다. (4) torch.nn.MSELoss; (reductinotallow='mean')은 손실 함수를 정의합니다.
optim.SGD(model.parameters(), lr=0.01, Momentum=0.9)를 사용하여 SGD(확률적 경사하강법) 최적화 알고리즘을 구현합니다훈련 세트를 넣습니다. 배치 크기 분할을 통해 100회 반복 (7) 다음은 신경망 모델을 훈련하는 데 사용되는 훈련 함수입니다. 특히 이 함수는 다음 매개변수를 허용합니다.x: 입력 데이터는 torch.Tensor 유형의 텐서입니다.
y: 대상 데이터는 torch.Tensor 유형의 텐서입니다.
(8) train은 PyTorch 훈련 과정에서 일반적으로 사용되는 방법입니다. 그 단계는 다음과 같습니다:a + b:[5 7 9]a - b:[-1 -1 -1]a * b:[ 6 12 20]a / b:[0.6666667 0.750.8]
import torchfrom torch import optimdef build_model1():return torch.nn.Sequential(torch.nn.Linear(1, 1, bias=False))def build_model2():model = torch.nn.Sequential()model.add_module("linear", torch.nn.Linear(1, 1, bias=False))return modeldef train(model, loss, optimizer, x, y):model.train()optimizer.zero_grad()fx = model.forward(x.view(len(x), 1)).squeeze()output = loss.forward(fx, y)output.backward()optimizer.step()return output.item()def main():torch.manual_seed(42)X = torch.linspace(-1, 1, 101, requires_grad=False)Y = 2 * X + torch.randn(X.size()) * 0.33print("X: ", X.numpy(), ", Y: ", Y.numpy())model = build_model1()loss = torch.nn.MSELoss(reductinotallow='mean')optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)batch_size = 10for i in range(100):cost = 0.num_batches = len(X) // batch_sizefor k in range(num_batches):start, end = k * batch_size, (k + 1) * batch_sizecost += train(model, loss, optimizer, X[start:end], Y[start:end])print("Epoch = %d, cost = %s" % (i + 1, cost / num_batches))w = next(model.parameters()).dataprint("w = %.2f" % w.numpy())if __name__ == "__main__":main()
(3) build_model의 내부 구현: torch.nn.Sequential(torch.nn.Linear(input_dim,output_dim,bias=False))는 다음과 같이 사용됩니다. 선형 레이어를 포함하는 신경망 모델을 구축합니다. 모델의 입력 기능 수는 input_dim이고 출력 기능 수는 output_dim이며 선형 레이어에는 편향 항이 없습니다. 여기서 n_classes=10은 10개의 카테고리를 출력함을 의미합니다. 다시 작성한 후: (3) build_model의 내부 구현: torch.nn.Sequential(torch.nn.Linear(input_dim,output_dim,bias=False))을 사용하여 선형 레이어를 포함하는 신경망 모델을 구축합니다. 모델의 입력 기능 수는 다음과 같습니다. input_dim. 출력 특징의 수는 output_dim이고 선형 레이어에는 바이어스 항이 없습니다. 그중 n_classes=10은 10개의 범주를 출력한다는 의미입니다.
(6) 각 훈련 라운드 후에 예측 기능을 실행하여 예측을 해야 합니다. 이 함수는 두 개의 매개변수인 model(훈련된 모델)과 teX(예측해야 하는 데이터)를 받아들입니다. 구체적인 단계는 다음과 같습니다:
(7)print("Epoch %d, cost = %f, acc = %.2f%%" % (i + 1, cost / num_batches, 100. * np.mean(predY == teY)))最后打印当前训练的轮次,损失值和acc,上述的代码输出如下(执行很快,但是准确率偏低):
...Epoch 91, cost = 0.252863, acc = 92.52%Epoch 92, cost = 0.252717, acc = 92.51%Epoch 93, cost = 0.252573, acc = 92.50%Epoch 94, cost = 0.252431, acc = 92.50%Epoch 95, cost = 0.252291, acc = 92.52%Epoch 96, cost = 0.252153, acc = 92.52%Epoch 97, cost = 0.252016, acc = 92.51%Epoch 98, cost = 0.251882, acc = 92.51%Epoch 99, cost = 0.251749, acc = 92.51%Epoch 100, cost = 0.251617, acc = 92.51%
一个经典的LeNet网络,用于对字符进行分类,如图:
图3
import numpy as npimport torchfrom torch import optimfrom data_util import load_mnistdef build_model(input_dim, output_dim):return torch.nn.Sequential(torch.nn.Linear(input_dim, 512, bias=False),torch.nn.Sigmoid(),torch.nn.Linear(512, output_dim, bias=False))def train(model, loss, optimizer, x_val, y_val):model.train()optimizer.zero_grad()fx = model.forward(x_val)output = loss.forward(fx, y_val)output.backward()optimizer.step()return output.item()def predict(model, x_val):model.eval()output = model.forward(x_val)return output.data.numpy().argmax(axis=1)def main():torch.manual_seed(42)trX, teX, trY, teY = load_mnist(notallow=False)trX = torch.from_numpy(trX).float()teX = torch.from_numpy(teX).float()trY = torch.tensor(trY)n_examples, n_features = trX.size()n_classes = 10model = build_model(n_features, n_classes)loss = torch.nn.CrossEntropyLoss(reductinotallow='mean')optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)batch_size = 100for i in range(100):cost = 0.num_batches = n_examples // batch_sizefor k in range(num_batches):start, end = k * batch_size, (k + 1) * batch_sizecost += train(model, loss, optimizer,trX[start:end], trY[start:end])predY = predict(model, teX)print("Epoch %d, cost = %f, acc = %.2f%%"% (i + 1, cost / num_batches, 100. * np.mean(predY == teY)))if __name__ == "__main__":main()
(1)以上这段神经网络的代码与逻辑回归没有太多的差异,区别的地方是build_model,这里是构建一个包含两个线性层和一个Sigmoid激活函数的神经网络模型,该模型包含一个输入特征数量为input_dim,输出特征数量为output_dim的线性层,一个Sigmoid激活函数,以及一个输入特征数量为512,输出特征数量为output_dim的线性层;
(2)print("Epoch %d, cost = %f, acc = %.2f%%" % (i + 1, cost / num_batches, 100. * np.mean(predY == teY)))最后打印当前训练的轮次,损失值和acc,上述的代码输入如下(执行时间比逻辑回归要长,但是准确率要高很多):
第91个时期,费用= 0.054484,准确率= 97.58%第92个时期,费用= 0.053753,准确率= 97.56%第93个时期,费用= 0.053036,准确率= 97.60%第94个时期,费用= 0.052332,准确率= 97.61%第95个时期,费用= 0.051641,准确率= 97.63%第96个时期,费用= 0.050964,准确率= 97.66%第97个时期,费用= 0.050298,准确率= 97.66%第98个时期,费用= 0.049645,准确率= 97.67%第99个时期,费用= 0.049003,准确率= 97.67%第100个时期,费用= 0.048373,准确率= 97.68%
위 내용은 기계 학습 | PyTorch 간결한 튜토리얼 1부의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!