Нажатие кнопки flask запускает код python и распаковывает файлы с помощью токенизатора - PullRequest
0 голосов
/ 10 июля 2020

Я создаю веб-сайт с 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. Я нашел решение от здесь

1 Ответ

0 голосов
/ 10 июля 2020

Это может быть проблема в том, как вы используете Flask. Вы запускаете его в виртуальном окружении? Если да, убедитесь, что установлены правильные пакеты pip. Я хотел бы убедиться, что среда, в которой я запускаю Flask, идентична той, в которой вы запускаете ее самостоятельно, и она работает.

...