페이지

2019년 12월 23일 월요일

docker run -d --name kuard --publish 8080:8080 gcr.io/kuar-demo/kuard-amd64:1

curl http://localhost:800

docker stop kuard
docker rm kuard


docker run -d --name kuard --publish 8080:8080 --memory 200m --memory-swap 1G gcr.io/kuar-demo/kuard-amd64:1


docker run -d --name kuard --publish 8080:8080 --memory 200m --memory-swap 1G --cpu-shares 1024 gcr.io/kuar-demo/kuard-amd64:1


docker rmi
docker rmi

virtualbox uninstall

System Preferences -> security & privacy  -> Oracle America, inc allow

virtualbox install

minikube start

minikube start --kubernetes-version v1.17.0
minikube status
minikube stop
minikube delete

kubectl veersion

kubectl get componentstatuses

kubectl get nodes


kubectl describe nodes node-1

2019년 11월 20일 수요일

Microservice deployment to Kubernetes

https://github.com/karthequian/wishlist

# Deploying our application to Kubernetes

We're ready to deploy our application to Kubernetes, but let's take a look at our assets.

## Goals:
1. View our sample application and containers
2. Take a look at our deployment file
3. Take a look at our alternate deployment file
4. Deploy our application into kubernetes and verify we can see our API's working.

## Goal 1
View the sample application here:

## Goal 2
To view the deployment file, take a look at wishlist-deployment.yaml

## Goal 3
To see another way to run the microservices, take a look at wishlist-deployment-alernate.yaml

## Goal 4
To run the microservice described in goal #1, from the current directory, run:

`kubectl create -f wishlist-deployment.yaml`

To verify that the deployment is online:
`kubectl get deployments`

To verify that the replica sets are running:
`kubectl get rs`

To verify that the pods are running:
`kubectl get pods`

To see the services:
`kubectl get services`

To interact with your API's in the minikube environment:
`minikube service wishlist-service`



# Wishlist deployment yaml
kind: Deployment
apiVersion: apps/v1
metadata:
  name: wishlist-deployment
  labels:
    app: wishlist
spec:
  replicas: 3 #We always want more than 1 replica for HA
  selector:
    matchLabels:
      app: wishlist
  template:
    metadata:
      labels:
        app: wishlist
    spec:
      containers:
      - name: wishlist #1st container
        image: karthequian/wishlist:1.0 #Dockerhub image
        ports:
        - containerPort: 8080 #Exposes the port 8080 of the container
        env:
        - name: PORT #Env variable key passed to container that is read by app
          value: "8080" # Value of the env port.
      - name: catalog #2nd container
        image: karthequian/wishlist-catalog:1.0
        ports:
        - containerPort: 8081
        env:
        - name: PORT
          value: "8081"
      - name: auth #3rd container
        image: karthequian/wishlist-auth:1.0
        ports:
        - containerPort: 8082
        env:
        - name: PORT
          value: "8082"
---
kind: Service
apiVersion: v1
metadata:
  name: wishlist-service
  namespace: default
