Соси кошек вместе с кодом! Эта статья участвует【Эссе "Мяу Звезды"】.
Набор данных языка мяу
Ссылка на сайт:набор данных бумага
Исследователи из факультета вычислительной техники Миланского университета собрали 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()
Модель оценки
Точность финального распознавания модели составляет всего 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 для создания сети и ее обучения.Я чувствую, что скорость обучения очень высока, а процесс написания кода очень похож на другие фреймворки, поэтому начать работу очень легко.
В первый раз, когда я использовал его, я попробовал только простую полносвязную нейронную сеть, и точность была не очень хорошей, после чего я мог попробовать другие модели для повышения точности.