Как в Python прописать условие if, чтобы получить ожидаемый ответ?
Прохожу циклом по папкам с файлами, где записаны голоса разных людей: в каждой папке spk директории speakers - голоса одного человека в отдельных файлах.
Есть две переменных-счетчика: общее количество проходов num_total и количество положительных ответов num_true (при сравнении дали тензор tensor([True])).
Если я не в порядке цикла, а вручную подставляю в метод библиотеки speechbrain для сравнения 2 голоса одного человека, система их сравнивает корректно и дает положительный тензор true. Однако распечатав переменные-счетчики из цикла, вижу: num_true равен нулю. Что не так?
Код:
# подход распознавания на основе ECAPA: сравниваем голоса
!pip install speechbrain
from speechbrain.pretrained import SpeakerRecognition
import os
from itertools import combinations
num_true=0
num_total=0
for root, dirs, files in os.walk('/content/drive/MyDrive/speakers'):
if not files:
continue
res = list(combinations(files, 2)) # получаем списки кортежей: [(файл 1, файл 2), (файл 1, файл 3)...(файл 3, файл 4)]
# print(res)
for tuples in res: # идем по каждому кортежу в списке
verification = SpeakerRecognition.from_hparams(source="speechbrain/spkrec-ecapa-voxceleb", savedir="pretrained_models/spkrec-ecapa-voxceleb")
score, prediction = verification.verify_files(os.path.join(root, tuples[0]), os.path.join(root, tuples[1]))
num_total+=1
if prediction == 'tensor([True])':
num_true+=1
# считаем метрику accuracy:
# if num_total !=0:
# accuracy = num_true/num_total
# print(accuracy)
# else:
# print('На ноль делить нельзя')
# распечатываем переменные-счетчики:
print(num_true)
print(num_total)
print(prediction, type(prediction) ) # для примера выполнил отдельно для одного сравнения файлов
# 0
# 44
# tensor([True]) <class 'torch.Tensor'>
Ответы (2 шт):
В вашем случае сам объект prediction это метод, его значение не есть строкой с которой вы его сравниваете. Если хотите сравнивать его со своей строкой вам нужно написать так:
if str(prediction) == 'Tensor([True])':
Или так:
if prediction.__str__() == 'Tensor([True])':
Таким образом вы просите свой объект prediction вернуть его строковое значение и тогда уже сравниваете две строки.
Решил задачу еще одним способом: благодаря общему разуму, реализовал так:
if prediction == torch.tensor([True]):
...
Все прочее, как указал в коде ранее