페이지

2019년 11월 17일 일요일

Large Enterprise Application Experience

1. My Early Enterprise Experience
- Team built one big java WAR file
- Ops team deployed to the dev WebLogic Server
- Local development on WebLogic Servers run on own machines
- Environment set up to use the development database via data sources.


2. Ecommerce Catalog
- View the list of current products
- Understand their specifications
- Save into a with lisht that enables team collaboration
- Get a quote for the with list or go through the purchase process.

Three Modules
1) User Module
Responsible for user management, login, and profile management

2) Catalog Module
List of products in the company catalog

3) Wish List Module
API that the customers will user to create and view their wish lists

Our Monolith
- A single WAR file, and has one or more JAR files that provide all of the core functioinality
- Will likely have a common web tier to handle web requests and responses

Breaking This Up
Break the single application into three microservices.
- Auth
- Wish list functionality
- The catalog portion


Benefits of this Structure
- Each microservice has its own Rest APIs that can be userd by the other services

- Reorganize codebase in a more logical way

- Development team can split into smaller feature teams to work on th individual microservices.

- Code and API are more visible to business team

- Individual teams can develop, build, and test their applications locally-team is more productive up front

- Enables containuous integration pipeline

Containers allow you to user Kubernetes.

Transitioning to Microservices
- Addressed some of the microservice building block concrns
- Applied some of the basic principles from the twelve-factor pattern

Our microservices are running in Docker containers, so  let's Kube this up.
















2019년 11월 16일 토요일

Microservice Patterns in Kubernnetes

1. Goal
1.1. Build reference architecture for microservices for Kubernetes

2. Architecture Groupings

2.1. Basic building block architectures
2.1.1. Deployment Patterns
2.1.2. Runtime patterns


3. Building Blocks

3.1. Covers the initial concerns
3.1.1. Codebase
3.1.1.1. Code stored in source control
- Example: Git, Perforce
3.1.1.2. Container images stored in an image repository
- Example: Docker Hub, Artifactory

3.1.1.3. Codebase Workflow
3.1.1.3.1. Push code to your source control.
3.1.1.3.2. Automated build is kicked off to build and run tests against code.
3.1.1.3.3. Bild container image; push to image repository.

3.1.1.4. Image Repository
3.1.1.4.1. Stores your code in an image
3.1.1.4.2. Need to decide early on
3.1.1.4.3. Follow your company guidelines

3.1.2. Dependencies

3.1.2.1. Applications modeled in Kubernetes as Deployments and pods
3.1.2.2. Single pod can have many containers inside
3.1.2.3. Commonly seen in Kubernetes: sidecar pattern

3.1.3. Dev/staging/production parity

3.1.3.1. Dev versus Prod in Kubernetes
3.1.3.1.1. Common Kubernetes deployment patterns
- Small footprint: different namespaces with different credentials for dev, staging, and production

- Large footprint: unique Kubernetes installation for dev, staging, and production


3.1.4. Admin processes.

3.1.4.1. Admin process containers tagged in a similar way to the running application
3.1.4.2. Containers run as Kubernetes jobs/chron job
3.1.4.3. Also run as a separate deployment


4. Deployment Patterns


4.1 Patterns around aplication deployment
4.1.1. Application configurations
4.1.1.1. Applications always have associated configuration to make the application work as expected

4.1.1.2. Application Configuration in Kubernetes
4.1.1.2.1. Two ways to store configs
- configMaps: for generic information(example: metadata, version)
- Secrets: for sensitive data(example:passwords)

4.1.1.2.2. Loaded into the pod via
- Environment variables
- Files


4.1.1.2.3. A Word on Secrets
- Secrets are a good start, but depending on the use case, might need something more like ashiCoprp Vault

4.1.2. Build, release, run
- Tag containers at build time with explicit version
- Don't use latest ta for production containers

4.1.2.1. Running in Kubernetes
- High-level constructs to run containers
- Deployments, DaemonSets, ReplicaSets
- Package management provided by Helm
- Adds revision control


4.1.3. Processes
4.1.3.1. Processes and Port Bindings
4.1.3.1.1. Processes
- Keep application stateless
- Goal: Alllow request to go to any container or server by default

