数据来源:diabetes.csv
批量梯度下降要并行处理,所以要加上 if __name__ == '__main__':
import torch
import numpy as np
from torch.utils.data import Dataset, DataLoader
class DiabetesDataset(Dataset):
def __init__(self, datapath):
xy = np.loadtxt(datapath, delimiter = ',',dtype = np.float32)
self.x = torch.from_numpy(xy[:, : -1])
self.y = torch.from_numpy(xy[:, [-1]])
self.len = xy.shape[0]
def __len__(self):
return self.len
def __getitem__(self, index):
return self.x[index], self.y[index]
dataset = DiabetesDataset('diabetes.csv')
train_loader = DataLoader(dataset = dataset,
batch_size = 32,
shuffle = True,
num_workers = 2)
class Model(torch.nn.Module):
def __init__(self):
super(Model, self).__init__()
self.linear1 = torch.nn.Linear(8, 6)
self.linear2 = torch.nn.Linear(6, 4)
self.linear3 = torch.nn.Linear(4, 1)
self.sigmoid = torch.nn.Sigmoid()
def forward(self, x):
x = self.sigmoid(self.linear1(x))
x = self.sigmoid(self.linear2(x))
x = self.sigmoid(self.linear3(x))
return x
model = Model()
criterion = torch.nn.BCELoss(reduction = 'mean')
optimizer = torch.optim.SGD(model.parameters(), lr = 0.1)
if __name__ == '__main__':
for epoch in range(100):
for i, data in enumerate(train_loader, 0):
x, y = data
y_pred = model(x)
loss = criterion(y_pred, y)
optimizer.zero_grad()
loss.backward()
optimizer.step()
print('epoch:', epoch, 'loss', loss.item())
作业
数据集:Titanic - Machine Learning from Disaster
import torch
import numpy as np
import pandas as pd
from torch.utils.data import Dataset, DataLoader
class TitanicDataset(Dataset):
def __init__(self, filepath):
xy = pd.read_csv(filepath)
self.len = xy.shape[0]
features = ["Pclass", "Sex", "SibSp", "Parch", "Fare"]
self.x_data = torch.from_numpy(np.array(pd.get_dummies(xy[features])))
self.y_data = torch.from_numpy(np.array(xy[["Survived"]]))
def __len__(self):
return self.len
def __getitem__(self, index):
return self.x_data[index], self.y_data[index]
dataset = TitanicDataset('train.csv')
dataloader = DataLoader(dataset = dataset,
batch_size = 32,
shuffle = True,
num_workers = 2)
class Model(torch.nn.Module):
def __init__(self):
super(Model, self).__init__()
self.linear1 = torch.nn.Linear(6, 3)
self.linear2 = torch.nn.Linear(3, 1)
self.sigmoid = torch.nn.Sigmoid()
def forward(self, x):
x = self.sigmoid(self.linear1(x))
x = self.sigmoid(self.linear2(x))
return x
def predict(self, x):
with torch.no_grad():
x = self.sigmoid(self.linear1(x))
x = self.sigmoid(self.linear2(x))
y = []
for i in x:
if i > 0.5:
y.append(1)
else:
y.append(0)
return y
model = Model()
criterion = torch.nn.BCELoss(reduction = 'mean')
optimizer = torch.optim.SGD(model.parameters(), lr = 0.01)
if __name__ == '__main__':
for epoch in range(10):
for i, data in enumerate(dataloader, 0):
x, y = data
y_pred = model(x.float())
loss = criterion(y_pred, y.float())
optimizer.zero_grad()
loss.backward()
optimizer.step()
print("epoch:", epoch, "loss", loss.item())
test_data = pd.read_csv('test.csv')
features = ["Pclass", "Sex", "SibSp", "Parch", "Fare"]
x_test = torch.from_numpy(np.array(pd.get_dummies(test_data[features])))
y_test = model.predict(x_test.float())
outputs = pd.DataFrame({'PassengerId': test_data.PassengerId, 'Survived': y_test})
outputs.to_csv('predict_titantic.csv', index=False)
作业参考:PyTorch深度学习(B站刘二大爷)第八讲作业——Kaggle网站泰坦尼克号Titanic