spec:
  type: NodePort
  selector:
    app: wishlist
  ports:
  - name: wishlist-port
    protocol: TCP
    port: 8080
  - name: wishlist-auth-port
    protocol: TCP
    port: 8081
  - name: wishlist-catalog-port
    protocol: TCP
    port: 8082



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이라는 용어를 사용하려고 합니다. 볼륨을 컨볼루션에 어떻게 실행시킬 수 있을지 이제 배웠으니, 컨볼루션 신경망 레이어를 구현할 준비가 이제 되신 겁니다. 어떻게 하면 되는지 다음 강좌에서 같이 알아보도록 하겠습니다.
Strided 컨볼루션는 컨볼루션 신경망에서 사용되는 컨볼루션의 기본적인 빌딩블록의 또 다른 하나입니다. 예시를 들어보죠. 이 7x7 이미지를 3x3필터와 컨벌브한다고 생각해봅시다, 일반적인 대신에 2 스트라이드으로 처리 할 것입니다. 즉, 이 왼쪽 상단 3x3 영역에 있는 Element-wise product (요소 간의 곱셈)을 평소대로 진행하고 곱하고 더하면 91이 됩니다. 파란색 상자를 한 칸 씩 이동하는 대신 2칸을 옆으로 이동합니다. 우리는 이렇게 두 걸음씩 점프해보겠습니다. 왼쪽 상단 코너가 여기서 시작해서 여기 시작 부로 어떻게 이동했는지 유의하십시오. 한 칸을 뛰어 넘는 거죠. 그리고 나서, 일반적인 방법대로 요소 간 곱셈을 하고 합하면 100이됩니다. 이제 우리는 그걸 다시 할 것인데요, 파란색 상자를 두 칸 건너 뛰세요 여기에 오게 되고, 83이 됩니다. 다음 행으로 가서, 다시 한 칸이 아니라 두 칸을 이동하고, 그럼 파란색 상자가 이쪽으로 가게 되겠죠. 우리가 어떻게 포지션 중 하나를 건너뛰고 있는지, 그리고 어떻게 하면 69 가 되는지 잘 보십시오. 그리고 다시 두 칸을 건너뛰면, 91이 되고 이런 식으로 127이 됩니다. 그리고 마지막 행은 44, 72, 74. 이 예에서 우리는 7x7 매트릭스를 3x3매트릭스와 컨벌브해서 3x3 결과물을 얻게 됩니다. 이 인풋과 아웃풋 크기는 다음 공식에 따라 산정됩니다. N×N 이미지가 있는 경우 F와F 필터로 컨벌루션됩니다. 그리고 패딩 P와 스트라이드 S를 사용하는 경우, 이 예제에서 S=2 이고, N+2 P에서 F를 뺀 아웃풋이 나오게 되는 거죠. 이제 S 단계를 거치므로, 한 번에 한 칸 옮기고, S 로 나눈 다음 1을 더해주세요. 그런 다음 똑같은 방식을 적용하면 되겠습니다. 예시에서, 7+0-3 가 되고, 스트라이드 2로 나눈 다음 1을 더하면 2분의 4+1, 즉 3이 됩니다. 이런 방식으로 3x3 아웃풋으로 결론 낼 수 있는 겁니다. 자, 마지막으로, 이 부분이 정수가 아니면 어떻게 될까요? 이 경우 남는 숫자를 잘라버리고 이 표기법이 floor를 표시하도록 해줍니다. 이 표시는 Z의 floor라는 뜻이죠. 이는 Z를 내림 해서 가장 가까운 정수로 만들라는 뜻입니다. 이렇게 구현되는 방식은 이미지 또는 패딩에 더해진 이미지 내에 파란 상자가 완전히 포함되어 있는 경우에만 파란상자 곱셈을 취하는 것입니다. 만약 이 파란색 상자 종류 중 일부가 바깥쪽에 걸쳐있다면, 그 계산은 하지 마세요. 생성 된 해당 출력이 있기 전에 3x3 필터가 이미지 또는 이미지에 더해진 패딩 영역을 완전히 포함해야 한다고 생각한다면, 그것 또한 고정관념입니다. 그러므로, 아웃풋 크기를 계산해내는 올바른 방법은 N+2p-f를 S로 나누었을 때 정수가 아닌 경우 내림 하는 것입니다. dimension을 요약해보자면, NxN 매트릭스 혹은 NxN 이미지를 패딩 P와 스트라이드 S와 컨벌브하면 아웃풋 사이즈는 이러한 dimension을 가지게 될 겁니다. 때로는 그럴 필요가 없기도 하지만, 여기 정수가 생기도록 여기 있는 모든 숫자들을 선택할 수 있다는 건 좋죠, 내림 하는 것도 괜찮습니다. 그러나 N, F, P 및 S 값의 몇 가지 예를 통해 편하게 작업하시고 원하는 경우 이 수식이 출력 크기에 맞는지 확인해보십시오. 이제 계속 진행하기 전에 cross-correlation (교차 상관)과 컨벌루션의 차이점에 대해 기술적인 의견을 덧붙이고 싶은데요, 이는 컨볼루션 신경망을 실행할 때 영향을 미치게 됩니다. 다른 수학 교과서나 신호 처리 교재를 읽어보면, 표기법에 있어 생길 수 있는 불일치점이 하나 있습니다. 그게 뭐냐 하면, 전형적인 수학 교과서를 보면, 요소 간 곱셈과 덧셈을 하기 전에 컨벌루션 이 정의 되는 방식에 있어서, 사실 먼저 수행해야 하는 한 단계가 더 있습니다. 6 x6 행렬을 3x3 필터로 콘볼부하는 것입니다. 우선, 3x3 필터를 취해 가로, 세로축 모두 옆으로 돌려보면 3, 4, 5, 1, 0, 2, -1, 9, 7 가 될 겁니다. 3은 여기로 하고, 4는 저쪽으로, 5는 저쪽, 그리고 두 번째 행은 1, 0, 2, -1, 9, 7이 됩니다. 이것은 실제로 3x3개 필터를 취하여 수직 축과 수평 축 둘 다로 좁힙니다 그리고 나서, 옆으로 돌려진 이 매트릭스가 여기에 복사합니다 아웃풋을 계산하려면, 2x7 3x2를 더하고 7x5를 더하는 이런 방식으로 진행합니다. 이 옆으로 돌린 행렬을 곱해서 4x4 아웃풋의 왼쪽 상단 행의 원소들을 계산하면 됩니다. 그런 다음 9 개의 숫자를 가져 와서 한 칸 이동하고, 또 한 칸 이동시키세요. 이 강의의 컨벌루션 연산을 다루는 방법은 이 좁히는 작업을 건너뛰고 진행했습니다. 기술적으로, 우리가 실제로 하고 있는 것, 즉, 지난 강의에서 사용해온 작업은 때로는 컨볼루션이 아닌 교차 상관 입니다 그러나 관례에 따르는 딥러닝 문헌에서는 우리는 이것을 컨벌루션 연산이라고 부릅니다 간단히 요약하자면, 기계 학습의 관례에 따라, 우리는 일반적으로 이 skipping operation을 신경 쓰지 않고, 기술적으로는 이 작업을 교차 상관이라고 할 수도 있지만 대부분의 딥러닝 문헌에서는 이것을 컨벌루션 연산라고 부릅니다. 그래서 저는 이 강의에서도 이 관례대로 사용할 예정입니다. 많은 기계 관련 문헌을 읽는다면 대부분의 사람들이 이렇게 돌린 매트릭스를 사용하지 않고 컨벌루션 연산로 부르는 것을 볼 수 있을 것입니다. 신호 처리나 특정 수학 분야에서 컨벌루션 연산가 컨볼루션 정의대로 을  뒤집기를 하면 A*B 먼저 컨벌브하고 C와 컨벌브하면 A를 컨벌브 된 B와 C에 나중에 컨벌브하는 것과 같다는 것이 밝혀졌습니다. 이것은 일부 신호 처리 애플리케이션에 적합하지만 심층 신경망 의 경우에는 그다기 상관이 없기 때문에 이 이중 mirroring operation을 생략해서 코드를 단순화시키고, 신경망도 제대로 작동하게 할 수 있습니다. 관례에 따라, 대부분 사람들은 이걸 컨벌루션이라고 부릅니다. 수학자들이 때때로 이걸 교차 상관이라고 부르는 걸 선호긴 하지만, 이것은 문제점 연습에서 실행하는 것에는 영향을 미치지 않아야 하며 딥러닝 문헌을 읽고 이해하는 데에 영향을 주어서는 안됩니다. 지금까지 컨볼루션을 수행하는 방법과 패딩과 컨볼루션 스트라이드를 사용하는 방법을 보셨습니다. 하지만 지금까지 보신 것은 6 x6보다 큰 매트릭스에 관한 컨벌루션이었습니다. 다음 강좌에서는, 볼륨에 대해 컨볼루션을 수행하는 방법을 볼 수 있습니다. 그러면 컨볼루션을 훨씬 더 강력한 것으로 만들 수 있습니다. 다음 동영상으로 넘어 갑시다.
DNN을 구축하기 위해, 기본적인 컨볼루션 연산에 한 가지 변형을 여러분이 할 줄 알아야 하는데요, 그것은 바로 패딩입니다. 어떻게 작동하는지 보시죠. 지난 영상에서 본 것은 6x6 이미지를 3x3 필터와 합성했을 때, 4x4 행렬로 된 4x4 아웃풋이 나온다는 것이었습니다. 이게 가능한 이유는 3x3필터로 된 가능한 위치에 놓이는 숫자들이 있기 때문입니다. 이는 4x4에만 가능한 위치가 있다는 뜻이죠. 6x6매트릭스에 맞는 3x3필터가 있기 때문이기도 합니다. 수학적으로 봤을 때, n x n 이미지를 f x f 필터로 합성시키면 아웃풋의 차원은 (n-f+1) x (n-f+1) 이 될 것입니다. 이 예시에서, 6-3+1 = 4 입니다. 이것이 4x4 아웃풋을 갖게 되는 이유입니다. 여기엔 두 가지의 단점이 있는데요, 하나는 이겁니다. 컨벌루션 연산을 적용할 때 마다 이미지가 축소됩니다. 6x6에서 4x4로 줄어든다면, 여러분의 이미지가 정말 작아지기 전에
단 몇 번의 연산만 수행할 수밖에 없습니다. 1x1 정도로 줄어드는 그 때 정도까지만 말이죠. 그러니, 모서리를 감지할 때마다 이미지가 줄어들지 않게 하거나 다른 피쳐를 그 위에 얹고자 할 때엔, 그게 하나의 단점이 되는 것이죠. 두 번째 단점은 이겁니다. 코너나 모서리에 있는 픽셀을 보면 이 작은 픽셀이 아웃풋의 하나로서만 사용되도록 터치되어집니다. 왜냐하면 이게 3x3영역을 건드리기 때문이죠. 반면에 가운데에 있는 픽셀을 고르면,
(이 픽셀이라고 치면) 그럼 그 픽셀과 겹쳐지는 3x3 영역이 많아지게 되고, 다시 말해, 코너나 모서리에 있는 픽셀들이
아웃풋에서 훨씬 적게 사용된다고 볼 수 있습니다. 따라서 이미지 가장자리 쪽의
많은 정보를 버리는 것과 같습니다. 이러한 두 가지 문제점을 해결하기 위해서 축소되는 아웃풋과 여러분이 정말 여러 층으로 이루어진 인공 신경망을 만들 때 단계마다 이미지가 왜 줄어들면 안 되는지 살펴보세요.
왜냐하면 만약 여러분이 100개의 레이어로 된 deep net을 가지고 있고, 각 레이어마다 이미지 크기가 줄어든다면, 100 레이어 이후에는 매우 작은 이미지만 남게 될 것이기 때문입니다. 그래서 이게 첫 번째 문제점이었고, 또 다른 문제는 이미지의 가장자리에서
많은 정보를 버리고 있다는 것입니다. 따라서 이 두 가지 문제점을 해결하기 위해 여러분이 할 수 있는 것은
컨벌루션 연산을 최대로 적용하는 것입니다. 이미지를 덧붙일 수 있습니다. 이 경우, 이미지에
추가적인 경계선을 덧댄다고 생각해봅시다. 모든 모서리 둘레에 하나의 픽셀을 추가해서 경계선을 그리는 거죠. 그렇게 하면, 6x6 이미지 대신에, 이걸 덧붙여서 8x8 이미지를 만들게 되고, 이 8x8 이미지를 3x3 필터와 컨볼브하게 되면,
이러한 결과를 만들어내게 됩니다. 자, 4x4 이미지가 대신 6x6 이미지가 생기고, 이제 원래의 6x6 인풋 사이즈를 유지하게 됩니다. 따라서 습관적으로 패딩할 때 0으로 패딩하고, p 크기만큼 패딩한다면 이러한 경우, p=1과 같습니다. 왜냐하면 픽셀의 추가적인 경계선으로 모든 테두리를 덧붙이고 있기 때문입니다. 그리고 아웃풋은 (n+2p-f+1) x (n+2p-f+1) 이므로, 이는 (6+2-3+1) x (6+2-3+1) 가 됩니다. 따라서 (6+2-3+1) 은 6이 됩니다. 원본 사이즈를 보존한 6x6 이미지를 얻게 되는 것입니다. 이 픽셀의 존재는 실제로 아웃풋의 모든 셀에 영향을 주고, 정보를 허비하는 게 아니라 덜 셈으로서 이미지의 코너의 모서리나 이미지의 가장자리에 있는 정보는 줄어들게 됩니다. 여기 보여드리는 것처럼, 하나의 픽셀을 deep border를 덧붙이는 효과인데요, 원한다면 두 개의 픽셀을 경계에 붙일 수도 있습니다. 이런 경우엔 또 다른 경계 면에 붙일 수도 있는데요, 여러분이 선택한 만큼 더 많은 픽셀을 붙일 수도 있겠죠. 제 생각엔 여기 그리고 있는 건, 이건 덧붙여진 건 2개, 즉 p=2이죠 얼마나 많이 덧붙일 수 있는가에 대해서는, 공통적으로 불리는 2개가 있는데요 Valid Convolution과 Same Convolution입니다. 대단한 이름은 아니지만, Valid Convolution에서는 기본적으로 패딩이 없는 것을 의미합니다. 이 경우, n x n 이미지를 f x f 필터로 컨볼브해서 이는 (n-f+1) (n-f+1) x (n-f+1) 의 아웃풋을 산출하게 됩니다. 이것은 이전 영상에서 보았던 예시와 같은 것인데요, n x n 이미지를 3 x 3 필터로 컨볼브 해서 4x4 아웃풋을 도출했었습니다. 또 다른 일반적인 선택지는 Same Convolution인데요, 이것은 패드를 해서 아웃풋 사이즈가 인풋 사이즈와 같은 경우를 뜻합니다. 실제로 이 공식을 보시면, p 픽셀로 패드를 할 때, 이는 마치 n+2p 그리고 나서 이 나머지인 거죠, 그렇죠? -f+1 nxn 이미지와 온 테두리를 p 픽셀로 패딩하였다면, 이 아웃풋의 차원은 n +2p-f+1을 곱한 것과 같습니다. 따라서 만약 n+2p-f+1이 n이 되려면 즉, 아웃풋 사이즈가 인풋 사이즈와 같아지려면, 이걸 계산하면 양변에 n 을 지워주고, p에 대해 풀어보면 p는 2분의 f-1 이 됩니다. f가 홀수이면 다음과 같이 패딩 크기를 결정해서 아웃풋 사이즈가 인풋사이즈와 같다는 것을 확인할 수 있습니다, 그렇게 때문에 예를 들어 이전 슬라이드에서 봤던 것처럼 필터가 3x3이면 아웃풋 크기와 인풋 크기를 같게 하는 패딩은 2분의 3-1, 즉 1 입니다. 또 다른 예를 들어보면, 필터가 5x5 이고 즉, f=5이라면 이걸 방정식에 대입하면, 2만큼의 패딩이 아웃풋 크기를 인풋 크기와 똑같게 만들어줍니다. 필터가 5x5일때 말이죠. 그리고 컴퓨터 비전 분야의 관습에 따르면 f는 주로 홀수이며, 사실 대부분 항상 홀수입니다, 짝수로 된 필터는 보기도 어렵습니다. 필터는 컴퓨터 비전을 사용해서 작동합니다. 그리고 제 생각에 그 이유는 두 가지 입니다. 첫째로, f가 짝수이면 몇 가지 비대칭적인 패딩을 해야 합니다. 따라서 f가 홀수여서 이 Same Convolution 유형이 자연적인 패딩 영역을 주기만 한다면 패딩이 왼쪽엔 더 많고 오른쪽엔 더 적다거나 혹은 불규칙적이지 않고 사방에 같은 dimension이 있을 것이다. 두 번째 이유는, 홀수 차원의 필터를 사용한다면 예를 들어 3x3 이나 5x5와 같이 중앙 포지션을 가지고 있고 때로는 컴퓨터 비전분야에 있어서 특징점을 가지고 있다는 것은 좋은 점입니다. 픽셀을 가지고 있으면 좋습니다, 중앙의 픽셀을 칭할 수 있고 필터의 포지션에 대해 이야기할 수 있습니다. 맞습니다, 어느 것도 f 가 거의 항상 홀수로 사용되는 데 있어 좋은 이유가 될 수는 없습니다. 하지만 컨벌루션 문헌에 보면, 3x3 필터가 매우 흔하다는 걸 보게 됩니다. 또는 5x5, 7x7을 보게 되기도 하고, 실제로 때로는, 1x1 필터에 대해 알아보고 그게 어떻게 가능한지도 살펴보겠습니다. 하지만 관행적으로, 홀수 필터를 사용하기를 권장합니다. 제 생각엔 아마 가능할 것 같습니다. f에 짝수 값을 사용한다 하더라도 좋은 성능을 낼 수 있을 것 같습니다. 하지만 여러분이 아직 컴퓨터 비전 관행에 매여있다면, 저는 대개 홀수 f를 사용합니다,
자, 여러분은 Padded Convolution을 사용하는 방법을 살펴보았습니다. 컨벌루션 연산을 위해 패딩을 더 알고 싶다면 p 값을 구체화하거나 Valid Convolution이라고 하면 되는데요, 이는 p=0 임을 의미하는 것이죠.
아니면 Same Convolution, 즉, 아웃풋이 인풋과 같은 차원을 가지는 패딩도 있습니다. 여기까지 패딩에 대해 보았습니다. 다음 강좌에서는, Strided Convolution를 실행하는 법에 대해 알아보겠습니다.
컨벌루션 연산을 통해 vertical edge detector를 구현하는 방법을 살펴 보았습니다 이번 강의에서는, 포지티브 에지와 네거티브 에지의 차이점, 다시 말해, 밝음에서 어두운 에지로의 변화와 어두움에서 밝은 에지로의 변화되는 차이점을 알아보도록 하겠습니다. 또한 어떻게 알고리즘이 학습하게 할 수 있을지 뿐만 아니라 다른 유형의 edge detector를 보게 될 것입니다. 지금까지 해왔던 것처럼 edge detector를 직접 핸드코딩시키는게 아닙니다. 그럼 시작해보겠습니다. 이전 강의에서 보셨던 예시입니다. 6x6, 왼쪽은 밝고 오른쪽은 어두운 이 이미지를 보셨었습니다. 그리고 이걸 vertical edge detection 필터와 합성해서 이미지 가운데에 수직 에지가 감지되도록 했었죠. 색상이 뒤집어져서 왼쪽이 어둡고 오른쪽이 밝은 이미지에서는 어떤 일이 생길까요? 이렇게 하니 10 은 이미지 오른쪽 절반에 있고, 0은 왼쪽에 있군요. 그걸 똑같은 edge detection 필터와 합성하면, 가운데가 30 대신에 -30의 결과를 가지게 됩니다. 이렇게 생긴 그림을 그려볼 수 있을 겁니다. 전환되는 명암이 이렇게 반대로 되기 때문에, 이제 30 또한 반대로 뒤바뀌게 되는 것입니다. 그리고 -30은 밝은 색에서 어둠으로의 변화가 아니라 어두운 색에서 밝은 색으로 변화하는 것이죠. 이 둘 중 어느 경우인지 신경 쓰지 않으면, 이 결과 매트릭스의 절대값을 얻을 수 있습니다. 그러나 이 특정한 필터는 밝은 색에서 어두운 색으로 변하는 에지와 어두운 색에서 밝은 색으로 변화하는 에지의 차이점을 만들어냅니다. edge detection의 예시를 좀 더 보시죠. 지금까지 공부한 이 3 x 3 필터를 사용하면 vertical edges(수직 모서리)를 감지 할 수 있습니다. 따라서, 이 3x3필터가 수평 모서리를 감지해내는 것도 여러분에게 놀라운 일도 아닐 겁니다. 기억해두실 것은, 이 필터에 따르면, 수직 모서리는 왼쪽에 상대적으로 밝은 픽셀과 상대적으로 어두운 오른쪽 부분에 있는 3x3영역이라는 것입니다. 이와 비슷하게, 수평 모서리는, 픽셀이 위쪽은 상대적으로 밝고 아래쪽은 상대적으로 어두운 3x3 영역이 됩니다. 예시가 하나 있습니다. 이건 좀 더 복잡한데요, 위쪽 왼쪽과 오른쪽 아래 코너에 10들이 있습니다. 따라서 이걸 이미지로 그려보시면, 0이 있는 곳은 어두운 이미지가 되겠죠, 따라서 어두운 영역에 쉐이드를 만들어보겠습니다. 위쪽 왼쪽과 오른쪽 아래 코너가 있는데요. 이걸 수평 모서리 감지기와 합성하면, 이걸 얻을 수 있습니다. 몇 가지 예시를 보자면, 여기 있는 이 30은 이 3x3영역에 대응하는데요, 실제로 위쪽엔 밝은 픽셀이 있고 아래쪽엔 어두운 픽셀들이 있습니다. 바로 여기죠. 강한 포지티브 에지를 만들어내는 것입니다. 그리고 여기에 이 -30은 이 영역에 대응하게 되는데요, 아래쪽은 더 밝고, 위쪽은 어둡게 되는 것이죠 그리고 이게 바로 네거티브 에지의 예시입니다. 다시 말해서, 우리가 6x6같은 상대적으로 작은 이미지들로 작업하고 있다는 사실을 보여주는 것입니다. 하지만 예를 들어 -10같은 이 중간 값들은 왼쪽에 포지티브 에지 부분을 담아내고 오른쪽에 네거티브 에지를 담아낸다는 사실을 보여주는 것입니다. 따라서 그것들을 함께 섞으면 중간 값을 얻게 되는 것이죠. 하지만 이게 매우 큰, 체크 패턴을 가진 1000x1000 정도의 이미지라면, 이런 10의 전환영역은 보이지 않습니다. 중간 값은 이미지 사이즈에 비해 꽤 작을 겁니다. 요약하자면, 다른 필터를 사용하면 수직/수평 에지를 찾도록 도와줍니다. 다시 말해, 우리가 사용한 3x3 수직 에지 detection filter는 가능한 여러 선택 중 하나일 뿐이라는 게 분명한 거죠. 역사적으로 볼 때, 컴퓨터 비전 문헌에서, 어떤 게 최상의 숫자체계인지에 대해 꽤 많은 논의가 있었습니다. 따라서 여러분이 사용할 수 있는 또 다른 것은, 아마도 1, 2 1, 0, 0, 0, -1, -2, -1 일겁니다. 이건 Sobel Filter라고 불리는 겁니다. 이것의 장점은 중앙 열, 중앙픽셀에 에 좀 더 무게를 두어 좀 더 견고하게 만든다는 것입니다. 그러나 컴퓨터 비전 연구원들은 또 다른 세트의 숫자들도 사용하겠죠. 1, 2, 1, 대신에 3, 10, 3, 이렇게 될 수 있을 겁니다, 그렇죠? 그리고 -3 ,-10, -3 이렇게요. 그리고 이건 Scharr Filter라는 겁니다. 이건 약간 다른 특징을 가지고 있습니다 그리고 이건 vertical edge detection만을 위한 겁니다. 그리고 이걸 90도 돌려보시면, horizontal edge detection을 볼 수 있죠. 딥러닝이 떠오르면서, 우리가 배운 것 중의 하나는 복잡한 이미지에서 모서리들을 감지할 때, 컴퓨터 비전 연구원들이 이 9개의 숫자를 택하게 하지 않아도 된다는 겁니다. 여러분은 그냥 그걸 배워서 이 매트릭스의 9개의 숫자들을 파라미터로 처리하면, 백 프로퍼게이션 (역전파)을 사용하는 것을 배울 수 있을 테니까요. 목표는 9개의 파라미터를 배워서 6x6 이미지를 얻어낼 때, 그리고 그걸 3x3 필터와 컨볼브해서 좋은 edge detector를 만들어내도록 하는 거죠. 후속 강의들에서는 파라미터로 이 9개의 숫자들을 처리하여 역전 파가 1, 1, 1, 0, 0, 0, -1, -1을 학습하거나 혹은 Sobel Filter 나 Scharr Filter를 학습하거나, 혹은 이런 핸드코딩된 필터보다 여러분 데이타의 통계를 훨씬 잘 담아낼 수 있는 무언가를 학습하도록 선택하는 것을 알아보겠습니다. 그리고 수직/수평 에지가 아니라, 45도로 된 모서리에서, 아님 70도 혹은 73도 혹은 어느 방향으로 선택하든지 감지하는 것을 배울 수 있습니다. 이 모든 숫자들이 파라미터가 되게 만들고 데이타로부터 자동으로 그걸 배움으로써, 신경망가 low-level features배우고, 에지 같은 특징들을 배우도록 할 수 있을 겁니다. 컴퓨터 비전 연구원들이 수작업으로 이것들을 암호화 시키는 것보다 훨씬 견고하게 할 수 있을 겁니다. 이 모든 계산에는 여전히 컨벌루션 연산이 근간에 있으며, 이는 back propagation으로 하여금 3x3필터든 뭐든 배우게 합니다. 이 위치에서 감지하려 하는 게 어떤 특징이던 지간에 결과물로 내기 위해서 그걸 전체 이미지에 적용시키는 거죠. 그게 수직 에지, 수평 에지, 혹은 또 다른 각도에서의 에지나 심지어 영어로 이름조차 없는 다른 필터일 수도 있습니다. 이 9개의 숫자를 파라미터로 학습되도록 하는 생각은 컴퓨터 비전분야에서 가장 영향력 있는 아이디어의 하나였습니다. 이 과정의 뒷부분에서, 이번 주 후반이 되겠네요, 이 9개의 숫자를 배우기 위해서 back propagation을 사용하는 방법에 대해 자세하게 이야기해보죠. 하지만 우선, 기본 컨벌루션 연산에서 몇 가지 다른 변수나 몇 가지 세부사항에 대해 이야기해봅시다. 다음 강좌에서는 컨볼루션에서 패딩과 스트라이드 사용하는 방법을 이야기해보고 싶습니다 이 두 가지가 convolution neural network 빌딩블록의 중요한 요소들이 될 것입니다. 다음 강좌로 가보시죠