4.1.3.1.2. Statelessness in Kubernetes
- Translated to Deployments and pods
- Deployments comprised of ReplicaSets, which are a collection of one or more pods

4.1.3.1.3. Word on StatefulSets
- Typically used to create persistent storage systems like a MySQK shard

4.1.3.2. Port Bindings
- Containers are implemented in pods
- Communicate to each other via well-defined ports



5. Runtime Patterns
Associating Resources in Kubernetes
- Everything is treated as a service, and configurations are stored in a ConfigMap or Secret

Scenario: Replace a Link to a Database

1) Create new database; ensure it's online and ready to accept connections.
2) Update configuration stored in the ConfigMaps or Secrets.
3) Kill the pods that were communicating with the old database.

When Kubernetes starts up the new pods, the new pods automatically pick up the new configuration, and you'll be using the new service.

If a pod is taking too much load or is receiving a lot of requests, it's easy to scale the number of pods in Kubernetes by adding more to the replica set.

Scaling Kubernetes to handle more traffic is one of the strengths of the platform.



5.1. Patterns for live running systems
5.1.1. Backing services
5.1.2. Features around concurreny
5.1.3. Disposability
The abliity to maximize robustness with fast startup and graceful shutdown

Containers
- Start up fast and run efficiently
- Have all required tooling built inside of the container image

Containers to Pods to Replicas
- Kubernetes manages your containers in pods, which are managed with ReplicaSets
- If one of the pods goes offline, the ReplicaSet will automatically start up a new pod to take its place

Advantages to Users
- From a user perspective, the application will still function, and the user won't see any downtime

5.1.4. Log management

5.1.4.1. Logging
- Treat logs as streams: execution environment handles the logs
- Common to user a log router (Beats/Fluentd) to save the logs to a service(Elasticsearch/ Splunk)
- Kubernetes makes this process easy


6. Some Assembly Required

6.1 Basic Knowledge of Kubernetes required
6.2. Watch the Learning Kubernetes course in the library if needed











2019년 9월 8일 일요일

Recurrent Neural Networks

-> google translator relies heavily on recurrent neural networks
-> we can use recurrent neural networks to make time series analysis(주식 분석)

Turing-Test: a computer passes the Turing-test if a human is unable to distinguish the computer from a human in a blind test

~ recurrent neural networks are able to pass this test: a well-trained recurrent network is able to,, understand" English for example

LEARN LANGUAGE MODELS!!

We would like to make sure that the network is able to learn connections in the data even when they are far away from each other

,, I am from Hungary. Lorem ipsum dolor sit amet, consetetur adipiscing elit, sed do eiusmod tempor incididnt

Recurrent neural networks are able to deal with relationships for away from eah other

~it is able to guess the last word: humgarian


Combining convolutional neural networks with recurrent neural networks is quite powerful

~ we can generate image descriptions with this hibrid approach


With Multilayer Neural Networks ( or deep networks) we make predictions independent of each other
p(t) is not correlated with p(t-1) or p(t-2)...

-> training examples are independent of each other
               Tigers, elephants, cats ..  nothing to do with each other

THESE PREDICTIONS ARE INDEPENDENT !!!!

With Recurrent Neural Networks we can predict the next word in a given sentence:
     it is important in natural language processing ~or we want to predict the stock prices tomorrow

p(t) depends on p(t-1), p(t-2)....

TRAINING EXAMPLES ARE CORRELATED!!!


x: input
h: activation after applying the activation function on the output

How to train a recurrent neural network?
~we can unroll it in time in order to end up with a standard feedforward neural network:
we know how to deal with it

How to train a recurrent neural network?

~ we cna unroll it in time in order to end up with a standard feedforward neural network: we know how to deal with it

As you can see, serveral parameters are shared accross every single layer!!!

for a feed-forward network these weights are different

Vanishing/exploding gradients problem
When dealing with backpropagation we have to calculate the gradients

~ we just have to apply the chain rule several times
We multiply the weights several times: if you multiply x < 1 several times the result will get smaller and smaller

VANISHING GRADIENT PROBLEM

Backpropagation Through Time(BPTT): the same as backpropagation but these gradients/error signals will also flow backward from future time-steps to current time-steps

