2017-12-30 18 views
0

私は単純なカスタムレイヤオブジェクトを使用して、コレスキー分解によるマルチヴァーテールノーマルノイズを生成します。すべて正常に動作しますが、 'load_model'は 'ModelCheckPoint'によって保存された最良のモデルを読み込みます。カスタムレイヤオブジェクトを持つKeras 'load_model'

カスタム層である:ここ

import kears as ks 
import keras.backend as K 


class MVGaussianNoise(Layer): 
def __init__(self, sigma_ind=None, sigma_dep=None, 
      noise_level=1.0, seed=None, **kwargs): 

    self.sigma_ind = sigma_ind 
    self.sigma_dep = sigma_dep 
    self.noise_level = noise_level 
    self.supports_masking = True 
    self.seed = seed 

    self._lut_ind = scipy.linalg.cholesky(self.sigma_ind) 
    self._lut_dep = scipy.linalg.cholesky(self.sigma_dep) 
    super(MVGaussianNoise, self).__init__(**kwargs) 

def call(self, inputs, training=None): 
    def noised(): 
     z_ind = K.random_normal(
      shape=K.shape(inputs), 
      mean=0.0, 
      seed=self.seed, 
      stddev=1.0) 
     noised_ind = self.noise_level * K.dot(z_ind, self._lut_ind) 
     return inputs + noised_ind 

    return K.in_train_phase(noised, inputs, training=training) 

def get_config(self): 
    config = {'sigma_ind': self.sigma_ind, 
       'sigma_dep': self.sigma_dep, 
       'noise_level': self.noise_level, 
       'seed': self.seed} 
    base_config = super(MVGaussianNoise, self).get_config() 
    return dict(list(base_config.items()) + list(config.items())) 

'sigma_ind' と 'sigma_depは' タイプ 'numpy.ndarray(フロート)' である共分散を規定します。

. 
    . 
    . 
    File "/home/aidin/miniconda3/envs/keras-theano/lib/python2.7/site-packages/keras/utils/generic_utils.py", line 141, in deserialize_keras_object 
    return cls.from_config(config['config']) 

    File "/home/aidin/miniconda3/envs/keras-theano/lib/python2.7/site-packages/keras/engine/topology.py", line 1252, in from_config 
    return cls(**config) 

    File "hsipydeep/keraskit/noise.py", line 99, in __init__ 
    self._lut_ind = scipy.linalg.cholesky(self.sigma_ind) 

    File "/home/aidin/miniconda3/envs/keras-theano/lib/python2.7/site-packages/scipy/linalg/decomp_cholesky.py", line 91, in cholesky 
    check_finite=check_finite) 

    File "/home/aidin/miniconda3/envs/keras-theano/lib/python2.7/site-packages/scipy/linalg/decomp_cholesky.py", line 37, in _cholesky 
    c, info = potrf(a1, lower=lower, overwrite_a=overwrite_a, clean=clean) 

TypeError: float() argument must be a string or a number 

その上の任意の思考:

with ks.utils.CustomObjectScope({'MVGaussianNoise': MVGaussianNoise}): 
    best_model = ks.models.load_model('best_model' + '.h5') 

は、エラーメッセージになります:

モデルのロード?

答えて

1

それはあなたの__init__機能で、あなたのsigma_indパラメータはscipy.linalg.choleskyが値を期待するので、あなたが初期化時にsigma_indに合格しない場合に問題になるNoneのデフォルト値を持っていることのように見えます。

+0

これは問題ではないと思います。モデルを読み込んだときに、デフォルト値ではなくconfig ['config']から取得しています。 – aysa

0

データ型を 'python.array'に変更して解決しました。Kerasがモデル読み込みでnumpy.array入力argsを処理できないようです。

関連する問題