本文记录动手实现Logistic回归,本人刚刚接触深度学习,有错误的地方恳请各位大佬指正。在实现的过程中参考了下面两篇的思路:
Pytorch实验一:从零实现Logistic回归和Softmax回归
pytorch实现 logistic 回归
文章目录
从0实现 logistic 回归
import torch
import matplotlib.pyplot as plt
import torch.nn as nn
import numpy as np
import random
生成数据
随机生成实验所需要的二分类数据集 𝑥1 和 𝑥2 ,分别对应的标签 𝑦1 和 𝑦2
torch.normal返回一个张量,包含从给定参数means,std的离散正态分布中抽取随机数。 均值means是一个张量,包含每个输出元素相关的正态分布的均值。
n_data = torch.ones(50, 2) # 数据的基本形态
x1 = torch.normal(2 * n_data, 1) # shape=(50, 2)
y1 = torch.zeros(50) # 类型0 shape=(50, 1)
x2 = torch.normal(-2 * n_data, 1) # shape=(50, 2)
y2 = torch.ones(50) # 类型1 shape=(50, 1)
# 注意 x, y 数据的数据形式一定要像下面一样 (torch.cat 是合并数据),这样就构建出来一个分类特征明显的数据集
features = torch.cat((x1, x2), 0).type(torch.FloatTensor)
label = torch.cat((y1, y2), 0).type(torch.FloatTensor)
◼ 使用matplotlib将所构造的数据可视化
#x.data.numpy()[:, 0], x.data.numpy()[:, 1]表示输入x的两列
plt.scatter(features.data.numpy()[:, 0], features.data.numpy()[:, 1], c=label.data.numpy(), s=100, lw=0,
cmap='RdYlGn')
plt.show()
读取数据
在模型训练的时候,需要遍历数据集并不断读取小批量的数据样本。这里本实验定义
一个函数 𝐝𝐚𝐭𝐚_𝐢𝐭𝐞𝐫() 它每次返回 𝒃𝒂𝒕𝒄𝒉_𝒔𝒊𝒛𝒆 (批量大小)个随机样本的特征和标签。
def data_iter(batch_size, features, label):
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)]) # 最后一次可能不足一个batch
yield features.index_select(0, j), label.index_select(