为什么这个python生成器根据keras没有输出?

时间:2016-06-13 20:16:50

标签: python keras

编辑:更新所有代码以组织此问题,但同样的问题和问题。

def extract_hypercolumn(model, layer_indexes, instance):
    layers = [model.layers[li].output for li in layer_indexes]
    get_feature = K.function([model.layers[0].input],layers)
    assert instance.shape == (1,3,224,224)
    feature_maps = get_feature([instance])
    hypercolumns = []
    for convmap in feature_maps:
        for fmap in convmap[0]:
            upscaled = sp.misc.imresize(fmap, size=(224, 224),
                                        mode="F", interp='bilinear')
            hypercolumns.append(upscaled)

    return np.asarray(hypercolumns)

def get_arrays(each_file):
    img = color.rgb2lab(io.imread(each_file)[..., :3])
    X = img[:,:,:1]
    y = img[:,:,1:]
    X_rows,X_columns,X_channels=X.shape
    y_rows,y_columns,y_channels=y.shape
    X_channels_first = np.transpose(X,(2,0,1))
    X_sample = np.expand_dims(X_channels_first,axis=0)
    X_3d = np.tile(X_sample,(1,3,1,1))
    hc = extract_hypercolumn(model,[3,8],X_3d)
    hc_expand_dims = np.expand_dims(hc,axis=0)
    y_reshaped = np.reshape(y,(y_rows*y_columns,y_channels))
    classed_pixels_first = KNN.predict_proba(y_reshaped)
    classed_classes_first = np.transpose(classed_pixels_first,(1,0))
    classed_expand_dims = np.expand_dims(classed_classes_first,axis=0)
    print "hypercolumn shape: ",hc_expand_dims.shape,"classified output color shape: ",classed_expand_dims.shape
    return hc_expand_dims,classed_expand_dims


def generate_batch():
    files = glob.glob('../manga-resized/sliced/*.png')
    while True:
        random.shuffle(files)
        for fl in files:
            yield get_arrays(fl)

colorize = Colorize()
colorize.compile(optimizer=sgd,loss='categorical_crossentropy',metrics=["accuracy"])


colorize.fit_generator(generate_batch(),samples_per_epoch=1,nb_epoch=5)

这是追溯(使用Tensorflow):

    Using TensorFlow backend.
output shape:  (None, 112, 228, 228)
output_shape after reshaped:  (None, 112, 51984)
Epoch 1/5
Traceback (most recent call last):
  File "load.py", line 152, in <module>
    colorize.fit_generator(generate_batch(),samples_per_epoch=1,nb_epoch=5)
  File "/Users/alex/anaconda2/lib/python2.7/site-packages/keras/models.py", line 651, in fit_generator
    max_q_size=max_q_size)
  File "/Users/alex/anaconda2/lib/python2.7/site-packages/keras/engine/training.py", line 1358, in fit_generator
    'or (x, y). Found: ' + str(generator_output))
Exception: output of generator should be a tuple (x, y, sample_weight) or (x, y). Found: None
Exception in thread Thread-1:
Traceback (most recent call last):
  File "/Users/alex/anaconda2/lib/python2.7/threading.py", line 801, in __bootstrap_inner
    self.run()
  File "/Users/alex/anaconda2/lib/python2.7/threading.py", line 754, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/Users/alex/anaconda2/lib/python2.7/site-packages/keras/engine/training.py", line 404, in data_generator_task
    generator_output = next(generator)
StopIteration

并使用theano - 请注意,此处超级列和分类标签已成功打印 - 看起来这更接近于工作:

更新:它使用theano工作!我很满意。然而,我猜这个问题仍然存在于张量流中

现在,当我尝试:

for a, b in generate_batch(): print(a, b)

print list(islice(generate_batch(), 3))

编辑:新的发展 - 他们的工作!

这完美地工作至少它打印出numpy数组而不是错误。但是,Keras问题仍然存在

这让我想知道我是否只是遇到了keras的限制 - 因为有太多的数据预处理 - 将图像输入VGG,提取超级列,在标签上执行KNN分类等。适合的发电机试图获得批次,但做了大量的工作。也许它太多了所以它只是看到返回值为空,因为它占用了大量的内存/带宽。

我知道张量流例如为这个确切的问题建立了整个排队系统。知道这是否是我所经历的 - 而不是实现错误,这将是非常棒的。任何keras专家在那里关心重量??? :)

2 个答案:

答案 0 :(得分:3)

在fit_generator中,

生成器应该是无限的(循环数据)。

c.f。 keras documentation on fit_generator

  

预计生成器将无限期地循环其数据。

尝试将您的功能generate_batch更改为:

def generate_batch():
    files = glob.glob('../manga-resized/sliced/*.png')
    while True:
        random.shuffle(files)
        for fl in files:
            yield get_arrays(fl)

此外:

我认为您的代码问题来自

y_reshaped = (y,(y_rows*y_columns,y_channels))

这条线似乎根本没有重塑。它只是创建一个包含2个元素的元组:numpy数组y和元组(y_rows*y_columns,y_channels)

我想你应该写点像

y_reshaped = np.reshape(y,(y_rows*y_columns,y_channels))

答案 1 :(得分:0)

我遇到了与theano后端完全相同的问题。 我通过发现当我更多地增加“max_q_size”时来探测这个问题,这个bug早先出现了。这意味着它是一个队列问题并且与入队操作有关!!!

事实上,在我的情况下,batch_generator中缺少“while True”会产生这样的错误:当一个时代的训练接近生成器中可用的所有训练样本都被加载到队列中时,那么生成器必须将“None”排入队列作为“next_sample”,fit_generator最终会遇到“None”并报告您提到的错误。