JavaEar 专注于收集分享传播有价值的技术资料

类型对象'图像'没有属性'fromarray' (type object 'Image' has no attribute 'fromarray')

When I compile my code, it request me the result like below:

D:\Python\Anaconda3\envs\tensorflow\python.exe D:/Python/pycharm_project/test/mnist_chuji
2017-08-15 14:07:37.587932: W c:\tf_jenkins\home\workspace\release-win\device\cpu\os\windows\tensorflow\core\platform\cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE instructions, but these are available on your machine and could speed up CPU computations.
2017-08-15 14:07:37.588611: W c:\tf_jenkins\home\workspace\release-win\device\cpu\os\windows\tensorflow\core\platform\cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE2 instructions, but these are available on your machine and could speed up CPU computations.
2017-08-15 14:07:37.589142: W c:\tf_jenkins\home\workspace\release-win\device\cpu\os\windows\tensorflow\core\platform\cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE3 instructions, but these are available on your machine and could speed up CPU computations.
2017-08-15 14:07:37.589598: W c:\tf_jenkins\home\workspace\release-win\device\cpu\os\windows\tensorflow\core\platform\cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.1 instructions, but these are available on your machine and could speed up CPU computations.
2017-08-15 14:07:37.590038: W c:\tf_jenkins\home\workspace\release-win\device\cpu\os\windows\tensorflow\core\platform\cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are available on your machine and could speed up CPU computations.
2017-08-15 14:07:37.590437: W c:\tf_jenkins\home\workspace\release-win\device\cpu\os\windows\tensorflow\core\platform\cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX instructions, but these are available on your machine and could speed up CPU computations.
Traceback (most recent call last):
  File "D:/Python/pycharm_project/test/mnist_chuji", line 52, in <module>
    DisplayArray(u_init, rng=[-0.1, 0.1])
  File "D:/Python/pycharm_project/test/mnist_chuji", line 15, in DisplayArray
    Image.fromarray(a).save(f, fmt)
AttributeError: type object 'Image' has no attribute 'fromarray'

Process finished with exit code 1

And here is my code( I have marked the line numbers that happened in the error list):

#导入模拟仿真需要的库
import tensorflow as tf
import numpy as np

#导入可视化需要的库
from PIL import Image
from io import StringIO #python3 使用了io代替了sStringIO
from IPython.display import clear_output, Image, display

def DisplayArray(a, fmt='jpeg', rng=[0,1]):
  """Display an array as a picture."""
  a = (a - rng[0])/float(rng[1] - rng[0])*255
  a = np.uint8(np.clip(a, 0, 255))
  f = StringIO()
  Image.fromarray(a).save(f, fmt)            #line 15
  display(Image(data=f.getvalue()))

sess = tf.InteractiveSession()

def make_kernel(a):
  """Transform a 2D array into a convolution kernel"""
  a = np.asarray(a)
  a = a.reshape(list(a.shape) + [1,1])
  return tf.constant(a, dtype=1)

def simple_conv(x, k):
  """A simplified 2D convolution operation"""
  x = tf.expand_dims(tf.expand_dims(x, 0), -1)
  y = tf.nn.depthwise_conv2d(x, k, [1, 1, 1, 1], padding='SAME')
  return y[0, :, :, 0]

def laplace(x):
  """Compute the 2D laplacian of an array"""
  laplace_k = make_kernel([[0.5, 1.0, 0.5],
                           [1.0, -6., 1.0],
                           [0.5, 1.0, 0.5]])
  return simple_conv(x, laplace_k)

N = 500

# Initial Conditions -- some rain drops hit a pond

# Set everything to zero
u_init = np.zeros([N, N], dtype="float32")
ut_init = np.zeros([N, N], dtype="float32")

# Some rain drops hit a pond at random points
for n in range(40):
  a,b = np.random.randint(0, N, 2)
  u_init[a,b] = np.random.uniform()

DisplayArray(u_init, rng=[-0.1, 0.1])          #line 52

# Parameters:
# eps -- time resolution
# damping -- wave damping
eps = tf.placeholder(tf.float32, shape=())
damping = tf.placeholder(tf.float32, shape=())

# Create variables for simulation state
U  = tf.Variable(u_init)
Ut = tf.Variable(ut_init)

