더북(TheBook)

2.4.2 모델에서 가중치 추출하기

학습된 모델의 모듈 구조 덕분에 관련된 가중치를 쉽게 추출할 수 있습니다. 직접적으로 참조할 수 있지만 원본 값을 가져오기 위한 몇 가지 API 단계가 있습니다. 이 값은 GPU에 있을 수 있고 장치 간 통신은 비싸기 때문에 이런 값의 요청은 비동기적입니다. 코드 2-17에서 굵은 글씨체로 나타낸 부분은 코드 2-14에서 에포크가 끝날 때마다 학습된 가중치를 출력하기 위해 model.fit() 콜백을 추가했습니다. 이 API를 단계별로 살펴보겠습니다.

주어진 모델에서 올바른 층에 접근해야 합니다. 이 모델은 층이 하나이기 때문에 어렵지 않습니다. model.layers[0]으로 첫 번째 층에 접근할 수 있습니다. 이제 층 객체를 얻었으므로 가중치 배열을 반환하는 getWeights() 메서드로 내부 가중치에 접근할 수 있습니다. 밀집 층의 경우 항상 커널과 편향이라는 두 개의 가중치를 순서대로 담고 있습니다. 따라서 다음과 같이 원하는 텐서를 참조할 수 있습니다.

> model.layers[0].getWeights()[0]

텐서를 얻었으므로 data() 메서드를 호출하여 내용을 가져올 수 있습니다. GPU ↔ CPU 통신의 비동기적인 성질 때문에 data()도 비동기적이므로 실제 값이 아니라 텐서 값의 프로미스를 반환합니다. 코드 2-17에서 이 프로미스의 then() 메서드에 전달한 콜백이 텐서 값을 kernelAsArr 변수에 연결합니다. console.log() 명령의 주석을 제거하면 다음과 같이 커널 값이 에포크마다 한 번씩 콘솔에 출력됩니다.

Float32Array(12) [-0.44015952944755554, 0.8829045295715332,
     0.11802537739276886, 0.9555914402008057, -1.6466193199157715,
     3.386948347091675, -0.36070501804351807, -3.0381457805633545,
     1.4347705841064453, -1.3844640254974365, -1.4223048686981201,
     -3.795234441757202]
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.