首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Keras模型可视化地块决策边界

用Keras模型可视化地块决策边界
EN

Stack Overflow用户
提问于 2018-07-07 01:10:22
回答 1查看 4.6K关注 0票数 3

我试图用Keras绘制模型预测的决策图边界。然而,生成的边界似乎不正确。

这是我的模型

代码语言:javascript
复制
def base():
    model = Sequential()
    model.add(Dense(5,activation = 'relu', input_dim = 2))
    model.add(Dense(2,activation = 'relu'))
    model.add(Dense(1,activation = 'sigmoid'))
    model.compile(optimizer = optimizers.SGD(lr=0.0007, momentum=0.0, decay=0.0), loss = 'binary_crossentropy', metrics= ['accuracy'])      
    return model 

model = base()
history = model.fit(train_X,train_Y, epochs = 10000, batch_size =64, verbose = 2)

这是我的绘图函数(摘自这里)

代码语言:javascript
复制
def plot_decision_boundary(X, y, model, steps=1000, cmap='Paired'):
    """
    Function to plot the decision boundary and data points of a model.
    Data points are colored based on their actual label.
    """
    cmap = get_cmap(cmap)

    # Define region of interest by data limits
    xmin, xmax = X[:,0].min() - 1, X[:,0].max() + 1
    ymin, ymax = X[:,1].min() - 1, X[:,1].max() + 1
    steps = 1000
    x_span = linspace(xmin, xmax, steps)
    y_span = linspace(ymin, ymax, steps)
    xx, yy = meshgrid(x_span, y_span)

    # Make predictions across region of interest
    labels = model.predict(c_[xx.ravel(), yy.ravel()])

    # Plot decision boundary in region of interest
    z = labels.reshape(xx.shape)

    fig, ax = subplots()
    ax.contourf(xx, yy, z, cmap=cmap, alpha=0.5)

    # Get predicted labels on training data and plot
    train_labels = model.predict(X)
    ax.scatter(X[:,0], X[:,1], c=y.ravel(), cmap=cmap, lw=0)

    return fig, ax
plot_decision_boundary(train_X,train_Y, model, cmap = 'RdBu')

我得到了这样的情节

这显然是一个非常错误的描述一个情节的决定边界(根本没有信息,因为有这么多的边界)。有人能指出我的错误吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-07 06:59:07

由于概率是从0到1的连续值,所以我们得到了许多等值线。

如果您的可视化仅限于2个类(输出为2D softmax向量),则可以使用以下简单代码

代码语言:javascript
复制
def plot_model_out(x,y,model):
  """
  x,y: 2D MeshGrid input
  model: Keras Model API Object
  """
  grid = np.stack((x,y))
  grid = grid.T.reshape(-1,2)
  outs = model.predict(grid)
  y1 = outs.T[0].reshape(x.shape[0],x.shape[0])
  plt.contourf(x,y,y1)
  plt.show()

这将给出等高线(不止一个),如果您想要一条等高线,可以执行以下操作

您可以阈值的概率输出从model.predict和显示一条单一的等高线。

例如,

代码语言:javascript
复制
import numpy as np 
from matplotlib import pyplot as plt 

a = np.linspace(-5, 5, 100)
xx, yy = np.meshgrid(a,a)
z = xx**2 + yy**2
# z = z > 5 (Threshold value)
plt.contourf(xx, yy, z,)
plt.show()

对于阈值注释和未注释,我们得到了2幅图像。

由连续值引起的多个等高线

当z被阈值化时的单个轮廓(z =z> 5)

类似的方法可以用于输出softmax向量,如下所示

代码语言:javascript
复制
label = label > 0.5

有关可视化代码的更多信息,请参阅IITM CVI博客

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

https://stackoverflow.com/questions/51219154

复制
相关文章

相似问题

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