Keras / Theano异常被掩盖了

时间:2018-04-02 15:38:49

标签: keras theano

我正在使用进化算法为Keras / Theano编写的CNN找到令人满意的超参数。这种方法的随机性意味着将不时尝试病理配置,这将产生例外。在这些情况下,我想捕捉异常,因此我可以指定适当的低适应度。不幸的是,当Theano抛出一个异常时,它似乎在它到达我的try / catch块之前被掩盖了。也就是说,在某些时候异常被捕获而不是重新引发,这意味着它永远不会向上传播到达我的try / catch块。

我已经在Keras Slack工作区询问是否有一些配置我不得不在Keras中搔痒以解除这些异常,但我被告知问题不在Keras级别,这是某事与Theano。而且,我在这里。

我在相应的theanorc文件顶部有以下配置设置,我希望能解决问题:

[config]
on_opt_error = raise
on_shape_error = raise
numpy.seterr_all = raise
compute_test_value = raise

而且,这些是我看到的例外情况:

ERROR (theano.gof.opt): SeqOptimizer apply <theano.tensor.opt.ShapeOptimizer object at 0x2aaae03674a8>
ERROR (theano.gof.opt): Traceback:
ERROR (theano.gof.opt): Traceback (most recent call last):
  File "/ccs/proj/geo121/python3.5-packages/dl4sm/theano/gof/opt.py", line 235, in apply
    sub_prof = optimizer.optimize(fgraph)
  File "/ccs/proj/geo121/python3.5-packages/dl4sm/theano/gof/opt.py", line 83, in optimize
    self.add_requirements(fgraph)
  File "/ccs/proj/geo121/python3.5-packages/dl4sm/theano/tensor/opt.py", line 1482, in add_requirements
    fgraph.attach_feature(ShapeFeature())
  File "/ccs/proj/geo121/python3.5-packages/dl4sm/theano/gof/fg.py", line 541, in attach_feature
    attach(self)
  File "/ccs/proj/geo121/python3.5-packages/dl4sm/theano/tensor/opt.py", line 1299, in on_attach
    self.on_import(fgraph, node, reason='on_attach')
  File "/ccs/proj/geo121/python3.5-packages/dl4sm/theano/tensor/opt.py", line 1362, in on_import
    self.set_shape(r, s)
  File "/ccs/proj/geo121/python3.5-packages/dl4sm/theano/tensor/opt.py", line 1151, in set_shape
    shape_vars.append(self.unpack(s[i], r))
  File "/ccs/proj/geo121/python3.5-packages/dl4sm/theano/tensor/opt.py", line 1073, in unpack
    raise ValueError(msg)
ValueError: There is a negative shape in the graph!
Backtrace when that variable is created:

  File "/ccs/proj/geo121/mcoletti/dl-4-settlement-mapping/eadl/train_cnn.py", line 218, in <module>
    validation_accuracy = train_cnn(data_dir=args.data_dir, kernel_sizes=args.kernel_sizes, max_epoch=args.epoch, batch_sizes=args.batch_size)
  File "/ccs/proj/geo121/mcoletti/dl-4-settlement-mapping/eadl/train_cnn.py", line 193, in train_cnn
    model = create_cnn(kernel_sizes=kernel_sizes)
  File "/ccs/proj/geo121/mcoletti/dl-4-settlement-mapping/eadl/train_cnn.py", line 52, in create_cnn
    model.add(Conv2D(256, kernel_size=kernel_sizes[3], activation="relu", kernel_initializer="normal"))
  File "/ccs/proj/geo121/python3.5-packages/dl4sm/keras/models.py", line 475, in add
    output_tensor = layer(self.outputs[0])
  File "/ccs/proj/geo121/python3.5-packages/dl4sm/keras/engine/topology.py", line 602, in __call__
    output = self.call(inputs, **kwargs)
  File "/ccs/proj/geo121/python3.5-packages/dl4sm/keras/layers/convolutional.py", line 164, in call
    dilation_rate=self.dilation_rate)
  File "/ccs/proj/geo121/python3.5-packages/dl4sm/keras/backend/theano_backend.py", line 1890, in conv2d
    filter_dilation=dilation_rate)

而且,如果你很想看到try / catch块,那就是这样:

   try:
        validation_accuracy = train_cnn(data_dir=args.data_dir, kernel_sizes=args.kernel_sizes, max_epoch=args.epoch, batch_sizes=args.batch_size)
   except Exception as e:
        print(socket.gethostname(), ', Caught exception while training:', str(e) )

我的直觉是,这可能非常非常简单。也许我需要为THEANORC文件添加更多选项?

1 个答案:

答案 0 :(得分:0)

设置theano.config.compute_test_value = 'raise'似乎有效。

奇怪的是,应该从Theano配置文件中设置compute_test_value,这表明它没有被正确读取和解析。当我在配置文件中明确设置它时,我不必以编程方式设置此值。