We multiply the weights several times: if you multiply x > 1 sereral times the result will get bigger and bigger

It is a problem when dealing with Recurrent Neural Networks usually
~because these networks are usaually deep!!!

-> why vanishing gradient is problem?
Because gradients become too small: difficult to model long-range dependencies

-> for recurrent neural networks, local optima are a much more significant problem than with feed-forward neural networks
~ error function surface is quite complex

These complex surfaces have several local optima and we want to find the global one: we can use meta-heuristic approaches as well

EXPLODING GRADIENTS PROBLEM
-> truncated BPTT algrithm: we use simple backpropagation but
We only do bckpropagation through k time-steps

-> adjust the learning rate with RMSProp(adaptive algorithm)
We normalize the gradients: using moving average over the root mean squared gradients

VANISHING GRADIENTS PROBLEM
-> initialize the weights properly(Xavier-initialization)
-> proper activation functions such as ReLU function
-> using other architectures:LSTM or GRUs






















2019년 7월 16일 화요일

(1) 위키피디아 한국어 덤프 파일 다운로드

https://dumps.wikimedia.org/kowiki/latest/

(2) 위키피디아 익스트랙터 다운로드

해당 파일을 모두 다운로드 받았다면 위키피디아 덤프 파일을 텍스트 형식으로 변환시켜주는 오픈소스인 '위키피디아 익스트랙터'를 사용할 것입니다.
'위키피디아 익스트랙터'를 다운로드 받기 위해서는 윈도우의 명령 프롬프트나 MAC과 리눅스의 터미널에서 아래의 git clone 명령어를 통해 다운로드 받을 수 있습니다.
git clone "https://github.com/attardi/wikiextractor.git"  

(3) 위키피디아 한국어 덤프 파일 변환

위키피디아 익스트랙터와 위키피디아 한국어 덤프 파일을 동일한 디렉토리 경로에 두고, 아래 명령어를 실행하면 위키피디아 덤프 파일이 텍스트 파일로 변환됩니다. 컴퓨터마다 다르지만 보통 10분 내외의 시간이 걸립니다.
python WikiExtractor.py kowiki-latest-pages-articles.xml.bz2  



(4) 훈련 데이터 만들기


우선 AA 디렉토리 안의 모든 파일인 wiki00 ~ wiki90에 대해서 wikiAA.txt로 통합해보도록 하겠습니다.

[root@centos7-66 text]# cat AB/wiki* > ./wikiAB.txt
[root@centos7-66 text]# cat AC/wiki* > ./wikiAC.txt
[root@centos7-66 text]# cat AD/wiki* > ./wikiAD.txt
[root@centos7-66 text]# cat AE/wiki* > ./wikiAE.txt
[root@centos7-66 text]# cat AF/wiki* > ./wikiAF.txt
[root@centos7-66 text]# cat AG/wiki* > ./wikiAG.txt


[root@centos7-66 text]# cat ./wikiA* > ./wiki_data.txt









2019년 7월 15일 월요일

mac webview debug

1. 우선 아이폰에서 설정 -> 사파리 -> 고급 -> 웹 속성을 온 해주세요.

2. 맥과 아이폰을 연결 하고, 사파리를 실행시킵니다.

3. 사파리 메뉴에서 개발자용 -> 아이폰 기기명이 정상적으로 나오면 위 1번 설정이 정상적으로 된 것입니다.
(메뉴 막대에서 개발자용 메뉴가 보이지 않는 경우 Safari > 환경설정을 선택하고 고급을 클릭한 다음 ‘메뉴 막대에서 개발자용 메뉴 보기’를 선택하십시오.)


4. 디버그 하고 싶은 웹을 위해 앱을 실행 시키면 3번 이미지에서 앱 이름 - 웹 페이지 가 검색이 되실 겁니다.

5. 웹 페이지를 클릭하면 아래와 같이 개발자 모드 창이 나타납니다.

6. 요소, 네트워크, 리소스, 콘솔, 저장 공간 등을 이용해서 웹 디버깅을 하시면 됩니다.

2019년 3월 7일 목요일

2_edge-detection-example

