>  기사  >  기술 주변기기  >  기계 학습 | PyTorch 간결한 튜토리얼 1부

기계 학습 | PyTorch 간결한 튜토리얼 1부

PHPz
PHPz앞으로
2023-11-02 17:25:12661검색

이전 글에서는 기능 정규화와 텐서에 대해 소개했습니다. 다음으로는 PyTorch의 간단한 실습을 주로 소개하는 두 가지 간결한 PyTorch 튜토리얼을 작성하겠습니다.

1 그림 1

import 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. 이 함수는 정수 매개변수를 시드로 받아들이며 결과의 반복성을 보장하기 위해 신경망 훈련과 같은 난수가 필요한 시나리오에서 사용할 수 있습니다.

(2) torch.linspace(-1, 1, 101, require_grad; =False)는 간격 내에서 균일한 간격의 값 집합을 생성하도록 지정하는 데 사용됩니다. 이 함수는 시작 값, 종료 값 및 요소 수의 세 가지 매개 변수를 허용하고 지정된 수의 균일한 간격 값을 포함하는 텐서를 반환합니다.

(3) build_model1의 내부 구현:

torch.nn.Sequential(torch.nn.Linear(1, 1,bias=False))은 nn.Sequential 클래스의 생성자를 사용하고 선형 레이어를 다음과 같이 전달합니다. 선형 레이어를 포함하는 신경망 모델 机器学习 | PyTorch简明教程上篇build_model2에는 add_module() 메서드를 사용하여 선형이라는 하위 모듈을 추가하는 등의 기능이 있습니다. (4) torch.nn.MSELoss; (reductinotallow='mean')은 손실 함수를 정의합니다.

optim.SGD(model.parameters(), lr=0.01, Momentum=0.9)를 사용하여 SGD(확률적 경사하강법) 최적화 알고리즘을 구현합니다

훈련 세트를 넣습니다. 배치 크기 분할을 통해 100회 반복

(7) 다음은 신경망 모델을 훈련하는 데 사용되는 훈련 함수입니다. 특히 이 함수는 다음 매개변수를 허용합니다.

    model: 일반적으로 신경망 모델입니다. nn.Module 클래스의 인스턴스에서 상속됨 ​​
  • loss: 모델의 예측 값과 실제 값 사이의 차이를 계산하는 데 사용됨
  • optimizer: 모델의 매개변수를 업데이트하는 데 사용됨;

x: 입력 데이터는 torch.Tensor 유형의 텐서입니다.

y: 대상 데이터는 torch.Tensor 유형의 텐서입니다.

(8) train은 PyTorch 훈련 과정에서 일반적으로 사용되는 방법입니다. 그 단계는 다음과 같습니다:

    모델을 훈련 모드로 설정합니다. 즉, 드롭아웃 및 배치 정규화와 같은 훈련 중에 사용되는 특수 작업을 활성화합니다.
  • 새로운 경사 계산 라운드를 위해 최적화 프로그램의 경사 캐시를 지웁니다.
  • 입력 데이터를 모델에 전달하고, 모델의 예측값을 계산하고, 예측값과 목표 데이터를 손실 함수에 전달하여 손실값을 계산합니다.
  • 손실값을 역전파하고 모델 매개변수의 기울기를 계산합니다.
  • 최적화 프로그램을 사용하여 모델 매개변수를 업데이트하여 손실 값을 변환합니다.
  • 손실 값의 스칼라 값을 반환합니다.

(9) print("Round = %d, loss value = %s" % (i + 1, 비용 / num_batches)) 마지막으로 현재 훈련 라운드 및 손실 값을 인쇄합니다. 위 코드 출력은 다음과 같습니다.
    a + b:[5 7 9]a - b:[-1 -1 -1]a * b:[ 6 12 20]a / b:[0.6666667 0.750.8]
  • 3. 로지스틱 회귀
  • 로지스틱 회귀는 그림에 표시된 것처럼 여러 개별 점의 궤적을 대략적으로 나타냅니다. :
  • 그림 2
  • 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()
  • (1) 위에 소개된 torch.manual_seed(42)의 주요 기능부터 시작하세요. 여기에서는 건너뛰세요.
  • (2) load_mnist는 mnist 데이터 세트를 직접 다운로드하는 것입니다. trX 및 teX를 입력 데이터로 반환합니다. trY 및 teY는 라벨 데이터입니다.

    (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개의 범주를 출력한다는 의미입니다.

    (4) 다른 단계는 손실 함수, 경사 하강 최적화 프로그램을 정의하고, 배치_크기를 통해 훈련 세트를 분할하고, 훈련을 위해 100번 반복하는 것입니다. (모델 .parameters(), lr=0.01, 모멘텀=0.9)은 확률적 경사하강법(SGD) 최적화 알고리즘을 구현할 수 있습니다

    (6) 각 훈련 라운드 후에 예측 기능을 실행하여 예측을 해야 합니다. 이 함수는 두 개의 매개변수인 model(훈련된 모델)과 teX(예측해야 하는 데이터)를 받아들입니다. 구체적인 단계는 다음과 같습니다:

    • model.eval()模型设置为评估模式,这意味着模型将不会进行训练,而是仅用于推理;
    • 将output转换为NumPy数组,并使用argmax()方法获取每个样本的预测类别;

    (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%

    4、神经网络

    一个经典的LeNet网络,用于对字符进行分类,如图:

    机器学习 | PyTorch简明教程上篇图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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

  • 성명:
    이 기사는 51cto.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제