import torch
device = 'cuda' if torch.cuda.is_available() else 'cpu' # 根据是否有可用的GPU来决定使用哪种设备
torch.manual_seed(777) # 设置随机种子
if device == 'cuda': # 如果设备是GPU
torch.cuda.manual_seed_all(777) # 设置GPU的随机种子
X = torch.FloatTensor([[0, 0], [0, 1], [1, 0], [1, 1]]).to(device) # 将X转换为FloatTensor类型,并将其转换到设备上
Y = torch.FloatTensor([[0], [1], [1], [0]]).to(device) # 将Y转换为FloatTensor类型,并将其转换到设备上
# 创建4个线性层和一个sigmoid层
linear1 = torch.nn.Linear(2, 10, bias=True) # 创建一个输入为2,输出为10,带有bias的线性层
linear2 = torch.nn.Linear(10, 10, bias=True) # 创建一个输入为10,输出为10,带有bias的线性层
linear3 = torch.nn.Linear(10, 10, bias=True) # 创建一个输入为10,输出为10,带有bias的线性层
linear4 = torch.nn.Linear(10, 1, bias=True) # 创建一个输入为10,输出为1,带有bias的线性层
sigmoid = torch.nn.Sigmoid() # 创建一个sigmoid层
# 创建一个模型,将linear1、sigmoid、linear2、sigmoid、linear3、sigmoid、linear4、sigmoid按顺序排列,并将模型移动到device设备上
model = torch.nn.Sequential(linear1, sigmoid, linear2, sigmoid, linear3, sigmoid, linear4, sigmoid).to(device)
criterion = torch.nn.BCELoss().to(device)# 定义了一个BCELoss损失函数,并将其移动到device(如GPU)上。
# BCELoss(Binary Cross Entropy Loss)是一种二分类损失函数,用于计算预测值与真实值之间的差异。它可以用来衡量预测值与真实值之间的差距,以便模型可以更好地拟合数据。BCELoss的公式如下:
# Loss = -(y * log(p) + (1 - y) * log(1 - p))
# 其中,y表示真实值,p表示预测值。
optimizer = torch.optim.SGD(model.parameters(), lr=1) # 定义优化器,使用随机梯度下降,学习率为1
for step in range(10001): # 循环10001次
optimizer.zero_grad() # 将梯度置零
hypothesis = model(X) # 将X输入模型,得到预测值hypothesis
cost = criterion(hypothesis, Y) # 计算损失函数
cost.backward() # 反向传播
optimizer.step() # 更新参数
if step % 100 == 0: # 每100次输出一次step和cost
print(step, cost.item())
# 使用torch.no_grad(),表示在计算过程中不需要计算梯度,即不需要反向传播
with torch.no_grad():
# 将模型model的输入X进行预测,并将预测结果大于0.5的设置为1,小于0.5的设置为0
predicted = (model(X) > 0.5).float()
# 计算预测结果和真实结果Y的准确率,float()表示将tensor转换为float类型,mean()表示求均值
accuracy = (predicted == Y).float().mean()
# 打印出模型的预测结果、真实结果和准确率
print('\nHypothesis: ', hypothesis.detach().cpu().numpy(), '\nCorrect: ', predicted.detach().cpu().numpy(), '\nAccuracy: ', accuracy.item())
CNN模型结构【每行注释非常细致】,可以解决异或问题
于 2023-02-06 16:00:11 首次发布