运用pytorch构建一个简单的线性神经网络
本文记录了一些pytorch的基本操作,实现了一个简答的线性回归,一个softmax分类和一个多层感知机(参照《动手学深度学习pytorch版)
一.简单线性回归
通过此练习训练一个能回归到 $$y=x_1w_1+x_2w_2+b$$ 的线性神经网络
1.数据集的生成
| num_inputs = 2 num_examples = 1000 true_w = [2, -3.4] true_b = 4.2 features = torch.randn(num_examples, num_inputs, dtype=torch.float32) 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)
|
2.数据集的读取
1 2 3 4 5 6 7 8 9 10 11
| def data_iter(batch_size,features,labels): num_examples = len(features) indices = list(range(num_examples)) random.shuffle(indices) for i in range(0,num_examples,batch_size): j = torch.LongTensor(indices[i:min(i+batch_size,num_examples)]) yield features.index_select(0,j),labels.index_select(0,j)
|
当然,我们也可以用pytorch中封装好的方法来直接进行实现(工具越强大,人就越懒):
1 2 3 4 5
| import torch.utils.data as Data batch_size = 10 dataset = Data.TensorDataset(features,labels)
data_iter = Data.DataLoader(dataset,batch_size,shuffle = True);
|
3.定义模型
我们导入pytorch中的模块torch.nn,常用的做法是继承nn.Module,编写自己的网络和层
1 2 3 4 5 6 7 8 9 10
| class LinearNet(nn.Module): def __init__(self,n_feature): super(LinearNet,self).__init__() self.linear = nn.Linear(n_feature,1) def forward(self,x): y=self.linear(x) return y net = LinearNet(num_inputs)
|
在这里我们首先要定义我们网络的初始化参数,即Linear(in_features,out_features,weight,bias);
然后要定义前向传播函数,这个前向传播函数实际上就是给一个输入然后返回输出,在之后求梯度的时候会有用到。
4.初始化模型参数
通过导入init模块,用init.normal_将权重参数每个元素初始化为随机采样与均值为0,标准差为0.01的正态分布;通过init.constant()将bias初始化为常数0
1 2 3
| from torch.nn import init init.normal_(net.linear.weight,mean=0,std=0.01); init.constant_(net.linear.bias,val = 0)
|
5.定义损失函数