Yield ValueError:在python中解压缩(预期2)的vaues太多了

时间:2017-11-21 22:03:18

标签: python tensorflow runtime-error keras generator

我在尝试实现此线程中提出的回归解决方案时遇到了问题。

Using Keras ImageDataGenerator in a regression model

另一个堆栈问题有一个类似的问题:Tensorflow ValueError: Too many vaues to unpack (expected 2)但我无法找到一个适合我的解决方案。我没有任何结果地通过了this对产量的解释。对我来说奇怪的是前两个循环完成但是当输出相同时它在第三个循环中崩溃。

对于目录,文件夹标记为0,1和2,分别对应于list_of_values中的0.1,0.3和0.5。

import numpy as np
from keras.preprocessing.image import ImageDataGenerator      
train_datagen = ImageDataGenerator(
            rescale=1./255,
            height_shift_range=0.15,
            shear_range=0.2)
def regression_flow_from_directory(flow_from_directory_gen, list_of_values):
    for x, y in flow_from_directory_gen:
        print (list_of_values[y], list_of_values,y)
        yield (x, list_of_values[y])
batch_size=3
list_of_values=[0.1,0.3,0.5]
(x_train,y_train) = regression_flow_from_directory(train_datagen.flow_from_directory(
                'figs/train',  # this is the target directory
                batch_size=batch_size,
                class_mode='sparse'),
                np.asarray(list_of_values)) 

输出

Found 9 images belonging to 3 classes.
[ 0.5  0.3  0.1] [ 0.1  0.3  0.5] [2 1 0]
[ 0.3  0.1  0.3] [ 0.1  0.3  0.5] [1 0 1]
[ 0.5  0.5  0.1] [ 0.1  0.3  0.5] [2 2 0]
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-179-3cf97453bd05> in <module>()
      5         batch_size=batch_size,
      6         class_mode='sparse'),
----> 7         np.asarray(list_of_values))  

ValueError: too many values to unpack (expected 2)

编辑:错误是将函数regression_flow_from_directory返回到两个变量(x_train,y_train)。仅返回x_train正确传递生成器。

x_train = regression_flow_from_directory(train_datagen.flow_from_directory(
        'figs/train',  # this is the target directory
        batch_size=batch_size,
        class_mode='sparse'),
        np.asarray(list_of_values)) 

2 个答案:

答案 0 :(得分:1)

该错误与np.asarray无关。函数regression_flow_from_directory包含yield语句。因此,当你调用它时,你得到的不是生成值的元组,而是生成器对象。这只是一个对象,您试图将其解压缩为一个双元素元组。这就是错误消息的原因。

答案 1 :(得分:0)

(x_train,y_train) = regression_flow_from_directory(
    train_datagen.flow_from_directory(
        'figs/train',  # this is the target directory
        batch_size=batch_size,
        class_mode='sparse'),
        np.asarray(list_of_values))

问题似乎是您的例程regression_flow_from_directory返回两个以上的值。您在该作业的左侧有一对,因此您必须在右侧有两个值。尝试打印实际的返回值,而不是组件。例如:

result = regression_flow_from_directory(...)
print (result)
(x,y) = result

你会看到问题:你必须用regression_flow_from_directory 迭代这些参数。

委托人的简单例子:

>>> (x, y) = 1, 2
>>> x
1
>>> y
2
>>> (x, y) = 1, 2, 3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: too many values to unpack