2019년 3월 1일 금요일

1. Convolutional Neural Networks_Computer vision

1.1. 컴퓨터 비전 소개

Convolutional Networks(콘볼루션망)

컴퓨터 비전은 빠르게 발전 - 딥러닝

자율주행 자동차 - 주변 어디에 다른 자동차나 보행자 감지
안면 인식 - 예전보다 훨씬 잘 작동
ex) 핸드폰 얼굴 인식. 집에 잠긴 문 인식
핸드폰의 음식 사진이나 호텔 사진, 혹은 재미있는 풍경사진들을 인식 하는 app
새로운 유형의 예술을 탄생

1.1.1. 컴퓨터 비전 분야의 빠른 발전이 완전히 새로운 어플리케이션 생산

1.1.2. 컴퓨터 비전 시스템 자체를 만드는 것 못한다 해도, 컴퓨터 비전을 연구하는 단체가 그 동안 아주 창의적이고 아주 독창적으로 새로운 신경망 구조와 알고리즘을 이용해 일해 왔기 때문에 실제로 다른 부냐로도 교차 적용할 수 있도록 북돋워 준다는 것


1.2. Computer Vision Problems

1.2.1. Image Classification
Cat 구분

1.2.2. Object detection
자율 자동차에 물체 인식

1.2.3. Neural Style Transfer(신경 스타일 이동)
기존 사진을 다른 스타일의 이미지로 결합

 기존 강의에서 64 * 64 이미지에 3 rgb 채널을 사용하여 12288 feature가 됩니다.

