【问题标题】:"Failed to import pydot" throws in kerasR“导入 pydot 失败”抛出 kerasR
【发布时间】:2018-05-01 10:02:31
【问题描述】:

我使用R下的keras包,我想知道是否有类似python的命令,带有plot_model(),可以显示其神经元网络

library(keras)

例如我想在R下显示这个神经网络

  model <- keras_model_sequential()
  model %>%
    layer_dense(units = 5, input_shape = 2) %>%
    layer_activation("relu") %>%
    layer_dense(units = 1)

我安装了 kerasR 包以使用函数 plot_model(),但是我有这个错误。

> library(kerasR)
> plot_model(model)

Error in py_call_impl(callable, dots$args, dots$keywords) : 
  ImportError: Failed to import pydot. You must install pydot and graphviz for `pydotprint` to work.

Detailed traceback: 
  File "C:\Users\Idriss\ANACON~1\envs\R-TENS~1\lib\site-packages\keras\utils\vis_utils.py", line 131, in plot_model
    dot = model_to_dot(model, show_shapes, show_layer_names, rankdir)
  File "C:\Users\Idriss\ANACON~1\envs\R-TENS~1\lib\site-packages\keras\utils\vis_utils.py", line 52, in model_to_dot
    _check_pydot()
  File "C:\Users\Idriss\ANACON~1\envs\R-TENS~1\lib\site-packages\keras\utils\vis_utils.py", line 27, in _check_pydot
    raise ImportError('Failed to import pydot. You must install pydot'

我使用的是 Windows 10 64 位,我使用带有 Anaconda 的 RStudio


在[4] pydot.Dot.create(pydot.Dot())

Out[4]: b"%!PS-Adobe-3.0\r\n%%Creator: graphviz version 2.38.0 (20140413.2041)\r\n%%Title: G\r\n%%Pages: (atend)\r\n%%BoundingBox: (atend)\r\n%%EndComments\r\nsave\r\n%%BeginProlog\r\n/DotDict 200 dict def\r\nDotDict begin\r\n\r\n/setupLatin1 {\r\nmark\r\n/EncodingVector 256 array def\r\n EncodingVector 0\r\n\r\nISOLatin1Encoding 0 255 getinterval putinterval\r\nEncodingVector 45 /hyphen put\r\n\r\n% Set up ISO Latin 1 character encoding\r\n/starnetISO {\r\n        dup dup findfont dup length dict begin\r\n        { 1 index /FID ne { def }{ pop pop } ifelse\r\n        } forall\r\n        /Encoding EncodingVector def\r\n        currentdict end definefont\r\n} def\r\n/Times-Roman starnetISO def\r\n/Times-Italic starnetISO def\r\n/Times-Bold starnetISO def\r\n/Times-BoldItalic starnetISO def\r\n/Helvetica starnetISO def\r\n/Helvetica-Oblique starnetISO def\r\n/Helvetica-Bold starnetISO def\r\n/Helvetica-BoldOblique starnetISO def\r\n/Courier starnetISO def\r\n/Courier-Oblique starnetISO def\r\n/Courier-Bold starnetISO def\r\n/Courier-BoldOblique starnetISO def\r\ncleartomark\r\n} bind def\r\n\r\n%%BeginResource: procset graphviz 0 0\r\n/coord-font-family /Times-Roman def\r\n/default-font-family /Times-Roman def\r\n/coordfont coord-font-family findfont 8 scalefont def\r\n\r\n/InvScaleFactor 1.0 def\r\n/set_scale {\r\n       dup 1 exch div /InvScaleFactor exch def\r\n       scale\r\n} bind def\r\n\r\n% styles\r\n/solid { [] 0 setdash } bind def\r\n/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def\r\n/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def\r\n/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def\r\n/bold { 2 setlinewidth } bind def\r\n/filled { } bind def\r\n/unfilled { } bind def\r\n/rounded { } bind def\r\n/diagonals { } bind def\r\n/tapered { } bind def\r\n\r\n% hooks for setting color \r\n/nodecolor { sethsbcolor } bind def\r\n/edgecolor { sethsbcolor } bind def\r\n/graphcolor { sethsbcolor } bind def\r\n/nopcolor {pop pop pop} bind def\r\n\r\n/beginpage {\t% i j npages\r\n\t/npages exch def\r\n\t/j exch def\r\n\t/i exch def\r\n\t/str 10 string def\r\n\tnpages 1 gt {\r\n\t\tgsave\r\n\t\t\tcoordfont setfont\r\n\t\t\t0 0 moveto\r\n\t\t\t(\\() show i str cvs show (,) show j str cvs show (\\)) show\r\n\t\tgrestore\r\n\t} if\r\n} bind def\r\n\r\n/set_font {\r\n\tfindfont exch\r\n\tscalefont setfont\r\n} def\r\n\r\n% draw text fitted to its expected width\r\n/alignedtext {\t\t\t% width text\r\n\t/text exch def\r\n\t/width exch def\r\n\tgsave\r\n\t\twidth 0 gt {\r\n\t\t\t[] 0 setdash\r\n\t\t\ttext stringwidth pop width exch sub text length div 0 text ashow\r\n\t\t} if\r\n\tgrestore\r\n} def\r\n\r\n/boxprim {\t\t\t\t% xcorner ycorner xsize ysize\r\n\t\t4 2 roll\r\n\t\tmoveto\r\n\t\t2 copy\r\n\t\texch 0 rlineto\r\n\t\t0 exch rlineto\r\n\t\tpop neg 0 rlineto\r\n\t\tclosepath\r\n} bind def\r\n\r\n/ellipse_path {\r\n\t/ry exch def\r\n\t/rx exch def\r\n\t/y exch def\r\n\t/x exch def\r\n\tmatrix currentmatrix\r\n\tnewpath\r\n\tx y translate\r\n\trx ry scale\r\n\t0 0 1 0 360 arc\r\n\tsetmatrix\r\n} bind def\r\n\r\n/endpage { showpage } bind def\r\n/showpage { } def\r\n\r\n/layercolorseq\r\n\t[\t% layer color sequence - darkest to lightest\r\n\t\t[0 0 0]\r\n\t\t[.2 .8 .8]\r\n\t\t[.4 .8 .8]\r\n\t\t[.6 .8 .8]\r\n\t\t[.8 .8 .8]\r\n\t]\r\ndef\r\n\r\n/layerlen layercolorseq length def\r\n\r\n/setlayer {/maxlayer exch def /curlayer exch def\r\n\tlayercolorseq curlayer 1 sub layerlen mod get\r\n\taload pop sethsbcolor\r\n\t/nodecolor {nopcolor} def\r\n\t/edgecolor {nopcolor} def\r\n\t/graphcolor {nopcolor} def\r\n} bind def\r\n\r\n/onlayer { curlayer ne {invis} if } def\r\n\r\n/onlayers {\r\n\t/myupper exch def\r\n\t/mylower exch def\r\n\tcurlayer mylower lt\r\n\tcurlayer myupper gt\r\n\tor\r\n\t{invis} if\r\n} def\r\n\r\n/curlayer 0 def\r\n\r\n%%EndResource\r\n%%EndProlog\r\n%%BeginSetup\r\n14 default-font-family set_font\r\n1 setmiterlimit\r\n% /arrowlength 10 def\r\n% /arrowwidth 5 def\r\n\r\n% make sure pdfmark is harmless for PS-interpreters other than Distiller\r\n/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse\r\n% make '<<' and '>>' safe on PS Level 1 devices\r\n/languagelevel where {pop languagelevel}{1} ifelse\r\n2 lt {\r\n    userdict (<<) cvn ([) cvn load put\r\n    userdict (>>) cvn ([) cvn load put\r\n} if\r\n\r\n%%EndSetup\r\nsetupLatin1\r\n%%Page: 1 1\r\n%%PageBoundingBox: 36 36 44 44\r\n%%PageOrientation: Portrait\r\n0 0 1 beginpage\r\ngsave\r\n36 36 8 8 boxprim clip newpath\r\n1 1 set_scale 0 rotate 40 40 translate\r\nendpage\r\nshowpage\r\ngrestore\r\n%%PageTrailer\r\n%%EndPage: 1\r\n%%Trailer\r\n%%Pages: 1\r\n%%BoundingBox: 36 36 44 44\r\nend\r\nrestore\r\n%%EOF\r\n"

【问题讨论】:

标签: r keras


【解决方案1】:

您应该安装 Python 库:

pip install pydot graphviz 

您还需要下载 graphviz 二进制文件,这些文件没有随 Python 一起安装。

在 Ubuntu 上,您可以使用 apt 安装它们:

apt-get install -y graphviz libgraphviz-dev

在 osX 上使用 brew:

brew install graphviz

对于 Windows 和其他操作系统,可以在 http://www.graphviz.org/ 找到说明

【讨论】:

    【解决方案2】:

    首先,错误:

      File "C:\Users\Idriss\ANACON~1\envs\R-TENS~1\lib\site-packages\keras\utils\vis_utils.py", line 52, in model_to_dot
        _check_pydot()
    

    如果我们检查文件C:\Users\Idriss\ANACON~1\envs\R-TENS~1\lib\site-packages\keras\utils\vis_utils.py并搜索函数_check_pydot()

    def _check_pydot():
        try:
            # Attempt to create an image of a blank graph
            # to check the pydot/graphviz installation.
            pydot.Dot.create(pydot.Dot())
        except Exception:
            # pydot raises a generic Exception here,
            # so no specific class can be caught.
            raise ImportError('Failed to import pydot. You must install pydot'
                              ' and graphviz for `pydotprint` to work.')
    

    此错误消息缺少信息,因为它捕获所有exception 而不是特定的执行并引发硬编码错误ImportError(Failed to import blah blah)

    为确保它导入相关的pydot,我们还应该检查该文件中的导入部分(重新运行Rlibrary(kerasR) 进行测试):

    import os
    print("hole 0")
    try:
        # pydot-ng is a fork of pydot that is better maintained.
        import pydot_ng as pydot
        print("hole 1")
    
    except ImportError:
        # pydotplus is an improved version of pydot
        try:
            print("hole 1.2")
            import pydotplus as pydot
            print("hole 2")
    
        except ImportError:
            # Fall back on pydot if necessary.
            try:
                print("hole 3")
                import pydot
            except ImportError:
                print("hole 4")
                pydot = None
    print("hole -1: " + str(locals())) #alternative way to debug
    ...
    

    提示:更安全的调试方法是使用repr 而不是str

    如果你在交互模式下手动运行python并执行pydot.Dot.create(pydot.Dot()),你会发现确切的异常(下面是我的Linux示例):

    xb@dnxb:~/anaconda3/envs/r-tensorflow/bin$ ./python
    Python 3.6.3 |Anaconda, Inc.| (default, Nov 20 2017, 20:41:42) 
    [GCC 7.2.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import pydot
    >>> pydot.Dot()
    <pydot.Dot object at 0x7f7d045cdb38>
    >>> pydot.Dot
    <class 'pydot.Dot'>
    >>> pydot.Dot.create(pydot.Dot())
    Traceback (most recent call last):
      File "/home/xiaobai/anaconda3/envs/r-tensorflow/lib/python3.6/site-packages/pydot.py", line 1878, in create
        stderr=subprocess.PIPE, stdout=subprocess.PIPE)
      File "/home/xiaobai/anaconda3/envs/r-tensorflow/lib/python3.6/subprocess.py", line 709, in __init__
        restore_signals, start_new_session)
      File "/home/xiaobai/anaconda3/envs/r-tensorflow/lib/python3.6/subprocess.py", line 1344, in _execute_child
        raise child_exception_type(errno_num, err_msg, err_filename)
    FileNotFoundError: [Errno 2] No such file or directory: 'dot': 'dot'
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/home/xiaobai/anaconda3/envs/r-tensorflow/lib/python3.6/site-packages/pydot.py", line 1883, in create
        prog=prog))
    Exception: "dot" not found in path.
    >>>
    

    让我们打印文件/home/xiaobai/anaconda3/envs/r-tensorflow/lib/python3.6/site-packages/pydot.py 1878 行之前使用的一些变量:

    try:
        print("env: " + str(env))
        print("cmdline: " + str(cmdline))
        print("tmp_dir: " + str(tmp_dir))
        p = subprocess.Popen(
            cmdline,
            env=env,
            cwd=tmp_dir,
            shell=False,
            stderr=subprocess.PIPE, stdout=subprocess.PIPE)
    except OSError as e:
        if e.errno == os.errno.ENOENT:
            raise Exception(
                '"{prog}" not found in path.'.format(
                    prog=prog))
        else:
            raise
    

    重启你的python解释器,重新运行import pydotpydot.Dot.create(pydot.Dot()),会显示:

    xb@dnxb:~/anaconda3/envs/r-tensorflow/bin$ ./python
    Python 3.6.3 |Anaconda, Inc.| (default, Nov 20 2017, 20:41:42) 
    [GCC 7.2.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import pydot
    >>> pydot.Dot.create(pydot.Dot())
    env: {'PATH': '/home/xiaobai/anaconda3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:...<My other PATH>'}
    cmdline: ['dot', '-Tps', '/tmp/tmpffo17gx5']
    tmp_dir: /tmp
    Traceback (most recent call last):
      File "/home/xiaobai/anaconda3/envs/r-tensorflow/lib/python3.6/site-packages/pydot.py", line 1881, in create
        stderr=subprocess.PIPE, stdout=subprocess.PIPE)
    

    所以基本上它的作用是运行命令dot -Tps /tmp/tmpffo17gx5,但由于找不到dot 命令而失败。

    在 Linux 中,如果我在终端手动运行命令,它会建议运行 sudo apt install graphviz 来安装 dot

    xb@dnxb:~/anaconda3/envs/r-tensorflow/bin$ dot
    The program 'dot' is currently not installed. You can install it by typing:
    sudo apt install graphviz
    xb@dnxb:~/anaconda3/envs/r-tensorflow/bin$ sudo apt install graphviz
    ...
    

    现在运行dot -Tps /tmp/tmpffo17gx5会成功:

    xb@dnxb:~/anaconda3/envs/r-tensorflow/bin$ dot -Tps /tmp/tmpffo17gx5 
    %!PS-Adobe-3.0
    %%Creator: graphviz version 2.38.0 (20140413.2041)
    %%Title: G
    %%Pages: (atend)
    %%BoundingBox: (atend)
    %%EndComments
    save
    %%BeginProlog
    /DotDict 200 dict def
    DotDict begin
    ...
    

    重启 R 会话,不再报错:

    > plot_model(model)
    > 
    

    这个sudo apt install graphviz 是针对 Linux 的,但我希望这个答案可以帮助您调试 Windows 中的错误。

    【讨论】:

    • 你好,我不太明白,在文件 vis_utils.py , anaconda3/envs/r-tensorflow/lib/python3.6/site-packages/ pydot.py ,我改变了 repr 中的所有 str ?
    • @problème0123 您不必更改,除非您收到该行的错误。 print() 行如print("env: " + str(env)) 是我添加的,其中str() 是打印变量以进行调试的函数。 str() 在大多数情况下都有效,但它可能会遇到编码问题,而repr() 函数则没有这样的问题。
    • 您好,我在 Spyder(python 3.6)中执行命令 pydot.Dot.create(pydot.Dot()),我编辑了我的第一篇文章以显示结果。
    • @problème0123 plot_model(model) 仍然收到错误 'Failed to import pydot. You must install pydot' 吗?如果plot_model(model) 没有更多错误,则无需测试。
    猜你喜欢
    • 2018-07-08
    • 2016-08-21
    • 2018-09-21
    • 2020-02-14
    • 1970-01-01
    • 2020-06-10
    • 2019-11-05
    • 2019-08-20
    • 1970-01-01
    相关资源
    最近更新 更多