2017-05-05 76 views
4

我想繪製一些神經網絡輸出,但我沒有得到任何結果。繪製正常的東西,如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) 
``` 

而且我沒有得到任何輸出。相同的文件繪製其他的東西很好。有什麼想法嗎?

+0

試試''netnet :: plot(net)'看看會發生什麼。我一直在使用'rbokeh'和'DT',並且在塊內有類似的問題,但在另一個窗口的腳本中完全沒有問題。它感覺就像某種方式的基本功能是如此。這可能不是你正在發生的事情,但它爲我工作,值得一試。 – sconfluentus

+0

最初我認爲問題是沒有'neuralnet :: plot',但我看到運行大塊而不是編織會產生一個陰謀。奇怪的確如此。 – neilfws

+1

此前已有報道:https://github.com/rstudio/rmarkdown/issues/856 –

回答

7

此問題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, 
        .... 
     } 
    } 

予省略如上所述使用....的irrelvant信息。基本上如果你沒有指定rep,neuralnet:::plot.nn會打開新的圖形設備繪製陰謀。這將打破knitr的圖形記錄,因爲

  1. 它打開圖形設備,但沒有要求他們打開記錄(通過dev.control(displaylist = 'enable'));
  2. knitr默認使用自己的設備記錄圖形;如果用戶打開新設備,則不能保證可以通過knitr節省新的地塊。一般來說,我不打算在繪圖功能中操縱圖形設備。

我不是neuralnet包的作者,但我建議作者降dev.new(),或者至少使其有條件的,例如

if (interactive()) grDevices::dev.new() 

我猜dev.new()調用的意圖很可能顯示在新窗口中地塊,但實在是沒有保證用戶可以看到窗口。 R會話的默認圖形設備是窗口/屏幕設備(如果可用,例如x11()quartz()),但用戶或程序包作者更改默認設備的可能性很大。

我建議條件interactive(),因爲對於非交互式R會話,打開新的(默認情況下,off-screen)設備可能沒有多大意義。

1

我認爲問題是對於類nn,plot的對象使用參數rep。如果未定義rep,則所有重複均繪製在單獨的窗口中(當在RMarkdown外運行時)。如果rep = "best",則僅生成具有最小錯誤的繪圖。所以這應該工作:

```{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, rep = "best") 
``` 

請參閱?plot.nn