하지만 64 * 64 이미지는 상당이 작은 이미지

만약 더 큰 이미지들로 작업을 하면

1000 * 100 * 3 = 300만입니다.

300만의 입력feature를 가지고 있다면 이는 곧 300만 차원일 것이라는 것을 의미합니다.

결국, 첫 번째 은닉 층에서 아마도 1000 은닉 층이 있을 것이고 그럼 총 무게가 W1매트릭스라는 것입니다.

만일 여러분이 기본 혹은 연결된 네트워크를 사용한다면, 이 매트릭스는 1000 x 3000000 차원의 매트릭스가 될 것입니다.

왜냐하면 X는 300만을 곱한 R이 되기 때문이죠. 3m, 300만 표시하기 위해 m을 사용하고 있습니다.
 이 매트릭스가 매우 매우 거대한 30억 파라미터에 이른다는 것이죠.

그리고 이 많은 파라미터로 신경망 네트워크가 과대 적합을 방지하도록 충분한 데이터를 얻는 것을 어렵습니다.

또한, 30억 파라미터를 가진 신경망을 단련하는 것에 대한 컴퓨터 요구사항과 메모리 요구사항은 실행불가능 합니다.

더 나은 회선 작업을 구현 해야 컨볼루션 신경망의 근본적 구성 요소 중의 하나이기도 하니까요.
edge detection의 예시를 통해 컨볼루션을 설명하도록 하겠습니다.

