하지만 두 데이터셋 사이에는 눈에 띄는 차이점도 몇 가지 있습니다. 첫째, 음성 명령 데이터셋에 있는 오디오 녹음에는 일부 잡음이 있습니다. 그림 4-12에 있는 스펙트로그램 예시에서는 음성에 속하지 않은 검은 픽셀을 볼 수 있습니다. 둘째, 음성 명령 데이터셋에 있는 모든 스펙트로그램의 크기는 43 × 232입니다. MNIST 이미지 크기 28 × 28보다 매우 큽니다. 스펙트로그램의 크기에서 시간과 주파수 차원이 비대칭입니다.
이런 차이점들을 반영한 합성곱 신경망의 구조는 다음과 같습니다.
코드 4-8 음성 명령의 스펙트로그램을 분류하는 합성곱 신경망
function createModel(inputShape: tf.Shape, numClasses: number) {
const model = tf.sequential();
model.add(tf.layers.conv2d({ ------ conv2d + maxPooling2d 구조를 반복합니다.
filters: 8,
kernelSize: [2, 8],
activation: 'relu',
inputShape: inputShape
}));
model.add(tf.layers.maxPooling2d({poolSize: [2, 2], strides: [2, 2]}));
model.add( tf.layers.conv2d({
filters: 32,
kernelSize: [2, 4],
activation: 'relu'
}));
model.add(tf.layers.maxPooling2d({poolSize: [2, 2], strides: [2, 2]}));
model.add(
tf.layers.conv2d({
filters: 32,
kernelSize: [2, 4],
activation: 'relu'
}));
model.add(tf.layers.maxPooling2d({poolSize: [2, 2], strides: [2, 2]}));
model.add(
tf.layers.conv2d({
filters: 32,
kernelSize: [2, 4],
activation: 'relu'
}));
model.add(tf.layers.maxPooling2d({poolSize: [2, 2], strides: [1, 2]}));
model.add(tf.layers.flatten()); ------ 다층 퍼셉트론 구조를 추가합니다.
model.add(tf.layers.dropout({rate: 0.25})); ------ 과대적합을 줄이기 위해 드롭아웃을 사용합니다.
model.add(tf.layers.dense({units: 2000, activation: 'relu'}));
model.add(tf.layers.dropout({rate: 0.5}));
model.add(tf.layers.dense({units: numClasses, activation: 'softmax'}));
model.compile({ ; ------ 다중 분류를 위해 손실과 측정 지표를 설정합니다.
loss: 'categoricalCrossentropy',
optimizer: tf.train.sgd(0.01),
metrics: ['accuracy']
});
model.summary();
return model;
}