
文章插图
请注意右边的两点 , 即模型没有完全拟合 。我们可以通过运行更多的训练步骤或增加隐藏神经元的数量来解决这个问题 。
案例二:二值分类函数不一定是在代数中看到的那种"一个数进去 , 另一个数出来"的函数 。现在让我们尝试一个二进制分类任务 。数据点有两个特征 , 可以分为两个标签中的一个 。也许这两个特征是经纬度坐标 , 而标签是环境污染物的存在 。或者 , 这些特征可能是学生的数学和阅读测试成绩 , 并且标签对应于他们是右撇子还是左撇子 。重要的是模型必须实现两个输入到一个输出(0或1)的映射 。
下面的代码与前面的代码非常相似 。唯一的差异是输入层现在有两个神经元 , 输出层之后是一个Sigmoid激活 , 它将所有输出压缩到范围(0 , 1) 。
import torchimport plotly.express as pximport pandas as pd# Batch Size, Input Neurons, Hidden Neurons, Output NeuronsN, D_in, H, D_out = 128, 2, 1024, 1# Create random Tensors to hold inputs and outputsx = torch.rand(N, D_in)y = torch.randint(0, 2, (N, D_out))# Plot randomly generated points and color by labeldf = pd.DataFrame({"x": x[:, 0].flatten(), "y": x[:, 1].flatten(), "class": y.flatten()})fig = px.scatter(df, x="x", y="y", color="class", color_continuous_scale="tealrose")fig.show()# define model: Linear (Input->Hidden), ReLU, Linear (Hidden->Output), Sigmoidmodel = torch.nn.Sequential(torch.nn.Linear(D_in, H),torch.nn.ReLU(),torch.nn.Linear(H, D_out),torch.nn.Sigmoid())# define loss function: Binary Cross Entropy Loss (good for binary classification tasks)loss_fn = torch.nn.BCELoss()learning_rate = 0.002optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)# Store losses over timets, losses = ([], [])# run training stepsfor t in range(60000):y_pred = model(x)loss = loss_fn(y_pred.float(), y.float())if t % 100 == 0:ts.append(t)losses.append(loss.data.numpy())optimizer.zero_grad()loss.backward()optimizer.step()# generate a bunch of random points to cover the sample space, then call modelc = torch.rand(32000, D_in)d = model(c)# store random data and predicted classifications in a DataFrame and plot with Plotly Expressdf2 = pd.DataFrame({"x": c[:, 0].flatten(),"y": c[:, 1].flatten(),"class": d.flatten().detach().numpy()})fig2 = px.scatter(df2, x="x", y="y", color="class", color_continuous_scale="tealrose")fig2.show()# plot the loss as a function of training stepfig3 = px.scatter(x=ts, y=losses)fig3.show()
文章插图
在单位正方形中随机均匀生成的点 , 随机指定给标签0(青色)和标签1(粉红色) 。
首先 , 在单位正方形内随机均匀生成数据点 , 并且随机指点每个数据点的标签为0/1 。从图中可以看出 , 显然不存在线性关系 。本案例的目的在于训练模型使其通过坐标判断标签 。

文章插图
模型分类结果
过拟合以上两个案例似乎都给出了很可观的结果 , 但是这是不是我们真正想要的呢?值得注意的是 , 这两个案例都存在过拟合的现象 。过拟合表现为模型在训练数据集表现优秀 , 但是在未知数据集表现不足 。
在案例一中 , 假设其中一个点是由于错误的数据收集而导致的异常值 。考虑到要学习的训练数据量如此之少 , 模型对这些数据的拟合度过高 , 只看到了一个信号 , 而实际上只是噪声 。一方面 , 令人印象深刻的是 , 模型能够学习一个考虑到这个异常值的函数 。另一方面 , 当将此模型应用于真实世界的数据时 , 这可能会导致不良结果 , 在该点附近产生错误的预测 。
在案例二中 , 模型学习了一个漂亮的分类预测 。但是 , 请注意最靠近右下角的蓝绿色点 。尽管这是唯一的一点 , 它导致模型将整个右下角标记为青色 。仅仅是一些错误的数据点就可能严重扭曲模型 。当我们尝试将模型应用于测试数据时 , 它的工作效果可能比预期的差得多 。
为了避免过度拟合 , 重要的是要有大量的训练数据来代表模型预期面对的样本 。如果你正在建立一个工具来预测普通人群的衣服尺寸 , 不要只从你大学朋友那里收集训练数据 。此外 , 还有一些先进的技术可以别用于帮助减少过拟合的发生(例如:权重下降 weight decay) 。
推荐阅读
- 刹车|车主曝特斯拉“踩刹车”前进掉河!网友:车尾车贴已说明原因
- 外星人探索 人类为什么要寻找外星生命
- 为什么叫臭宝 臭宝是什么意思要怎么回答
- 鲨鱼不断游泳是因为 鲨鱼为什么要不停地游泳
- Mysql索引为什么使用B+树而不使用跳表?
- 黎族纹身的起因是什么 黎族为什么要纹身
- 河北蚩尤古墓 蚩尤墓为什么不挖
- 你听说了吗?福鼎白茶是糖尿病的克星![养生茶]
- 恒星为什么会坍塌成黑洞
- 怀孕后出汗多怎么回事
