animation.FuncAnimation ValueError:对已关闭文件的I/O操作 [英] animation.FuncAnimation ValueError: I/O operation on closed file

查看:57
本文介绍了animation.FuncAnimation ValueError:对已关闭文件的I/O操作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我很难再现下面的代码,虽然我了解渐变下降的工作原理,但我不希望它出现在演示文稿中,我不知道animation.FuncAnimation函数有什么问题.我花了4个小时来找到解决问题的方法,但不幸的是我没有.以下是我要复制的代码(我使用jupyter-notebook)

I'm having trouble reproducing the below code which I wanted badly for a presentation, although I understand how gradient descent works, I don't know whats wrong with the animation.FuncAnimation function. I spent 4 hrs to find a solution for the issue but unfortunately I couldn't. Below is the code which I'm trying to reproduce(I use jupyter-notebook)

%matplotlib inline
import math,os,sys,numpy as np
from numpy.random import random
from matplotlib import pyplot as plt, rcParams, animation, rc
from __future__ import print_function, division
from ipywidgets import interact, interactive, fixed 
from ipywidgets.widgets import *
rc('animation', html='html5')
rcParams['figure.figsize'] = 3,3
%precision 4
np.set_printoptions(precision=4, linewidth=100)

def lin(a,x,b): return a * x + b

a = 3.
b = 8.
n = 30

x = random(n)
y = lin(a,x,b)

plt.scatter(x,y)

def sse(y, y_pred): return ((y-y_pred)**2).sum()
def loss(y, a, x, b): return sse(y, lin(a, x, b))
def avg_loss(y, a, x, b): return np.sqrt(loss(y, a, x, b)/n)

a_guess = -1
b_guess = 1
avg_loss(y, a_guess, x, b_guess)

lr = 0.01
#d[(y-(a*x+b))**2, b] = 2 (y_pred - y)
#d[(y -(a*x+b)) **2, a] = x * dy/db

def upd():
    global a_guess, b_guess
    y_pred = lin(a_guess, x, b_guess)
    dydb = 2 * (y_pred - y)
    dyda = x * dydb
    a_guess -= lr*dyda.mean()
    b_guess -= lr*dydb.mean()


fig = plt.figure(dpi=100, figsize=(5,5))
plt.scatter(x,y)
line, = plt.plot(x, lin(a_guess, x, b_guess))
plt.close()

def animate(i):
    line.set_ydata(lin(a_guess, x, b_guess))
    for i in range(10): upd()
    return line,


ani = animation.FuncAnimation(fig, animate, np.arange(0, 40), interval=100)
ani

但是当我运行它时,出现以下错误,

 ValueError Traceback (most recent call last)
/home/gopinath/Workspace/anaconda3/envs/py27/lib/python2.7/site-packages/IPython/core/formatters.pyc in __call__(self, obj)
    309             method = get_real_method(obj, self.print_method)
    310             if method is not None:
--> 311                 return method()
    312             return None
    313         else:

/home/gopinath/Workspace/anaconda3/envs/py27/lib/python2.7/site-packages/matplotlib/animation.pyc in _repr_html_(self)
   1233         fmt = rcParams['animation.html']
   1234         if fmt == 'html5':
-> 1235             return self.to_html5_video()
   1236 
   1237 

/home/gopinath/Workspace/anaconda3/envs/py27/lib/python2.7/site-packages/matplotlib/animation.pyc in to_html5_video(self)
   1207                                 bitrate=rcParams['animation.bitrate'],
   1208                                 fps=1000. / self._interval)
-> 1209                 self.save(f.name, writer=writer)
   1210 
   1211             # Now open and base64 encode

/home/gopinath/Workspace/anaconda3/envs/py27/lib/python2.7/site-packages/matplotlib/animation.pyc in save(self, filename, writer, fps, dpi, codec, bitrate, extra_args, metadata, extra_anim, savefig_kwargs)
   1061                         # TODO: See if turning off blit is really necessary
   1062                         anim._draw_next_frame(d, blit=False)
-> 1063                     writer.grab_frame(**savefig_kwargs)
   1064 
   1065         # Reconnect signal for first draw if necessary

/home/gopinath/Workspace/anaconda3/envs/py27/lib/python2.7/contextlib.pyc in __exit__(self, type, value, traceback)
     33                 value = type()
     34             try:
---> 35                 self.gen.throw(type, value, traceback)
     36                 raise RuntimeError("generator didn't stop after throw()")
     37             except StopIteration, exc:

/home/gopinath/Workspace/anaconda3/envs/py27/lib/python2.7/site-packages/matplotlib/animation.pyc in saving(self, *args, **kw)
    287             yield self
    288         finally:
--> 289             self.finish()
    290 
    291     def _run(self):

/home/gopinath/Workspace/anaconda3/envs/py27/lib/python2.7/site-packages/matplotlib/animation.pyc in finish(self)
    307     def finish(self):
    308         'Finish any processing for writing the movie.'
--> 309         self.cleanup()
    310 
    311     def grab_frame(self, **savefig_kwargs):

/home/gopinath/Workspace/anaconda3/envs/py27/lib/python2.7/site-packages/matplotlib/animation.pyc in cleanup(self)
    346     def cleanup(self):
    347         'Clean-up and collect the process used to write the movie file.'
--> 348         out, err = self._proc.communicate()
    349         self._frame_sink().close()
    350         verbose.report('MovieWriter -- '

/home/gopinath/Workspace/anaconda3/envs/py27/lib/python2.7/site-packages/subprocess32.pyc in communicate(self, input, timeout)
    925 
    926         try:
--> 927             stdout, stderr = self._communicate(input, endtime, timeout)
    928         finally:
    929             self._communication_started = True

/home/gopinath/Workspace/anaconda3/envs/py27/lib/python2.7/site-packages/subprocess32.pyc in _communicate(self, input, endtime, orig_timeout)
   1711             if _has_poll:
   1712                 stdout, stderr = self._communicate_with_poll(input, endtime,
-> 1713                                                              orig_timeout)
   1714             else:
   1715                 stdout, stderr = self._communicate_with_select(input, endtime,

/home/gopinath/Workspace/anaconda3/envs/py27/lib/python2.7/site-packages/subprocess32.pyc in _communicate_with_poll(self, input, endtime, orig_timeout)
   1767             select_POLLIN_POLLPRI = select.POLLIN | select.POLLPRI
   1768             if self.stdout:
-> 1769                 register_and_append(self.stdout, select_POLLIN_POLLPRI)
   1770                 stdout = self._fd2output[self.stdout.fileno()]
   1771             if self.stderr:

/home/gopinath/Workspace/anaconda3/envs/py27/lib/python2.7/site-packages/subprocess32.pyc in register_and_append(file_obj, eventmask)
   1746             poller = select.poll()
   1747             def register_and_append(file_obj, eventmask):
-> 1748                 poller.register(file_obj.fileno(), eventmask)
   1749                 self._fd2file[file_obj.fileno()] = file_obj
   1750 

ValueError: I/O operation on closed file
<matplotlib.animation.FuncAnimation at 0x7f085e3c0fd0>

正在寻找帮助!

提前谢谢:)

推荐答案

在Ubuntu 18.04.2.上对我来说是同样的问题.我在删除conda后安装了最新的ffmpeg版本,效果很好

Same problem for me on Ubuntu 18.04.2. I installed the newest ffmpeg version after removing the conda one and it worked fine

这篇关于animation.FuncAnimation ValueError:对已关闭文件的I/O操作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