首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PyTorch中神经网络决策边界的绘制

PyTorch中神经网络决策边界的绘制
EN

Stack Overflow用户
提问于 2020-03-02 19:34:44
回答 1查看 1.2K关注 0票数 1

我一直试图绘制我的神经网络的决策边界,这是我在输出层使用乙状结肠函数进行二值分类的方法,但没有成功,我发现了许多讨论科学学习分类器的决策边界的文章,而不是建立在PyTorch中的神经网络。以下是我的神经网络:

代码语言:javascript
运行
复制
class NeuralNetwork(torch.nn.Module):
  def __init__(self):
    super(NeuralNetwork, self).__init__()
    self.fc1 = torch.nn.Linear(23, 16)
    self.fc2 = torch.nn.Linear(16, 14)
    self.fc3 = torch.nn.Linear(14, 10)
    self.fc4 = torch.nn.Linear(10, 5)
    self.fc5 = torch.nn.Linear(5, 1)

  def forward(self, x):
    x = torch.relu(self.fc1(x))
    x = torch.relu(self.fc2(x))
    x = torch.relu(self.fc3(x))
    x = torch.relu(self.fc4(x))
    x = torch.sigmoid(self.fc5(x))
    return x

model = NeuralNetwork().double()

CUDA = torch.cuda.is_available()
if CUDA:
  model.cuda()

criterion = torch.nn.BCELoss(reduction='mean')
optimizer = torch.optim.SGD(model.parameters(), lr=1e-2, momentum=0.9)

model_1.train()

Precision = []
Cost = []

for epoch in range(10001):

  if CUDA:
    inputs = X_train.cuda()
    label = Y_train.cuda()
  else:
    inputs = X_train
    label = Y_train

  prediction = model_1(inputs)
  loss = criterion(prediction, label)
  accuracy = ((prediction > 0.5) == label).float().mean().item()

  Cost.append(loss.item())
  Precision.append(accuracy)

  if epoch % 1000 == 0 or epoch == 30000:
    print("Epoch:", epoch, ",", "Loss:", loss.item(), ",", "Accuracy:", accuracy)

  # Backpropagation process
  optimizer.zero_grad()
  loss.backward()
  optimizer.step()

model_1.eval()

X_test = torch.from_numpy(X[27000:,:])
Y_test = torch.from_numpy(y[27000:,:]).double()

with torch.no_grad():

  y_pred = model_1(X_test)
  print("Accuracy: ", ((y_pred > 0.5) == Y_test).float().mean().item())

下面是我试图生成一个类似的绘图here的尝试

代码语言:javascript
运行
复制
# I've chosen two features because the data is multi-dimensional
X0 = X_test[:,[0,]].reshape(3000)
X5 = X_test[:,[5,]].reshape(3000)
X0, X5 = np.meshgrid(X0, X5)

xx, yy = np.meshgrid(X0, X5)
grid = np.c_[xx.ravel(), yy.ravel()]
probs = y_pred

f, ax = plt.subplots(figsize=(8, 6))
contour = ax.contourf(xx, yy, probs, 25, cmap="RdBu",
                  vmin=0, vmax=1)
ax_c = f.colorbar(contour)
ax_c.set_label("$P(y = 1)$")
ax_c.set_ticks([0, .25, .5, .75, 1])

ax.scatter(X0, X5, c=Y_test, s=50,cmap="RdBu", vmin=-.2, vmax=1.2,edgecolor="white", linewidth=1)

ax.set(aspect="equal",
   xlim=(-5, 5), ylim=(-5, 5),
   xlabel="$X0$", ylabel="$X5$")

但不幸的是,我得到了以下错误:

代码语言:javascript
运行
复制
TypeError                                 Traceback (most recent call last)

<ipython-input-52-fb941749621a> in <module>()
  1 f, ax = plt.subplots(figsize=(8, 6))
  2 contour = ax.contourf(xx, yy, probs, 25, cmap="RdBu",
----> 3                       vmin=0, vmax=1)
  4 ax_c = f.colorbar(contour)
  5 ax_c.set_label("$P(y = 1)$")

5 frames

/usr/local/lib/python3.6/dist-packages/matplotlib/contour.py in _check_xyz(self, args, kwargs)
1549             raise TypeError("Input z must be a 2D array.")
1550         elif z.shape[0] < 2 or z.shape[1] < 2:
-> 1551             raise TypeError("Input z must be at least a 2x2 array.")
1552         else:
1553             Ny, Nx = z.shape

TypeError: Input z must be at least a 2x2 array.

我非常感谢你的帮助,谢谢。

EN

回答 1

Stack Overflow用户

发布于 2022-04-25 04:19:37

你可以定义一个点的网格,然后预测每个点。根据结果,我们可以找出每个方面的预测不同的点。因此,通过将点连接起来,我们就有了一个近似的判定边界。然而,这可能是计算昂贵的,如果面积是大的,或一个详细的网格是需要的。

以下是一些参考资料。

Some code on stackexchange

A similar question on stackoverflow

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60495486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档