我正在尝试绘制一些神经网络输出,但没有得到任何结果。绘制诸如plot(iris)之类的常规内容可以很好地工作,但是neuralnetwork()对象的某些地方似乎并没有以相同的方式绘制。

我的文件看起来像:

---
title: "stack"
author: "stack"
date: "today"
output:
  pdf_document: default
  html_document: default
---


```{r}
library(neuralnet)
AND <- c(rep(0,3),1)
binary.data <- data.frame(expand.grid(c(0,1), c(0,1)), AND)
net <- neuralnet(AND~Var1+Var2,  binary.data, hidden=0,err.fct="ce", linear.output=FALSE)
plot(net)
```

而且我没有输出。同一文件可以绘制其他内容。有什么想法吗?

最佳答案

此问题has been reported并在 rmarkdown 存储库中得到了解答。在这里,我仅试图解释其无效的技术原因。

从帮助页面?neuralnet::plot.nn:

Usage

    ## S3 method for class 'nn'
    plot(x, rep = NULL, x.entry = NULL, x.out = NULL,
        ....


Arguments

  ...

  rep   repetition of the neural network. If rep="best", the repetition
        with the smallest error will be plotted. If not stated all repetitions
        will be plotted, each in a separate window.

从源代码(v1.33):
> neuralnet:::plot.nn
function (x, rep = NULL, x.entry = NULL, x.out = NULL, radius = 0.15,
    ....
{
    ....
    if (is.null(rep)) {
        for (i in 1:length(net$weights)) {
            ....
            grDevices::dev.new()
            plot.nn(net, rep = i,
                    ....
        }
    }

我已经使用上面的....省略了无关紧要的信息。基本上,如果您未指定repneuralnet:::plot.nn将打开新的图形设备以绘制图。这将破坏 knitr 的图形记录,因为
  • 它打开了图形设备,但没有要求它们打开记录(通过dev.control(displaylist = 'enable'));
  • 编织程序默认使用其自己的设备来记录图形;如果用户打开了新设备,则不能保证 knitr 可以保存新图。通常,我不建议在绘图功能中使用图形设备。

  • 我不是 Neuronet 软件包的作者,但我建议作者删除dev.new(),或至少使其成为条件代码,例如
    if (interactive()) grDevices::dev.new()
    

    我猜想dev.new()调用的意图可能是在新窗口中显示图,但实际上并不能保证用户可以看到窗口。交互式R session 的默认图形设备是窗口/屏幕设备(如果有,例如x11()quartz()),但是用户或程序包作者很可能已更改了默认设备。

    我建议使用interactive()条件,因为对于非交互式R session ,打开新的(默认是屏幕外的)设备可能没有多大意义。

    关于r - 编织和绘图神经网络,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43795530/

    10-12 17:52