如何解决tensorflow线性回归的pytorch等效项是什么?
我正在学习pytorch,以对此处创建的这种数据进行基本的线性回归:
from sklearn.datasets import make_regression
x,y = make_regression(n_samples=100,n_features=1,noise=15,random_state=42)
y = y.reshape(-1,1)
print(x.shape,y.shape)
plt.scatter(x,y)
我知道使用tensorflow这段代码可以解决:
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(units=1,activation='linear',input_shape=(x.shape[1],)))
model.compile(optimizer=tf.keras.optimizers.SGD(lr=0.05),loss='mse')
hist = model.fit(x,y,epochs=15,verbose=0)
但是我需要知道pytorch的等效形式是什么,我试图做的是这样:
# Model Class
class Net(nn.Module):
def __init__(self):
super(Net,self).__init__()
self.linear = nn.Linear(1,1)
def forward(self,x):
x = self.linear(x)
return x
def predict(self,x):
return self.forward(x)
model = Net()
loss_fn = F.mse_loss
opt = torch.optim.SGD(modelo.parameters(),lr=0.05)
# Funcao para treinar
def fit(num_epochs,model,loss_fn,opt,train_dl):
# Repeat for given number of epochs
for epoch in range(num_epochs):
# Train with batches of data
for xb,yb in train_dl:
# 1. Generate predictions
pred = model(xb)
# 2. Calculate Loss
loss = loss_fn(pred,yb)
# 3. Campute gradients
loss.backward()
# 4. Update parameters using gradients
opt.step()
# 5. Reset the gradients to zero
opt.zero_grad()
# Print the progress
if (epoch+1) % 10 == 0:
print('Epoch [{}/{}],Loss: {:.4f}'.format(epoch+1,num_epochs,loss.item()))
# Training
fit(200,data_loader)
但是模型没有学到任何东西,我不知道该怎么办。
输入/输出尺寸为(1/1)
解决方法
数据集
首先,您应该定义torch.utils.data.Dataset
import torch
from sklearn.datasets import make_regression
class RegressionDataset(torch.utils.data.Dataset):
def __init__(self):
data = make_regression(n_samples=100,n_features=1,noise=0.1,random_state=42)
self.x = torch.from_numpy(data[0]).float()
self.y = torch.from_numpy(data[1]).float()
def __len__(self):
return len(self.x)
def __getitem__(self,index):
return self.x[index],self.y[index]
它将numpy
数据转换为tensor
内的PyTorch的{{1}}并将数据转换为__init__
(float
默认具有numpy
,而PyTorch的默认是double
,以便使用更少的内存。
除此之外,它仅会返回特征的float
和相应的回归目标。
健身
几乎在那里,但是您必须将模型的输出展平(如下所述)。 tuple
将返回形状为torch.nn.Linear
的张量,而您的目标形状为(batch,1)
。 (batch,)
将删除不必要的flatten()
尺寸。
1
型号
这就是您实际需要的:
# 2. Calculate Loss
loss = criterion(pred.flatten(),yb)
任何层都可以直接调用,不需要model = torch.nn.Linear(1,1)
和简单模型的继承。
呼叫
剩下的几乎可以了,您只需要创建torch.utils.data.DataLoader
并传递数据集的实例即可。 forward
的作用是多次发行DataLoader
的{{1}}并创建一批指定大小的文件(还有其他有趣的事情,但这就是想法):
__getitem__
还请注意,我使用了dataset
,因为在这种情况下,我们传递对象看起来比函数要好。
整个代码
为了使其更容易:
dataset = RegressionDataset()
dataloader = torch.utils.data.DataLoader(dataset,batch_size=32)
model = torch.nn.Linear(1,1)
criterion = torch.nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(),lr=3e-4)
fit(5000,model,criterion,optimizer,dataloader)
您应该避免torch.nn.MSELoss()
的损失,为更困难/更轻松的回归任务改变import torch
from sklearn.datasets import make_regression
class RegressionDataset(torch.utils.data.Dataset):
def __init__(self):
data = make_regression(n_samples=100,self.y[index]
# Funcao para treinar
def fit(num_epochs,train_dl):
# Repeat for given number of epochs
for epoch in range(num_epochs):
# Train with batches of data
for xb,yb in train_dl:
# 1. Generate predictions
pred = model(xb)
# 2. Calculate Loss
loss = criterion(pred.flatten(),yb)
# 3. Compute gradients
loss.backward()
# 4. Update parameters using gradients
optimizer.step()
# 5. Reset the gradients to zero
optimizer.zero_grad()
# Print the progress
if (epoch + 1) % 10 == 0:
print(
"Epoch [{}/{}],Loss: {:.4f}".format(epoch + 1,num_epochs,loss.item())
)
dataset = RegressionDataset()
dataloader = torch.utils.data.DataLoader(dataset,dataloader)
或其他参数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。