Convolution operation (컨볼루션 연산)은 Convolution neural network (컨볼루션 신경망)의 기본적인 구성 블록들 중 하나입니다.

 edge detection을 사용해서 어떻게 컨볼루션 연산이 작동하는지 보도록 하죠.

이미지 안의 모서리를 어떻게 감지하는지 알아봅시다.
첫 번째 일은 바로 이 이미지 안에 있는 수직 테두리들을 탐지하는 것입니다.

vertical edge detecThistor (수직선 감지기)에서 탐지
수평선을 감지해야 할 때


이미지에서 테두리들을 감지

6x6 grayscale 이미지
grayscale 이미지이므로, 6x6x1 매트릭스

RGB채널상에 있기 때문에 6x6x3

수직선들을 감지하기 위해서는, 우선, 3x3 매트릭스를 만들고
(볼루션 신경망 용어로는 이런 걸 필터)
1, 1, 1, 0, 0, 0, -1, -1, -1
 kernel이라고 부르기도 합니다.

6x6 이미지 * 3x3필터

convolution operator의 결과는 4x4 매트릭스
4x4 이미지로 생각해도 되겠습니다.



이 4x4결과를 계산할 수 있는 방법은 다음과 같습니다.
4x4 매트릭스의 맨 위 왼쪽에 있는 첫 번째 element(요소)들을 계산하기 위해서는 3x3 필터를 가져다가 원본 인풋이미지의 3x3 영역 위에 붙여 넣기 하는 겁니다.
1, 1, 1 이라고 썼고, 0, 0, 0, -1, -1, -1이라고 썼습니다. 그리고 나서는 Element-wise Product(요소 간의 곱셈) 작업을 하는 겁니다.
첫 번째 것은 3x1 이 되고, 두 번째 것은 1x1 되겠죠. 아래로 내려가서 1x1 그리고 2x1을 더해줍니다. 그냥 1이죠, 그리고 나서 9개의 결과값을 모두 더해주세요. 그러면 가운데 세로 열이 0x0 + 5x0 + 7x0 ,
그리고 맨 오른쪽 칸은 0x-1이 됩니다. (8x-1) + (2x-1) 이 9개의 숫자들을 더하면 음의 값 5가 되고 그러니 -5를 바로 여기에 채워주겠습니다.
 이 9개의 숫자들은 어느 순서로 더해도 무방합니다. 그냥 첫 번째 열 아래쪽으로 진행하고 그리고 두 번째 행, 그리고 세 번째 이렇게 하면 되는 겁니다. 다음으로는, 두 번째 element를 알아내려면 이 파란 네모 칸을 이렇게 한 칸 오른쪽으로 옮기면 됩니다. 초록색 표시는 없애도록 하죠. 똑같은 element wise product(요소 간의 곱셈)을 하고 나서 더하시면 됩니다. 0x1 이 있습니다 + (5x1) +(7x1) + (1x0) + (8x0) + (2x0) + (2X-1) + (9x-1) + (5x-1) 하세요. 그리고 이 9개 숫자를 더하면 마침내 -4 라는 결과가 나오게 됩니다. 이걸 오른쪽으로 옮겨서, 9개의 연산을 수행해서 모두 더해보십시오. 그럼 0 이 되고, 이 곳은 8 이 될 겁니다. 확인해보려면, 2+9+5 = 16이 되죠. 가운데 세로 열은 0 이 됩니다. 그리고 가장 오른쪽 세로 행은 -4+ -1 + 3x-1 그럼 -8 이 되어, 왼쪽의 16에서 -8을 하고, 그럼 이 곳에 8 이 됩니다. 다음으로, 그 다음 가로 행의 요소를 알아내기 위해 여러분이 해 야할 일은 파란색 네모 칸을 한 칸 아래로 옮겨서 만들고 저 위치 값을 얻는 것입니다. 요소 간 곱셈(element wise product)를 반복 수행하고 덧셈을 하십시오. 그렇게 하시면, -10을 얻게 될 겁니다. 이걸 한 칸 오른쪽으로 이동시키면, -2, 2, 3 이런 식으로 되겠죠. 이렇게 매트릭스 행렬의 나머지 모든 요소들을 채워주세요. 더 명확하게 하자면, 이 -16이 이 아래쪽 3x3 부분으로부터 얻어지면 되는 겁니다. 3x3 매트릭스로 컨볼브된 6x6 매트릭스는 결국 4x4 매트릭스가 되는 것이죠. 이것들이 이미지와 필터입니다. 정말 다양한 차원의 매트릭스죠. 하지만, 왼쪽에 있는 매트릭스는 하나의 이미지처럼 해석하기가 편리합니다. 가운데 있는 것은 필터처럼 해석하고, 오른쪽 것은 아마 또 다른 이미지로 풀이해 볼 수 있을 겁니다. 그리고 이건 vertical edge detector(수직선 감지기)라는 게 분명해 보이는데요 다음 슬라이드에서는 왜, 계속하기 전에 하나 덧붙이자면 이걸 여러분이 프로그래밍 언어로 실행해보면, 실제로는 대부분의 외국어들이 컨볼루션을 표현할 때 별표 보다는 몇 가지의 다른 함수를 사용하고 있다는 것을 알게 될 것입니다. 예를 들어, 이전 예제 연습들에서, Conv-forward라는 함수를 사용하거나 실행시켰었습니다. 만약 tens of flow로 실행하게 되면, tf.nn.cont2d라는 함수가 있습니다. 그리고 또 다른 딥러닝 프로그래밍 체계로 Keras 프로그램 펌웨어, 이건이 과정 뒤 부분에서 같이 보게 될 텐데요. 컨볼루션을 수행하는 cont2d라는 함수가 있습니다. 하지만 컴퓨터 비전을 잘 지원하는 모든 딥러닝 체계들은 이 convolution operator를 실행하기 위해 몇 가지 함수를 사용하게 됩니다. 그럼, 왜 vertical edge detection를 수행하는 것일까요? 다른 예제를 보시죠. 이를 설명하기 위해, 단순화시킨 이미지를 사용해 보겠습니다. 여기 단순한 6x6 이미지가 있습니다. 이미지의 왼쪽 절반은 10이고, 오른쪽 절반은 0 입니다. 이것을 그림으로 생각해본다면, 이렇게 보일 겁니다. 10이 있는 왼쪽 절반은 더 밝은 픽셀 집약 값을 가지고 있고 오른쪽 절반은 더 어두운 픽셀 집약 값을 가지고 있습니다 저는 0을 표현하기 위해서 회색 쉐이드를 사용하고 있습니다 검정색으로 보여지긴 하지만 말이죠. 하지만 이 이미지에서, 가운데에 바로 매우 강한 vertical edge가 있습니다. 흰색에서 검정 혹은 흰색에서 더 어두운 색으로 전환되기 때문이죠. 3x3필터를 사용해서 컨볼브하고 그 결과 3x3 필터가 시각화될 때에는 다음과 같이 됩니다. 왼쪽에 더 밝은 픽셀이 있고 중간 톤의 0이 가운데에 있고, 오른쪽에는 더 어두운 픽셀이 있게 됩니다. 오른쪽과 같은 매트릭스를 얻게 되는 것이죠. 이 연산과정을 확인해보자면, 예를 들어 이 0은 element wise product를 수행하여 얻게 되는 숫자이고, 3x3블록을 가지고 곱셈을 진행하면 됩니다. 그렇게 하여 왼쪽 세로 열 10 + 10 + 10, 그리고 가운데 있는 0 들, 그리고 -10, -10, -10 을 더해서 바로 여기에 있는 0을 결국 얻게 되는 것입니다. 반면 그 반대로, 30이 얻어지는 것은, 10+10+10 -0 -0 으로부터 바로 저기에 있는 30 이 생기게 되는 것이죠. 자, 이 오른쪽 매트릭스의 이미지를 생각해보면 바로 이 가운데에는 이렇게 연한 영역처럼 보일 것입니다. 그리고 이는 6x6 이미지의 중간에 이 vertical edge를 감지한 것과 같습니다. 리고 이는 6x6 이미지의 중간에 이 vertical edge를 감지한 것과 같습니다. 감지된 테두리가 약간 두껍게 보여 이 dimension이 잘못되었다 싶어 보일 수 있는데요, 이는 그냥 이 매우 작은 이미지의 예시로 작업을 하고 있기 때문으로 보면 됩니다. 만약 6x6 이미지가 아니라 1000x1000 이미지 같은 것을 사용하고 있다면, 이미지 속 수직 가장자리들이 잘 감지되며 이 과정이 잘 진행되는 것을 볼 수 있을 것입니다. 이 예시에서, 가운데에 있는 밝은 영역이 바로 아웃풋 이미지인데요, 마치 이미지 중간에 강한 수직 가장자리가 있는 것처럼 보입니다. 이는 아마도 vertical edge detection으로부터 생각해볼 때, 우리가 3x3필터를 사용하고 있기 때문에 vertical edge가 3x3 영역이라는 점입니다. 여기엔 왼쪽에는 밝은 픽셀이 있고 가운데는 그다지 신경 쓰지 않아도 됩니다, 오른쪽에는 어두운 픽셀들이 있습니다. 이 6x6 이미지 중간에는 왼쪽엔 밝은 픽셀이, 그리고 오른쪽에는 어두운 픽셀이 있을 수 있습니다. 따라서 이쪽에 수직 가장자리가 있다고 생각되는 것이죠. 컨벌루션 연산은 이미지에 있는 수직 가장자리를 어떻게 찾을지 구체화시키는 편리한 방법을 제공해줍니다. 지금까지 어떻게 convolution operator가 작동하는지 살펴보았습니다. 다음 강의에서는 컨볼루션 신경망의 기본적인 빌딩블록의 하나로서 어떻게 사용할 수 있을지 알아보도록 하겠습니다.
