Проблема декодирования при использовании Hyperas для поиска параметров модели Keras, возможно, из-за функции `Trial` в`hyperopt`
Я использую 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 ответа
Проблема была решена. При вызове optim.minimize
функции, мы должны сначала определить две функции, названные как data
а также model
а не то, что я назвал create_model
или что-нибудь еще. Это очень строгое ограничение.
Я могу воссоздать вашу ошибку, преобразовав строку в юникоде (по умолчанию PY3) в строку байтов, а затем попытавшись decode
Это:
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
подать один.