손놀림 깊이 학습 노트

18071 단어
선형 회귀
0부터 선형 회귀 1을 실현하다.생성 데이터 집합 모델 정의 y=w1x1+w2x2+b y:labelx: 입력한features b: 편차.randn(a,b) 출력 a행 b열 정적 분포 샘플링 지점
%matplotlib inline
import torch
from IPython import display
from matplotlib import pyplot as plt
import numpy as np
import random
num_inputs = 2
num_examples = 1000
#y=Xw+b+ϵ  x1,x2 features
true_w = [2, -3.4]
true_b = 4.2
#features 1000   
features = torch.randn(num_examples, num_inputs,
                       dtype=torch.float32)
#labels     ,        ,dim=0 row,dim=1 column
labels = true_w[0] * features[:, 0] + true_w[1] * features[:, 1] + true_b
labels += torch.tensor(np.random.normal(0, 0.01, size=labels.size()),
                       dtype=torch.float32)
print(features[0], labels[0])

둘.데이터 세트 디스플레이
def use_svg_display():
    #       
    display.set_matplotlib_formats('svg')

def set_figsize(figsize=(3.5, 2.5)):#    3.5*2.5
    use_svg_display()
    #       
    plt.rcParams['figure.figsize'] = figsize
set_figsize()
plt.scatter(features[:, 1].numpy(), labels.numpy(), 1);

셋.데이터 읽기: 소량의 데이터 샘플 읽기 yield:return for (i, j, k): i-j, k를 보폭range (num): 0에서num list (): 목록으로 변환
def data_iter(batch_size,features,labels):
    num_examples=len(features)#featuresdim=0   ,1000
    indices=list(range(num_examples))#0-1000    
    random.shuffle(indices)#        
    # 0-1000,   10
    for i in range(0,num_examples,batch_size):
        j=torch.LongTensor(indices[i:min(i+batch_size,num_examples)])#          batch,Min()        ,indics[i:j],  i-j   
        yield features.index_select(0,j),labels.index_select(0,j)#    return index_select)_    
batch_size = 10
for X,y in data_iter(batch_size,features,labels):
    print(X,y)
    break

넷.초기화 모델 매개 변수 torch.mm(a,b): 매트릭스 a 매트릭스 b, 여기 ab로 쓸 수 있어요.
#       
w = torch.tensor(np.random.normal(0, 0.01, (num_inputs, 1)), dtype=torch.float32)
b = torch.zeros(1, dtype=torch.float32)#      
w.requires_grad_(requires_grad=True)#                 
b.requires_grad_(requires_grad=True)
#X   ,    
def linreg(X,w,b):
    return torch.mm(X,w)+b
#loss function
def squared_loss(y_hat,y):
    return (y_hat-y.view(y_hat.size()))**2/2

오.최적화 알고리즘은 w, b를 끊임없이 교체하여 최우수값grad와backward()를 얻을 수 있다. 백워드()를 실행할 때야말로 진정한 실행 구도이다.grad는 이 변수가 구도해야 한다는 것을 의미한다(w, b).백워드는 표량에 대한 구도에 파라미터가 없다.
#                        。                           。                。
def sgd(params,lr,barch_size):
    for param in params:
        #.grad    
        param.data-=lr*param.grad/batch_size```
 .    

```python
#     
lr = 0.03
num_epochs = 3
net = linreg
loss = squared_loss

for epoch in range(num_epochs):#        num_epochs     
     #          ,               (              )
    #X y           
    for X,y in data_iter(batch_size, features, labels):
        l=loss(net(X,w,b),y).sum()# l      X y   
        l.backward()#               , w,b  
        sgd([w, b], lr, batch_size)  #                  ,     w,b    
        #    
        w.grad.data.zero_()
        b.grad.data.zero_()
    #        w,b          loss
    train_l=loss(net(features,w,b),labels)
    
    #item()    python     
    print('epoch%d,loss %f'%(epoch,train_l.mean().item()))  
    epoch0,loss 0.000046
 	epoch1,loss 0.000046
	epoch2,loss 0.000046  
        
        

좋은 웹페이지 즐겨찾기