2D 이미지에 대해 어떻게 컨볼루션이 작동하는지 보셨습니다. 이제 2D 이미지뿐만 아니라 3 차원 이상의 볼륨에서 컨볼루션을 구현하는 방법을 살펴 보겠습니다. 예시를 들어 시작해보죠. 특징들을 감지하고자 한다고 가정 해 봅시다. 큰 이미지에서뿐만 아니라 RGB 이미지에서도 말입니다. 따라서 RGB 이미지는 6x6 이미지가 아닌 6x6x3 이미지가 될 수 있습니다. 여기서 3 이 3 가지 색상 채널에 대응되는 것이죠. 이제, 이것을 6x6 개의 이미지 3개를 쌓을 것으로 으로 생각하십시오. 이 이미지에서 가장자리 또는 다른 기능을 감지하기 위해 이걸 컨볼브 합니다. 예전처럼 3×3 필터로 하는 게 아니라 이젠 3x3x3의 3D필터로 처리 합니다. 따라서 필터 자체에는 빨강, 녹색 및 파랑 채널에 세 개의 레이어가 있습니다. 세 개의 레이어가 있습니다. 그래서 이들에게 몇 가지 이름을 붙이면 이 처음 6 이건 이미지의 높이입니다. 이건 넓이, 그리고 이 3은 채널의 개수입니다. 그리고 필터도 비슷하게 높이, 넓이, 그리고 채널의 개수를 나타냅니다. 여러분이 가진 이미지에서 채널의 개수는 필터의 채널 수와 일치해야 하므로 이 두 숫자가 동일해야 합니다. 다음 슬라이드에서 이 컨볼루션 연산이 실제로 어떻게 작동하는지 알 수 있습니다 하지만 이 아웃풋은 4x4 이미지입니다. 이건 4x4x1이고 더 이상 끝이 3이 아니라는걸 주목해 주십시오. 이것이 어떻게 작동하는지 자세히 살펴 보도록 하겠습니다. 그러나 더 멋지게 그려진 이미지를 사용합시다. 여기 6×6x3이미지가 있습니다. 여기에는 3x3x3 크기의 필터가 있으며, 이 마지막 숫자, 즉, 채널의 수는 3D 이미지와 필터 모두 일치하고 있습니다. 3x3x3 필터의 그림을 단순화하기 위해서, 행렬을 쌓아올 리는 대신에 저는 3차원의 큐브모양으로 그리기도 합니다. 따라서 이 이 컨벌루션 연산의 아웃풋을 계산하려면 3x3x3 필터를 먼저 취하여 가장 왼쪽 상단에 배치하십시오. 따라서 이 3x3x3 필터에는 27개의 숫자, 혹은 27개의 파라미터가 있으며, 이는 곧 3개의 큐브와 마찬가지겠죠. 이제 하셔야 할 일은 27 개의 숫자를 각각을 가져 와서 이미지의 빨강, 초록, 파랑에 해당하는 숫자들과 곱하는 것입니다. 그래서 빨간 채널에서 처음 9 개의 숫자를 취한 다음 세 개의 숫자를 그 아래 녹색 채널에 넣고 3개를 그 아래 파란색 채널에 넣으십시오. 그리고 왼쪽에 있는 이 노란색 큐브 쇼에서 해당하는 27개의 숫자를 곱하십시오. 그리고 나서 이 모든 숫자를 더하면 아웃풋에 있는 첫 번째 숫자를 구할 수 있습니다. 그 다음 아웃풋을 계산하기 위해서, 이 큐브를 한 칸 밀어주세요. 그리고 다시 27개의 곱셈을 하고 27개의 숫자를 더하면 다음 아웃풋을 구할 수 있습니다. 다음 숫자를 위해, 옆 칸으로 밀어서, 다음 칸 숫자를 구하면 세 번째 아웃풋을 구할 수 있습니다. 이렇게 해서 네 번째 숫자를, 그리고 나면 한 행 아래로 가서 다음 숫자를, 또 다음으로, 또 다음으로 이렇게 숫자들을 계산해가며 끝까지 진행하면 이 위치에서 마지막 아웃풋을 찾을 수 있을 겁니다. 그래서, 이렇게 하면 여러 분이 할 수 있게 되는 건 무엇일 까요? 예시를 하나 들어보죠. 이건 3x3x3 필터죠. 이미지의 빨간 채널에서 모서리를 감지하고 싶다면, 첫 번째 필터에 1, 1, 1, -1, -1, -1 이렇게 하던 대로 하시면 됩니다. 그리고 녹색 채널은 모두 0 이 되어야 하고, 파란색 채널도 모두 0으로 채웁니다. 3x3x3크기의 필터를 만들기 위해서 이 세 가지를 함께 묶여두면, 이는 빨간색 채널에서만 수직 가장자리를 감지하는 필터가 될 것입니다. 또는 수직 모서리의 색상을 신경 쓰지 않으면 이와 비슷한 필터를 사용할 수 있습니다. 반면에 1, 1, 1 -1, -1, -1 세 가지 채널 모두 다 이렇게 될 수 있습니다, 따라서 이 두 번째 대안을 설정하여, 파라미터를 설정하십시오. 그럼 edge detector를 생성할 수 있게 되고, 이 3x3x3 edge detector는 어느 색상의 모서리도 감지할 수 있게 됩니다. 그리고 이러한 파라미터를 다르게 선택함으로써, 3x3x3 필터로부터 또 다른 feature detector를 얻을 수 있게 됩니다. 관례에 따라, computer vision에서는, 특정한 높이, 넓이, 그리고 채널의 수를 가지고 인풋을 하면, 여러분의 필터는 그 높이와 폭은 다르지만 채널 수가 같게 될 것입니다. 이론적으로 빨강 채널 만 보거나 아니면 녹색 채널만, 파란색 채널 만 보이는 필터를 사용할 수도 있습니다. 부피를 컨볼브 시켜서 6x6x6 를 3x3x3으로 합성하면 4x4, 즉 2D의 아웃풋을 산출하게 된다는 점을 기억해주세요. 여러분은 이제 부피를 합성하는 방법을 알고 있습니다. 컨볼루션 신경망을 구축하는데 있어 결정적인 부분을 마지막으로 이야기해봅시다 우리가 수직 모서리를 감지하고 싶지 않다면 어떻게 될까요? 수직 모서리와 수평 모서리, 혹시 45도 모서리와 아님 70도 모서리를 검출하기를 원하는데, 동시에 여러 필터를 사용하고 싶다면 어떻게 해야 할까요? 자, 이전 슬라이드에서 가져온 사진입니다. 3x3x3으로 합성된 6x6x3 이미지가 4x4로 되었습니다. 아마도 이것은 수직 모서리 감지기 일 수도 있고, 아니면 다른 feature를 감지 할 수도 있습니다. 이제, 두 번째 필터가 이 오렌지 빛 색상으로 표시 될 수 있습니다. 이건 수평 edge detector라고 생각해보죠. 따라서 첫 번째 필터로 컨볼루션하면 이 첫 번째 4x4 아웃풋이 나오고, 두 번째 필터와 컨볼루션하면 4x4 아웃풋이 달라집니다. 그리고 나서 우리가 할 수 있는 것은 이 두 개의 4x4 아웃풋을 산출해서, 앞에다가 이 첫 번째 것을 놓고 이 두 번째 필터를 취해서, 여기 그려보겠습니다. 이렇게 뒤에다 두십시오. 이 두 개를 쌓아두는 겁니다. 그럼 4x4x2 의 아웃풋 볼륨이 만들어지게 됩니다. 그렇죠? 그리고 우리는 이걸 하나의 상자인 것처럼 볼륨을 생각할 수 있습니다. 아마도 이런 모양 일 것입니다. 따라서 이것은 4x4x2 아웃풋 볼륨이 됩니다. 6x6x3 의 이미지를 가져와서 컨볼루션 하고 두 개의 서로 다른 3x3x3 필터를 적용하면 두 개의 4x4 아웃풋이 생겨나게 되죠. 그럼 이것들이 쌓아 올려지며 4x4x2 볼륨을 형성하게 됩니다. 그리고 여기 두 가지는 두 개의 다른 필터를 사용했기 때문입니다. 이 dimension을 요약해보도록 하죠. nxnxnc 즉 채널 개수, 이렇게 생긴 인풋 이미지를 가지고 있다고 가정해 봅시다. 예를 들어, 6x6x3 여기서 n 옆에 붙은 대문자 C는 채널의 수를 가리키는 겁니다. 이제 fxf xnC 이렇게 컨볼루션하십시오 이건 3x3x3 이렇게 됐었죠. 관례대로, 이 마지막 숫자는 같은 숫자여만 하죠. 이렇게 해서 도출되는 결과는 n-f+1 x n-f+1 x nC' 이렇게 나옵니다. 아니면 이 nC는 다음 레이어가 될 수도 있고, 여러분이 사용하는 필터의 개수가 될 수도 있겠죠. 이 예시에서 이는 곧 4x4x2 가 됩니다. 스트라이드 1을 쓰고, 패딩을 하지 않는다는 가정에서 이렇게 썼는데요, n-f+1이 아닌 다른 패딩 스트라이드를 사용한다면, n-f+1은 일반적인 방법으로 영향을 받을 겁니다. 이전 강의들에서 보셨던 대로 말이죠. 자, 볼륨에 대한 컨벌루션은 이렇게 정말 강력합니다. 그 중 극히 일부만이 3 채널로 RGB 이미지에서 직접 조작 할 수 있습니다. 그러나 더 중요한 것은 수직, 수평 모서리 같은 두 가지 feature들, 또는 10, 또는 어쩌면 128 또는 수백 가지의 서로 다른 feature를 감지 할 수 있다는 것입니다. 아웃풋은 탐지중인 필터의 수와 동일한 수의 채널을 가지게 될 것입니다. 표기법에 대한 설명을 덧붙이자면, 저는 문헌에 나오는 이 마지막 차원을 나타내기 위해 '채널의 수'라는 용어를 사용했습니다. 이는 종종 3D볼륨의 깊이라고 불리기도 합니다, channel 과 depth, 이 둘 모두 문헌들에서는 흔하게 사용되는 표현입니다. 하지만 depth 라는 표현은 더 혼란을 주기도 하는데요, 신경망의 depth 라는 용어도 사용하기 때문입니다. 그래서 저는 이 강의에서 필터의 세 번째 dimension의 사이즈를 가리킬 때 channel이라는 용어를 사용하려고 합니다. 볼륨을 컨볼루션에 어떻게 실행시킬 수 있을지 이제 배웠으니, 컨볼루션 신경망 레이어를 구현할 준비가 이제 되신 겁니다. 어떻게 하면 되는지 다음 강좌에서 같이 알아보도록 하겠습니다.