代碼來自書籍《深度學習入門之pytorch》,書裡有幾個錯誤,修改好了
import matplotlib.pyplot as plt import torch from torch import nn from torch import optim from torch.autograd import Variable import numpy as np x_train = np.array([[3.3],[4.4],[5.5],[6.71],[6.93],[4.168],[9.779],[6.182],[7.59],[2.167],[7.042], [10.088],[5.33],[8.5],[4.2]],dtype=np.float32) y_train = np.array([[1.7],[2.8],[2.3],[4.0],[6.3],[5.3],[6.2],[8.6],[9.9],[2.8],[6.3], [11.8],[8.5],[6.5],[3.8]],dtype=np.float32) x_train = torch.from_numpy(x_train) y_train = torch.from_numpy(y_train) #define a LinearRegression Class class LinearRegression(nn.Module): def __init__(self): super(LinearRegression,self).__init__() self.linear = nn.Linear(1,1) def forward(self, x): out = self.linear(x) return out #create a model if torch.cuda.is_available(): print('GPU1') model = LinearRegression().cuda() else: print('CPU1') model = LinearRegression() #define a optimizer criterion = nn.MSELoss() optimizer = optim.SGD(model.parameters(),lr=1e-3) #start to train model num_epoch = 25000 for epoch in range(num_epoch): if torch.cuda.is_available(): #print('GPU2') inputs = Variable(x_train).cuda() target = Variable(y_train).cuda() else: #print('CPU2') inputs = Variable(x_train) target = Variable(y_train) #forward out = model(inputs) loss = criterion(out,target) #backward optimizer.zero_grad() loss.backward() optimizer.step() if (epoch+1)%20 ==0: print('Epoch[{}/{}],loss:{:.6f}'.format(epoch+1,num_epoch,loss.data[0])) model.eval() if torch.cuda.is_available(): print('GPU3') predict = model(Variable(x_train).cuda()) predict = predict.data.cpu().numpy() else: print('CPU3') predict = model(Variable(x_train)) predict = predict.data.numpy() plt.plot(x_train.numpy(),y_train.numpy(),'ro',label='Original data') plt.plot(x_train.numpy(),predict,label='Predict Line') plt.show()
運作結果:
