菜鸟学习日记(一):画损失函数
找到代码了,但是代码里面没有损失函数图像,自己编一个
一、定义空列表
首先给定义两个列表,训练损失和测试损失
train_loss_plot=[]
test_loss_plot=[]
二、定位损失
原代码模型训练部分:
# 8.模型训练
for epoch in range(config.epochs):
model.train()
running_loss = 0
train_bar = tqdm(train_loader) # 形成进度条
for data in train_bar:
x_train, y_train = data # 解包迭代器中的X和Y
optimizer.zero_grad()
y_train_pred = model(x_train)
loss = loss_function(y_train_pred, y_train.reshape(-1, 1))
loss.backward()
optimizer.step()
running_loss += loss.item()
train_bar.desc = "train epoch[{}/{}] loss:{:.3f}".format(epoch + 1,
config.epochs,
loss)
找到代码前面定义了一个running_loss,定位到训练损失了。
running_loss = 0
在最下面,和running_loss = 0这一行对齐的地方加一句
#用append函数将损失值添加到列表中
train_loss_plot.append(running_loss)
即
# 8.模型训练
for epoch in range(config.epochs):
model.train()
running_loss = 0
train_bar = tqdm(train_loader) # 形成进度条
for data in train_bar:
x_train, y_train = data # 解包迭代器中的X和Y
optimizer.zero_grad()
y_train_pred = model(x_train)
loss = loss_function(y_train_pred, y_train.reshape(-1, 1))
loss.backward()
optimizer.step()
running_loss += loss.item()
train_bar.desc = "train epoch[{}/{}] loss:{:.3f}".format(epoch + 1,
config.epochs,
loss)
train_loss_plot.append(running_loss)
一定要注意插入位置!!!
验证损失同理
test_loss_plot.append(test_loss.item())
即
# 模型验证
model.eval()
test_loss = 0
with torch.no_grad():
test_bar = tqdm(test_loader)
for data in test_bar:
x_test, y_test = data
y_test_pred = model(x_test)
test_loss = loss_function(y_test_pred, y_test.reshape(-1, 1))
if test_loss < config.best_loss:
config.best_loss = test_loss
torch.save(model.state_dict(), save_path)
test_loss_plot.append(test_loss.item())
三、画图
首先要处理一下数据
#将两个list数据转化为字典
data_loss={"train loss":train_loss_plot,
"test loss":test_loss_plot}
#将字典转化为数据框
data_loss=DataFrame(data_loss)
print(data_loss)
data_loss长这样:
然后就开始画图了
#不知道哪个期刊要求的英文要设置time new roman
plt.rc('font',family='Times New Roman')
plt.figure(figsize=(10,5)) #设置窗口大小
#不知道哪个期刊要求的刻度朝内
plt.rcParams['xtick.direction']='in'
plt.rcParams['ytick.direction']='in'
plt.tick_params(top='in', right='in', which='both') # 显示上侧和右侧的刻度
data_loss.iloc[:,0].plot(figsize=(12,6),color='darkorange')
data_loss.iloc[:,1].plot(figsize=(12,6),color='blue')
plt.xlabel("epoch",fontsize=12)
plt.legend(('Train Loss', 'Test Loss'),loc='upper right',fontsize='12')
plt.show()
结果长这样,测试误差太小了,不是一条直线哈
然后改了一下,把损失给标准化了一下,不知道能不能这样搞哈哈哈
#数据标准化
data_loss=scaler_model.fit_transform(data_loss)
data_loss=DataFrame(data_loss)
结果就更清晰了