得到数据→→构建模型→→模型实例化,选择优化器,选择损失函数→→进行epoch
解惑:特征和标签:
特征的数量和类型是由你根据具体问题和数据集的需要来确定的。特征是用来描述每个样本的属性或特点,它们在机器学习模型中用于进行预测或分类。特征的选择对模型的性能有重要影响。
一些常见的特征选择示例:
-
天气预测:
- 特征可能包括气温、湿度、风速、前一天的天气等。
- 样本可能是按小时或按天收集的气象数据。
- 这些特征用于预测未来的天气状况,如晴天、下雨或下雪。
-
银行贷款审批:
- 特征可能包括信用评分、年收入、负债情况、就业历史等。
- 每个样本可能是一个贷款申请者的财务记录。
- 这些特征用于决定是否批准贷款。
-
手写数字识别(如MNIST数据集):
- 特征是图片中的每个像素值。
- 每个样本是一个数字的手写图像。
- 这些特征用于识别图像中的数字(0到9)。
-
社交媒体情感分析:
- 特征可能包括文本中的单词、短语、标点符号的使用、使用频率等。
- 每个样本可能是一条社交媒体帖子或评论。
- 这些特征用于判断帖子的情绪(正面、中性或负面)
也就是说特征是筛选值,标签是结果
import torch
import torch.nn as nn
import torch.optim as optim
# 初始化数据
x_train = torch.rand([20, 1], dtype=torch.float)
y_train = torch.randint(0, 2, (20, 1), dtype=torch.float)
"""!!犯错点1:y_train也需要torch.float型来和x_train同步"""
# 定义逻辑回归类
class LogisticRegressionModel(nn.Module):
def __init__(self):
super(LogisticRegressionModel, self).__init__()
self.Linear = nn.Linear(1, 1)
"""!!犯错点2:nn.Linear()中需要参数来确定输入和输出,同时要记得继承时需要super()函数来确定引用的对象"""
def forward(self, x):
y_pred = torch.sigmoid(self.Linear(x))
return y_pred
# 实例化模型,确定优化器参数
model = LogisticRegressionModel()
"""!!犯错点3:实例化时,类LogisticRegressionModel需要一个括号来接收参数"""
# 损失函数构建
# Binary Cross Entropy Loss;
# 在使用 BCELoss 之前,确保模型的输出层使用了 Sigmoid 激活函数,将输出限制在 0 和 1 之间。
# 如果您的模型的输出层没有 Sigmoid 激活,并且您想将 Sigmoid 和 BCELoss 结合在一起,可以使用 BCEWithLoginsLoss,这个损失函数结合了 Sigmoid 激活和 BCELoss,且在数值上更稳定。
criterion = nn.BCELoss()
# 设置优化器,选择梯度下降法优化,SGD里的参数是model.parameters()所返回的所有参数,同时设置学习率为0.1
optimizer = optim.SGD(model.parameters(), lr=0.1)
"""!!犯错点4:优化器SGD需要接受模型的参数和学习率"""
# 设置世代
epoch = 100
for epochs in range(epoch):
# 前向传播
y_pred = model(x_train)
"""!!犯错点5:model此时已被实例化,因此只需要接受x_train就可以自然地完成前向传播"""
# 计算损失
loss = criterion(y_pred, y_train)
# 梯度下降
optimizer.zero_grad()
loss.backward()
"""!!犯错点6:反向传播是用损失函数来完成的,因此是在loss函数里,梯度清零是优化器能够提供函数完成的"""
optimizer.step()
print(f'epoch:{epochs},loss:{loss}')