Проблема декодирования при использовании Hyperas для поиска параметров модели Keras, возможно, из-за функции `Trial` в` hyperopt` - PullRequest
1 голос
/ 19 марта 2019

Я использую модуль hyperas для настройки моей модели Keras и возврата ошибки:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe8 in position 4785: ordinal not in range(128)

Произошла ошибка в месте вызова, синтаксис trials:

if __name__ == '__main__':
    best_run, best_model = optim.minimize(model=create_model,
                                      data=data,
                                      algo=tpe.suggest,
                                      max_evals=20,
                                      trials=Trials())

и я думаю, что причина проблемы заключается в моем загруженном файле .npy, который представляет собой данные формата кодирования ascii.Итак, как я могу изменить формат ascii на формат utf-8?

Я видел какое-то подобное решение, добавив encoding='latin1', но оно не работает.

label =np.load(os.getcwd()+'/Simu_Sample_label_1000.npy',encoding="latin1")
sample=np.load(os.getcwd()+'/Training_Sample_1000.npy',encoding="latin1")

Добавьте всю мою трассировку здесь:

    In [3]: %run 1dCNN.py
---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
~/subg_ps/cnn_train/1dCNN.py in <module>()
    127                                           algo=tpe.suggest,
    128                                           max_evals=20,
--> 129                                           trials=Trials())
    130     trX, trY, teX, teY = data()
    131     print("Evalutation of best performing model:")

~/anaconda3/lib/python3.6/site-packages/hyperas/optim.py in minimize(model, data, algo, max_evals, trials, functions, rseed, notebook_name, verbose, eval_space, return_space, keep_temp)
     67                                      notebook_name=notebook_name,
     68                                      verbose=verbose,
---> 69                                      keep_temp=keep_temp)
     70
     71     best_model = None

~/anaconda3/lib/python3.6/site-packages/hyperas/optim.py in base_minimizer(model, data, functions, algo, max_evals, trials, rseed, full_model_string, notebook_name, verbose, stack, keep_temp)
     96         model_str = full_model_string
     97     else:
---> 98         model_str = get_hyperopt_model_string(model, data, functions, notebook_name, verbose, stack)
     99     temp_file = './temp_model.py'
    100     write_temp_files(model_str, temp_file)

~/anaconda3/lib/python3.6/site-packages/hyperas/optim.py in get_hyperopt_model_string(model, data, functions, notebook_name, verbose, stack)
    184         calling_script_file = os.path.abspath(inspect.stack()[stack][1])
    185         with open(calling_script_file, 'r') as f:
--> 186             source = f.read()
    187
    188     cleaned_source = remove_all_comments(source)

~/anaconda3/lib/python3.6/encodings/ascii.py in decode(self, input, final)
     24 class IncrementalDecoder(codecs.IncrementalDecoder):
     25     def decode(self, input, final=False):
---> 26         return codecs.ascii_decode(input, self.errors)[0]
     27
     28 class StreamWriter(Codec,codecs.StreamWriter):

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe8 in position 4785: ordinal not in range(128)

Я думаю, что мне лучше поместить сюда всю трассировку и весь код следующим образом: https://github.com/MinghaoDu1994/MyPythonFunctions/blob/master/1Dcnn

Я думаю, что проблема связана сна функцию Trials в hyperopt, но я не нахожу связанных с этим вопросов, как мой.

Ответы [ 2 ]

1 голос
/ 21 марта 2019

Проблема была решена.При вызове функции optim.minimize мы должны сначала определить две функции, названные data и model, а не то, что я назвал create_model или что-то еще.Это очень строгое ограничение.

0 голосов
/ 20 марта 2019

Я могу воссоздать вашу ошибку, преобразовав строку Unicode (по умолчанию PY3) в строку байтов, а затем попытавшись decode it:

In [347]: astr = 'abc'+chr(0xe8)+'xyz'                                                    
In [348]: astr                                                                            
Out[348]: 'abcèxyz'
In [349]: astr.encode('latin1')                                                           
Out[349]: b'abc\xe8xyz'
In [350]: astr.encode('latin1').decode('ascii')                                           
---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
<ipython-input-350-1825a76f5d5b> in <module>
----> 1 astr.encode('latin1').decode('ascii')

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe8 in position 3: ordinal not in range(128)

hyperas чтение какого-либо файла сценария в get_hyperopt_model_string(). Я не могу сказать, какая переменная контролирует это чтение, может быть, это notebook. Я не думаю, что массивы, которые вы загрузили из npy файлов, как-то связаны с этой проблемой. Он декодирует большую строку (позиция 4785), а не какой-либо элемент массива.

Короче говоря, это проблема модели hyperas, а не npy файла.

...