Я создаю веб-сайт с flask, и когда вы нажимаете кнопку, я пытаюсь запустить свой код машинного обучения, который находится в другом файле .py. Но когда я нажимаю на эту кнопку, я получаю эту ошибку AttributeError: Невозможно получить атрибут Tokenizer на Мне сказали, что это потому, что мой класс Tokenizer не может распаковать файл. Но я не уверен, почему это невозможно, потому что, когда я запускаю свой код машинного обучения, он работает нормально. Но когда я пытаюсь нажать на кнопку через flask, я получаю эту ошибку. Приветствуется любая помощь
Функция, которую я пытаюсь запустить, называется стартером («нет») из файла с именем Music_Generator_2.py
app.py
@app.route('/generated')
def generated():
print("start")
Music_Generator_2.start("no") #from Music_Generator_2
print("sucess")
return render_template('index.html', tested_generator="generated")
Ошибка возникает во второй строке этого кода
Music_Generator_2.py
model = tf.keras.models.load_model("model_25epochs.h5", custom_objects=SeqSelfAttention.get_custom_objects())
tokenizer = pickle.load(open("tokenizer25.p", "rb"))
#generate from random
max_generate = 200
unique_notes = tokenizer.unique_word
seq_len = 200
generate = generate_from_random(unique_notes, seq_len)
generate = generate_notes(generate, model, unique_notes, max_generate, seq_len)
write_midi_file(generate, tokenizer, "rand test.mid", start=seq_len - 1, fs=7, max_generate=max_generate)
#generate from a note
max_generate = 300
unique_notes = tokenizer.unique_word # same as above
seq_len = 300
generate = generate_from_one_note(tokenizer, "72")
generate = generate_notes(generate, model, unique_notes, max_generate, seq_len)
Это код, который я пытаюсь использовать в своей программе машинного обучения
Music_Generator_2.py Класс токенизатора
class Tokenizer:
def __init__(self):
self.notes_to_index = {}
self.index_to_notes = {}
self.num_word = 0
self.unique_word = 0
self.note_freq = {}
'''transform a list of notes from strings to indexes
list_array is a list of notes in string format'''
def transform(self, list_array):
transformed = []
for i in list_array:
transformed.append([self.notes_to_index[note] for note in i])
return np.array(transformed, dtype = np.int32)
'''partial fir on the dictionary of the tokenizer
notes is a list of notes'''
def partial_fit(self, notes):
for note in notes:
note_str = ",".join(str(n) for n in note)
if note_str in self.note_freq:
self.note_freq[note_str] += 1
self.num_word += 1
else:
self.note_freq[note_str] = 1
self.unique_word += 1
self.num_word += 1
self.notes_to_index[note_str] =self.unique_word
self.index_to_notes[self.unique_word] = note_str
'''add a new note to the dictionary
note is the new note to be added as a string'''
def add_new_note(self, note):
assert note not in self.notes_to_index
self.unique_word += 1
self.notes_to_index[note] = self.unique_word
self.index_to_notes[self.unique_word] = note
Решено: я переместил свой класс токенизатора в его собственный файл .py, а затем просто импортировал этот файл для app.py и Mustic_Generator_2.py. Я нашел решение от здесь