# Discretized PDE update rules
U_ = U + eps * Ut
Ut_ = Ut + eps * (laplace(U) - damping * Ut)

# Operation to update the state
step = tf.group(
  U.assign(U_),
  Ut.assign(Ut_))

# Initialize state to initial conditions
tf.initialize_all_variables().run()

# Run 1000 steps of PDE
for i in range(1000):
  # Step simulation
  step.run({eps: 0.03, damping: 0.04})
  # Visualize every 50 steps
  if i % 50 == 0:
    clear_output()
    DisplayArray(U.eval(), rng=[-0.1, 0.1])

I don't why my 'Image' has no attribute 'fromarray'. I have installed the lib pillow.

At the beginning, I thought maybe because there are two versions of python(2.7 and 3.5) in my computer that makes this problem. then, I uninstall all my python environment and install py3.5 only again with installing the pillow. But there is no help...

1个回答

    最佳答案

  1. 英文原文

    Try this

        #导入模拟仿真需要的库
    import tensorflow as tf
    import numpy as np
    
    #导入可视化需要的库
    from PIL import Image
    from io import StringIO #python3 使用了io代替了sStringIO
    from IPython.display import clear_output, Image as displayImage, display
    
    def DisplayArray(a, fmt='jpeg', rng=[0,1]):
      """Display an array as a picture."""
      a = (a - rng[0])/float(rng[1] - rng[0])*255
      a = np.uint8(np.clip(a, 0, 255))
      f = StringIO()
      Image.fromarray(a).save(f, fmt)            #line 15
      display(displayImage(data=f.getvalue()))
    
    sess = tf.InteractiveSession()
    
    def make_kernel(a):
      """Transform a 2D array into a convolution kernel"""
      a = np.asarray(a)
      a = a.reshape(list(a.shape) + [1,1])
      return tf.constant(a, dtype=1)
    
    def simple_conv(x, k):
      """A simplified 2D convolution operation"""
      x = tf.expand_dims(tf.expand_dims(x, 0), -1)
      y = tf.nn.depthwise_conv2d(x, k, [1, 1, 1, 1], padding='SAME')
      return y[0, :, :, 0]
    
    def laplace(x):
      """Compute the 2D laplacian of an array"""
      laplace_k = make_kernel([[0.5, 1.0, 0.5],
                               [1.0, -6., 1.0],
                               [0.5, 1.0, 0.5]])
      return simple_conv(x, laplace_k)
    
    N = 500
    
    # Initial Conditions -- some rain drops hit a pond
    
    # Set everything to zero
    u_init = np.zeros([N, N], dtype="float32")
    ut_init = np.zeros([N, N], dtype="float32")
    
    # Some rain drops hit a pond at random points
    for n in range(40):
      a,b = np.random.randint(0, N, 2)
      u_init[a,b] = np.random.uniform()
    
    DisplayArray(u_init, rng=[-0.1, 0.1])          #line 52
    
    # Parameters:
    # eps -- time resolution
    # damping -- wave damping
    eps = tf.placeholder(tf.float32, shape=())
    damping = tf.placeholder(tf.float32, shape=())
    
    # Create variables for simulation state
    U  = tf.Variable(u_init)
    Ut = tf.Variable(ut_init)
    
    # Discretized PDE update rules
    U_ = U + eps * Ut
    Ut_ = Ut + eps * (laplace(U) - damping * Ut)
    
    # Operation to update the state
    step = tf.group(
      U.assign(U_),
      Ut.assign(Ut_))
    
    # Initialize state to initial conditions
    tf.initialize_all_variables().run()
    
    # Run 1000 steps of PDE
    for i in range(1000):
      # Step simulation
      step.run({eps: 0.03, damping: 0.04})
      # Visualize every 50 steps
      if i % 50 == 0:
        clear_output()
        DisplayArray(U.eval(), rng=[-0.1, 0.1])
    

    中文翻译

    试试这个

     #导入模拟仿真需要的库
    导入张量流为tf
    导入numpy为np
    
    #导入可视化需要的库
    来自PIL导入图片
    来自io import StringIO#python3使用了io代替了sStringIO
    来自IPython.display导入clear_output,Image为displayImage,display
    
    def DisplayArray(a,fmt ='jpeg',rng = [0,1]):
      msgstr" " " 将数组显示为图片。" " 
      a =(a  -  rng [0])/ float(rng [1]  -  rng [0])* 255
      a = np.uint8(np.clip(a,0,255))
      f = StringIO()
      Image.fromarray(a).save(f,fmt)#line 15
      显示器(displayImage(数据= f.getvalue()))
    
    sess = tf.InteractiveSession()
    
    def make_kernel(a):
      msgstr" " " 将2D数组转换为卷积内核" " " 
      a = np.asarray(a)
      a = a.reshape(list(a.shape)+ [1,1])
      return tf.constant(a,dtype = 1)
    
    def simple_conv(x,k):
      msgstr" " " 简化的2D卷积运算" " " 
      x = tf.expand_dims(tf.expand_dims(x,0), -  1)
      y = tf.nn.depthwise_conv2d(x,k,[1,1,1,1],padding ='SAME')
      返回y [0,:,:,0]
    
    def laplace(x):
      msgstr" " " 计算数组的2D拉普拉斯" " " 
      laplace_k = make_kernel([[0.5,1.0,0.5],
                               [1.0,-6。,1.0],
                               [0.5,1.0,0.5]])
      return simple_conv(x,laplace_k)
    
    N = 500
    
    #初始条件 - 一些雨滴落到池塘
    
    #将所有内容设置为零
    u_init = np.zeros([N,N],dtype =" float32" )
    ut_init = np.zeros([N,N],dtype =" float32" )
    
    #一些雨滴随机点到了池塘
    对于范围内的n(40):
      a,b = np.random.randint(0,N,2)
      u_init [a,b] = np.random.uniform()
    
    DisplayArray(u_init,rng = [ -  0.1,0.1])#line 52
    
    #参数:
    #eps  - 时间分辨率
    #阻尼 - 波阻尼
    eps = tf.placeholder(tf.float32,shape =())
    damping = tf.placeholder(tf.float32,shape =())
    
    #为模拟状态创建变量
    U = tf.Variable(u_init)
    Ut = tf.Variable(ut_init)
    
    #Discretized PDE更新规则
    U_ = U + eps * Ut
    Ut_ = Ut + eps *(laplace(U) - 阻尼* Ut)
    
    #更新状态的操作
    step = tf.group(
      U.assign(U_)
      Ut.assign(Ut_))
    
    #将状态初始化为初始条件
    tf.initialize_all_variables()。运行()
    
    #运行1000步PDE
    for in in range(1000):
      #步骤模拟
      step.run({eps:0.03,阻尼:0.04})
      #每50步可视化一次
      如果我%50 == 0:
        clear_output()
        DisplayArray(U.eval(),rng = [ -  0.1,0.1])
     

    Try this

        #导入模拟仿真需要的库
    import tensorflow as tf
    import numpy as np
    
    #导入可视化需要的库
    from PIL import Image
    from io import StringIO #python3 使用了io代替了sStringIO
    from IPython.display import clear_output, Image as displayImage, display
    
    def DisplayArray(a, fmt='jpeg', rng=[0,1]):
      """Display an array as a picture."""
      a = (a - rng[0])/float(rng[1] - rng[0])*255
      a = np.uint8(np.clip(a, 0, 255))
      f = StringIO()
      Image.fromarray(a).save(f, fmt)            #line 15
      display(displayImage(data=f.getvalue()))
    
    sess = tf.InteractiveSession()
    
    def make_kernel(a):
      """Transform a 2D array into a convolution kernel"""
      a = np.asarray(a)
      a = a.reshape(list(a.shape) + [1,1])
      return tf.constant(a, dtype=1)
    
    def simple_conv(x, k):
      """A simplified 2D convolution operation"""
      x = tf.expand_dims(tf.expand_dims(x, 0), -1)
      y = tf.nn.depthwise_conv2d(x, k, [1, 1, 1, 1], padding='SAME')
      return y[0, :, :, 0]
    
    def laplace(x):
      """Compute the 2D laplacian of an array"""
      laplace_k = make_kernel([[0.5, 1.0, 0.5],
                               [1.0, -6., 1.0],
                               [0.5, 1.0, 0.5]])
      return simple_conv(x, laplace_k)
    
    N = 500
    
    # Initial Conditions -- some rain drops hit a pond
    
    # Set everything to zero
    u_init = np.zeros([N, N], dtype="float32")
    ut_init = np.zeros([N, N], dtype="float32")
    
    # Some rain drops hit a pond at random points
    for n in range(40):
      a,b = np.random.randint(0, N, 2)
      u_init[a,b] = np.random.uniform()
    
    DisplayArray(u_init, rng=[-0.1, 0.1])          #line 52
    
    # Parameters:
    # eps -- time resolution
    # damping -- wave damping
    eps = tf.placeholder(tf.float32, shape=())
    damping = tf.placeholder(tf.float32, shape=())
    
    # Create variables for simulation state
    U  = tf.Variable(u_init)
    Ut = tf.Variable(ut_init)
    
    # Discretized PDE update rules
    U_ = U + eps * Ut
    Ut_ = Ut + eps * (laplace(U) - damping * Ut)
    
    # Operation to update the state
    step = tf.group(
      U.assign(U_),
      Ut.assign(Ut_))
    
    # Initialize state to initial conditions
    tf.initialize_all_variables().run()
    
    # Run 1000 steps of PDE
    for i in range(1000):
      # Step simulation
      step.run({eps: 0.03, damping: 0.04})
      # Visualize every 50 steps
      if i % 50 == 0:
        clear_output()
        DisplayArray(U.eval(), rng=[-0.1, 0.1])
    

    试试这个

     #导入模拟仿真需要的库
    导入张量流为tf
    导入numpy为np
    
    #导入可视化需要的库
    来自PIL导入图片
    来自io import StringIO#python3使用了io代替了sStringIO
    来自IPython.display导入clear_output,Image为displayImage,display
    
    def DisplayArray(a,fmt ='jpeg',rng = [0,1]):
      msgstr" " " 将数组显示为图片。" " 
      a =(a  -  rng [0])/ float(rng [1]  -  rng [0])* 255
      a = np.uint8(np.clip(a,0,255))
      f = StringIO()
      Image.fromarray(a).save(f,fmt)#line 15
      显示器(displayImage(数据= f.getvalue()))
    
    sess = tf.InteractiveSession()
    
    def make_kernel(a):
      msgstr" " " 将2D数组转换为卷积内核" " " 
      a = np.asarray(a)
      a = a.reshape(list(a.shape)+ [1,1])
      return tf.constant(a,dtype = 1)
    
    def simple_conv(x,k):
      msgstr" " " 简化的2D卷积运算" " " 
      x = tf.expand_dims(tf.expand_dims(x,0), -  1)
      y = tf.nn.depthwise_conv2d(x,k,[1,1,1,1],padding ='SAME')
      返回y [0,:,:,0]
    
    def laplace(x):
      msgstr" " " 计算数组的2D拉普拉斯" " " 
      laplace_k = make_kernel([[0.5,1.0,0.5],
                               [1.0,-6。,1.0],
                               [0.5,1.0,0.5]])
      return simple_conv(x,laplace_k)
    
    N = 500
    
    #初始条件 - 一些雨滴落到池塘
    
    #将所有内容设置为零
    u_init = np.zeros([N,N],dtype =" float32" )
    ut_init = np.zeros([N,N],dtype =" float32" )
    
    #一些雨滴随机点到了池塘
    对于范围内的n(40):
      a,b = np.random.randint(0,N,2)
      u_init [a,b] = np.random.uniform()
    
    DisplayArray(u_init,rng = [ -  0.1,0.1])#line 52
    
    #参数:
    #eps  - 时间分辨率
    #阻尼 - 波阻尼
    eps = tf.placeholder(tf.float32,shape =())
    damping = tf.placeholder(tf.float32,shape =())
    
    #为模拟状态创建变量
    U = tf.Variable(u_init)
    Ut = tf.Variable(ut_init)
    
    #Discretized PDE更新规则
    U_ = U + eps * Ut
    Ut_ = Ut + eps *(laplace(U) - 阻尼* Ut)
    
    #更新状态的操作
    step = tf.group(
      U.assign(U_)
      Ut.assign(Ut_))
    
    #将状态初始化为初始条件
    tf.initialize_all_variables()。运行()
    
    #运行1000步PDE
    for in in range(1000):
      #步骤模拟
      step.run({eps:0.03,阻尼:0.04})
      #每50步可视化一次
      如果我%50 == 0:
        clear_output()
        DisplayArray(U.eval(),rng = [ -  0.1,0.1])