2019년 1월 17일 목요일

What is Reinforcement Learning?

Environment => State, Reward





Agent =>Action


2019년 1월 3일 목요일

005. Machine learning W1 05 Model Representation

Linear regression with one variable
Model representation

Supervised Learning
Given the "right answer" for each example in the data.

Regression Problem
Predict real-valued output


Training set




Learning Algorithm







Size of house ->       h         -> Estimated price

x              hypothesis                 (estimated value of y)

h maps from x's to y's


How do we represent h?

Linear regression with one variable.
Univariate linear regression.


Linear regression with one variable
Cost function




004. Machinelearing W1 04UnsupervisedLearning

Unsupervised Learning

- Organize computing clusters
- Social network analysis
- Market segmentation
- Astronomical data analysis


Cocktail party problem

Speaker1                    Microphone1




Speaker2                     Microphone2


[W,s,v] = svd((repmat(sum(x.*x,1),size(x,1),1).*x)*x');


Of the following examples, which would you address using an unsupervised learning algorithm?(Check all that apply.)

- Given email labeled as spam/not spam, learn a spam filter.

- Given a set of news articles found on the web, group them into set of articles about the same story.


- Give a database of customer data, automatically discover market segments and group customers into different market segments.

- Give a dataset of patients diagnosed as either having diabetes or not, learn to classify new patients as having diabetes or not.

2019년 1월 2일 수요일

003. Machine learning _W1_03_Supervised Learning

Introduction Supervised Learning


Housing price prediction.
Supervised Learning
"right answers" given



Regression: Predict continuous
valued output(price)


Breast cancer(malignant, benign)








Classification
Discrete valued output(0 or 1)

- Clump Thickness
- Uniformity of Cell Size
- Uniformity of Cell Shape
...

You're running a company, and you want to develop learning algorithms to address each of two problems.

Problem 1: You have a large inventory of identical items. You want to predict how many of these items will sell over the next 3 months.

Problem 2: You'd like software to examine individual customer accounts, and for each account decide if it has been hacked/compromised.

Should you treat these as classification or as regression problems?

a) Treat both as classification problems.

