[Код - отстой, коты] Нейронная сеть распознает мяуканье

искусственный интеллект
[Код - отстой, коты] Нейронная сеть распознает мяуканье

Соси кошек вместе с кодом! Эта статья участвует【Эссе "Мяу Звезды"】.

Набор данных языка мяу

Ссылка на сайт:набор данных бумага

Исследователи из факультета вычислительной техники Миланского университета собрали 440 голосов 21 кошки двух пород (мейн-кун и европейская короткошерстная).

Эти кошки находятся в 3 состояниях:

  • Расчесывание: хозяин расчесывает кошку дома
  • Изоляция в незнакомой среде: Кошки переносятся в незнакомую среду их владельцами. (Расстояния соблюдаются как можно короче, и используется регулярная транспортировка, чтобы избежать дискомфорта для животных. Путешествие длится менее 30 минут, и кошкам разрешается не более 30 минут с их владельцами для восстановления после транспортировки, а затем изолируется. в незнакомой обстановке, где они одни до 5 минут)
  • Ожидание еды: хозяин начинает подготовку к кормлению в привычной для кошки обстановке.

Кроме того, информация, предоставляемая каждым звуковым файлом, также включает:

  • Уникальный ID кота;
  • Разнообразие
  • Пол (женский, интактный; женский, стерилизованный; мужской, интактный; мужской, стерилизованный)
  • Уникальный ID владельца кота
  • сеанс записи
  • счет вокализации

Нейросетевое распознавание языка мяу

Затем, используя набор данных Meow Language, используйтеMegEngineПостройте нейронную сеть для классификации и судите о состоянии кота по мяуканию.

обработка данных

Поместите загруженный набор языковых данных Meow в путь./data/середина. Сначала преобразуйте звуковой файл в собственные значения.

Длина звукового файла составляет 1~2 секунды, а после преобразования можно получить не менее 8600 собственных значений. Прищипните голову и уберите хвост, а средние 8000 значений возьмите за признаки.

Возьмите 80% файлов в качестве обучающего набора, а остальные — в качестве тестового набора.

код показывает, как показано ниже:

import os
import wave
import numpy as np
import random

def file_name(file_dir):
    """
    获取文件夹中所有文件文件名
    """
    for _, _, files in os.walk(file_dir):
        return files

def Read_WAV(wav_path):
    """
    将声音文件转换为特征值
    """
    wav_file = wave.open(wav_path,'r')
    numframes = wav_file.getnframes()           # 采样点数
    Wav_Data = wav_file.readframes(numframes)
    Wav_Data = np.fromstring(Wav_Data,dtype=np.int16)
    return Wav_Data

# 读取数据
data = []
data_path = "./dataset/"
for f in file_name(data_path):
    s = Read_WAV(data_path + f)
    s = (s - min(s)) / (max(s) - min(s))    # 归一化处理
    
    # 制作标签
    if f[0] == 'B':
        label = 0
    elif f[0] == 'F':
        label = 1
    elif f[0] == 'I':
        label = 2
    else:
        print("error " + f)
        continue
    
    # 取中间 8000 个值作为特征
    begin = (s.shape[0] - 8000) // 2
    s = s[begin : begin + 8000]
    
    data.append([s, label])

random.shuffle(data)      # 打乱数据

# 划分训练集和测试集
train_data = data[:352]
test_data = data[:352:]

Создайте средство чтения данных

Вам нужно настроить класс DataSet и переопределить__len__и__getitem__метод

from megengine.data import DataLoader
from megengine.data.dataset import Dataset
from megengine.data.sampler import RandomSampler, SequentialSampler

# 自定义DataSet
class myDataSet(Dataset):
    def __init__(self, data):
        self.data = data 
    
    def __len__(self):
        return len(self.data)
    
    def __getitem__(self, index):
        return self.data[index][0], self.data[index][1]

trainData = myDataSet(train_data)
testData = myDataSet(test_data)

batch_size=64

train_sampler = RandomSampler(trainData, batch_size=batch_size)
test_sampler = SequentialSampler(testData, batch_size=batch_size)

train_dataloader = DataLoader(trainData, train_sampler)
test_dataloader  = DataLoader(testData, test_sampler)

Создавайте нейронные сети

Создайте простую полносвязную нейронную сеть.

import megengine.module as M
import megengine.functional as F

class myNet(M.Module):
    def __init__(self):
        super().__init__()
        self.fc1 = M.Linear(8000, 2048)
        self.fc2 = M.Linear(2048, 512)
        self.fc3 = M.Linear(512, 64)
        self.classifier = M.Linear(64, 3)

        self.relu = M.ReLU()

    def forward(self, x):
        x = F.flatten(x, 1)
        x = self.relu(self.fc1(x))
        x = self.relu(self.fc2(x))
        x = self.relu(self.fc3(x))
        x = self.classifier(x)
        return x

# 实例化网络
net = myNet()

тренироваться

Начать обучение сети~

from megengine.optimizer import SGD
from megengine.autodiff import GradManager
import numpy as np
import megengine as mge

optimizer = SGD(net.parameters(), lr=0.01, momentum=0.9, weight_decay=5e-4)
gm = GradManager().attach(net.parameters())

losses = []

net.train()

total_epochs = 300
for epoch in range(total_epochs):
    total_loss = 0
    for step, (batch_data, batch_label) in enumerate(train_dataloader):
        batch_data = mge.tensor(batch_data)
        batch_label = mge.tensor(batch_label).astype(np.int32)

        with gm:
            pred = net(batch_data)
            loss = F.loss.cross_entropy(pred, batch_label)
            gm.backward(loss)
            optimizer.step().clear_grad()

        total_loss += loss.numpy().item()

    if epoch % 50 == 0:
        print("epoch: {}, loss {}".format(epoch, total_loss/len(trainData)))
    losses.append(total_loss/len(train_data))

построить кривую потерь

Видно, что после обучения на 300 эпох потери стабилизировались

Но потери существенно не уменьшились...

import matplotlib.pyplot as plt

x = [i for i in range(len(losses))]
plt.plot(x, losses)
plt.show()

loss曲线

Модель оценки

Точность финального распознавания модели составляет всего 51,42% QAQ.

По сравнению с точностью 95% других методов в статье, это немного далеко позади.

net.eval()
correct = 0

for step, (batch_data, batch_label) in enumerate(train_dataloader):
    batch_data = mge.tensor(batch_data)
    pred = net(batch_data)

    pred = pred.numpy()
    correct += np.sum(np.argmax(pred, axis= 1) == batch_label)

print(correct / len(test_data) * 100)

Суммировать

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

В первый раз, когда я использовал его, я попробовал только простую полносвязную нейронную сеть, и точность была не очень хорошей, после чего я мог попробовать другие модели для повышения точности.

结束表情