더북(TheBook)

하지만 두 데이터셋 사이에는 눈에 띄는 차이점도 몇 가지 있습니다. 첫째, 음성 명령 데이터셋에 있는 오디오 녹음에는 일부 잡음이 있습니다. 그림 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;
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.