2020讯飞开发者大赛——婴儿啼哭声识别挑战赛[Baseline]

2020讯飞开发者大赛——婴儿啼哭声识别挑战赛[Baseline]_第1张图片

Baseline:

1. 加载并保存数据:

import os
import wave
import numpy as np
from tqdm import tqdm
import pickle as pkl


LABELS = ['awake', 'diaper', 'hug', 'hungry', 'sleepy', 'uncomfortable']
N_CLASS = len(LABELS)
DATA_DIR = './train'

file_glob = []


def get_wave_norm(file):
    with wave.open(file, 'rb') as f:
        params = f.getparams()
        nchannels, sampwidth, framerate, nframes = params[:4]
        data = f.readframes(nframes)
    data = np.fromstring(data, dtype=np.int16)
    return data, framerate


count = 0

for i, cls_fold in tqdm(enumerate(LABELS)):

    cls_base = os.path.join(DATA_DIR, cls_fold)
    files = os.listdir(cls_base)
    print('{} train num:'.format(cls_fold), len(files))
    for pt in files:
        file_pt = os.path.join(cls_base, pt)
        count += 1
        file_glob.append((file_pt, LABELS.index(cls_fold)))

print('done.')

seg = 32000
count = 0

data = []

for file, lbl in tqdm(file_glob):
    raw, sr = get_wave_norm(file)
    length = raw.shape[0]
    for i in range(length+1):
        start = i * seg
        end = start + seg
        if end - start == seg:
            x = raw[start:end]
            l = x.shape[0]
        else:
            break
        l = np.zeros(N_CLASS)
        l[lbl] = 1
        data.append((x, l))
        count += 1

with open('./data.pkl', 'wb') as f:
    pkl.dump(data, f)

2. 设置训练数据:

from keras.models import Model
from keras.layers import Input, Dense, Dropout, BatchNormalization, Conv2D, MaxPooling2D, AveragePooling2D, concatenate, \
    Activation, ZeroPadding2D, LSTM
from keras.layers import add, Flatten, Reshape
from keras.utils import plot_model
from keras.metrics import top_k_categorical_accuracy
from keras.preprocessing.image import ImageDataGenerator
from keras.models import load_model
import os
import wave
import numpy as np
import pickle as pkl

train_x = []
train_y = []

LABELS = ['awake', 'diaper', 'hug', 'hungry', 'sleepy', 'uncomfortable']
N_CLASS = len(LABELS)

with open('./data.pkl', 'rb') as f:
    raw_data = pkl.load(f)

for x, y in raw_data:
  train_x.append(x)
  train_y.append(y)

np.random.seed(5)
np.random.shuffle(train_x)

np.random.seed(5)
np.random.shuffle(train_y)

train_x = np.array(train_x)
train_y = np.array(train_y)

3. 搭建LSTM模型:

import keras.backend as K
from keras import regularizers
from keras import layers
from keras.models import Sequential
import keras
import os
import wave
import numpy as np
import pickle as pkl

LABELS = ['awake', 'diaper', 'hug', 'hungry', 'sleepy', 'uncomfortable']
N_CLASS = len(LABELS)

with open('./data.pkl', 'rb') as f:
    raw_data = pkl.load(f)

train_x = np.expand_dims(np.array(raw_data['x']), axis=-1)
train_y = np.array(raw_data['y'])

np.random.seed(5)
np.random.shuffle(train_x)
np.random.seed(5)
np.random.shuffle(train_y)

model = Sequential()
model.add(layers.LSTM(128, input_shape=(seg, 1), dropout=0.5, return_sequences=True))
model.add(layers.LSTM(128, dropout=0.5, return_sequences=True))
model.add(layers.LSTM(64))
model.add(layers.Dense(N_CLASS, activation="softmax"))
model.summary()

adam = keras.optimizers.adam(2e-4)

model.compile(loss='categorical_crossentropy',
              optimizer=adam, metrics=['accuracy'])

# Train model on dataset
batch_size = 64

model.fit(x=train_x, y=train_y, batch_size=batch_size,
          epochs=200, validation_split=0.1, shuffle=True)

model.save('my_model.h5')

最终结果:

在这里插入图片描述

你可能感兴趣的:(TensorFlow)