b) Treat problem 1 as a classification problem, problem 2 as a regression problem.

c) Treat problem 1 as a regression problem, problem 2 as a classification problem.  T

d) Treat both as regression problems.

001. Machine learning 01_Welcome

Machine Learning
 - Grew out of work in AI
 - New capability for computers

Example:
 - Database mining
    Large datasets from growth of automation/web.
    E.g., Web click data, medical records, biology, engineering

 - Applications can't program by hand.
    E.g., Autonomous helicopter, handwriting recognition, most of Natural Language Processing(NLP), Computer Vision.

 - Self-customizing programs
    E.g., Amazon, Netflix product recommendations

 - Understanding human learning(brain, real AI).


Machine Learning definition
- Arthur Samuel(1959). Machine Learning: Field of study that gives computers the ability to learn without being explicitly programmed.

- Tom Mitchell(1998) Well-posed Learning Problem: A computer program is said to learn from experience E with respect to some task T and some performance measure P, if its performance on T, as measured by P, improves with experience E.


Suppose your email program watches which emails you do or do not mark as spam, and based on that learns how to better filter spam. What is the task T in this setting?

a) Classifying emails as spam or not spam.              T

b) Watching you label emails as spam or not spam.         E

c) The number(or Fraction) of emails correctly classified as spam/not spam.    P

d) None of the above-this is not a machine learning problem.     



Machine learning algorithms:

-  Supervised learning
-  Unsupervised learning


Others: Reinforcement learning, recommender systems.

Also talk about: Practical advice for applying learning algorithms.