Search

반응형

'신기한연구소'에 해당되는 글 287건

  1. 2024.12.17 [딥러닝]NAND, OR 게이트와 퍼셉트론 활용한 파이썬 코드 작성하는 방법, 인공지능 AI 초보 개발자
  2. 2023.09.24 [JSP]실행하면 저장이 되는 jsp파일/ 해결법 중 하나 발견.
반응형

이전 포스팅에서 논리 회로 중 AND 게이트와 퍼셉트론(Perceptron)을 활용하는 방법에 대해 쉽게 설명했다.

아래 포스팅을 참조하면 된다.

2024.12.10 - [인공지능(AI)/딥러닝(DeepLearning)] - [딥러닝]인공지능 초보 개발자면 퍼셉트론과 AND 게이트 활용 방법은 알고 가자, 쉬운 설명.

 

[딥러닝]인공지능 초보 개발자면 퍼셉트론과 AND 게이트 활용 방법은 알고 가자, 쉬운 설명.

음식도 맛있고 양도 많은데 가격까지 저렴하다면 우리는 가성비가 좋다고 표현한다.음식과 가격 둘 다 만족해야 가성비라는 표현을 쓴다.이 중 하나라도 맘에 안들면 가성비가 좋다고 하지 않

tiboy.tistory.com

딥러닝을 공부하는 개발자라면 논리 연산이 AND 외 더 있다는 것을 알고 있다.

NAND, OR 그리고 XOR 게이트가 더 있다.

XOR 게이트는 인공지능에 한 걸음 더 나가가는 특별한 경우라 따로 설명하겠다.

 

AND 게이트와 퍼셉트론 활용에 이어 이번 포스팅은 NAND 게이트와 OR 게이트에 대해 쉽게 설명해 본다.

AI 개발자가 되기 위해  출발해 봅시다.

준비되었나요?

 

NAND 게이트와 퍼셉트론 활용

NAND는 무슨 의미일까?

낸드라고 읽는데 어디서 들어본 듯하다.

"낸드"로 검색하면 반도체 관련 뉴스를 볼 수 있다. 

그 뉴스에서 "낸드플래시"라는 용어를 많이 볼 수 있는데 그 낸드가 NAND다.

NAND는 "Not AND"다.

"Not"이 붙은 의미는 반대라고 생각하자.

AND 게이트의 값을 반대로 출력한다. 

AND 게이트 진리표를 표로 다시 확인해 보자.

x1 x2 y
0 0 0
1 0 0
0 1 0
1 1 1

NAND 게이트는 출력값이 반대로 나온다고 했다.

이제 NAND 게이트 진리표를 표로 정리해 보자.

x1 x2 y
0 0 1
1 0 1
0 1 1
1 1 0

x1과 x2가 하나 이상 0일 때 AND 게이트는 0이었지만 NAND는 1이다.

x1과 x2가 모두 1일 때 AND 게이트는 1이었지만 NAND는 0이다.

이제 가중치와 임계값을 정해보자.

(w1, w2, 𝞱)0 : x1w1 + x2w2 <= 𝞱 1: x1w1 + x2w2 > 𝞱

AND 게이트와 퍼셉트론에서 봤던 계산식과 기호들이다.

기억을 되살려보자.

w1 = 0.7, w2 = 0.3, 𝞱 = 0.9

AND 게이트의 x1, x2 값 (0, 0)인 경우부터 순서대로 식에 대입해 보자.

0 * 0.7 + 0 * 0.3 = 0 은 0.9보다 작거나 같은 조건이므로 (<=) 0.

1 * 0.7 + 0 * 0.3 = 0.7 은 0.9보다 작거나 같은 조건이므로 (<=) 0.

0 * 0.7 + 1 * 0.3 = 0.3 은 0.9보다 작거나 같은 조건이므로 (<=) 0.

1 * 0.7 + 1 * 0.3 = 1.0 은 0.9보다 크므로 (>) 1.

위 가중치와 임계값은 AND 게이트용이다.

NAND 출력값은 AND의 반대라고 했다.

위 가중치와 임계값에 마이너스 부호를 붙이면 NAND 게이트를 만족한다.

w1 = -0.7, w2 = -0.3, 𝞱 = -0.9

0 * -0.7 + 0 * -0.3 = 0 은 -0.9 보다 크므로 (>) 1.

1 * -0.7 + 0 * -0.3 = -0.7 은 -0.9 보다 크므로 (>) 1.

0 * -0.7 + 1 * -0.3 = -0.3 은 -0.9 보다 크므로 (>) 1.

1 * -0.7 + 1 * -0.3 = -1.0 은 -0.9보다 작거나 같은 조건이므로 (<=) 0.

 

OR 게이트와 퍼셉트론 활용

이제 OR 게이트도 같은 방식으로 알아보자.

우리말로 "또는, 둘 중 하나"로 해석하면 된다.

둘 중 하나 이상이 true(1) 면 1을 출력한다.

OR 게이트 진리표를 표로 정리해 보자.

x1 x2 y
0 0 0
1 0 1
0 1 1
1 1 1

x1과 x2가 둘 중 1개 이상 1일 때 OR는 1이다.

x1과 x2가 모두 0일 때 OR는 0이다.

OR 게이트 입력 매개변수는 다음처럼 설정하면 된다.

w1 = 0.7, w2 = 0.3, 𝞱 = 0.2 는 OR 게이트용 가중치와 임계값이다.

위 가중치와 임계값은 OR 게이트를 만족한다.

0 * 0.7 + 0 * 0.3 = 0 은 0.2 보다 작거나 같은 조건이므로 (<=) 0.

1 * 0.7 + 0 * 0.3 = 0.7 은 0.2 보다 크므로 (>) 1.

0 * 0.7 + 1 * 0.3 = 0.3 은 0.2  보다 크므로 (>) 1.

1 * 0.7 + 1 * 0.3 = 1.0 0.2  보다 크므로 (>) 1.

가중치와 임계값을 조정할 수 있다는 것을 알았다.

 

논리 회로, 퍼셉트론 활용을 파이썬으로 구현하는 방법

이론 이야기를 했으니 파이썬을 사용해서 직접 코딩해 보자.

아나콘다(파이썬)가 설치된 VSCode(Visual Studio Code)를 사용했다.

 

AND 게이트 함수 만들기

아래 코드를 살펴보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import numpy as np
 
def AndGate(x1, x2):
    xn = np.array([x1, x2])
    wn = np.array([0.70.3])
    theta = 0.9
 
    sumData = np.sum(wn*xn)
    if sumData <= theta:
        return 0
    else:
        return 1
    
 
 
print(AndGate(0,0))
print(AndGate(1,0))
print(AndGate(0,1))
print(AndGate(1,1))
cs

1번 라인은 numpy를 import 했다.

numpy 내부 함수 array와 sum을 사용할 것이다.

3번 라인에서 AndGate 함수를 선언했다. x1과 x2를 입력받는다.

4번 라인은 x1, x2를 numpy 내부 array함수에 세팅한다.

5번 라인은 w1, w2 값인 0.7, 0.3을 마찬가지로 내부 array 함수에 세팅한다.

6번은 theta( 𝞱)값을 0.9로 할당했다.

8번 라인은 4, 5번 라인 array 값들의 합을 sum 함수로 계산하고 sumData에 할당한다.

9번~ 12번은 sumData 값이 theta값보다 작거나 같으면(<=) 0 아니면 1을 출력한다.

16번부터 AND 게이트 입력값을 넣으면 같은 결과가 나온다.

결과 ( 0, 0, 0, 1)

NAND 게이트 함수 만들기.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import numpy as np
 
def NAND_GATE(x1, x2):
    w1, w2, theta = -0.7-0.3-0.9
    sumData = w1*x1 + w2*x2
    
    if sumData <= theta:
        return 0
    elif sumData > theta:
        return 1
    
 
 
print(NAND_GATE(0,0))
print(NAND_GATE(1,0))
print(NAND_GATE(0,1))
print(NAND_GATE(1,1))
cs

4번 라인에 NAND 게이트 가중치와 임계값을 세팅했다.

결과는 (1, 1, 1, 0)로 NAND 게이트와 일치한다.

 

OR 게이트 함수 만들기.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import numpy as np
 
def OrGate(x1, x2):
    xn = np.array([x1, x2])
    wn = np.array([0.70.3])
    theta = 0.2
 
    sumData = np.sum(wn*xn)
    if sumData <= theta:
        return 0
    else:
        return 1
    
 
 
print(OrGate(0,0))
print(OrGate(1,0))
print(OrGate(0,1))
print(OrGate(1,1))
cs

이번 포스팅의 마지막 소스 OR 게이트 구현이다.

OR 게이트 구현을 위해 theta( 𝞱)값에 0.2를 할당했다.

결과는 (0, 1, 1, 1)이다.

 

지금까지 NAND와 OR 게이트를 퍼셉트론에 활용하는 내용을 알아봤다.

해당 부분을 파이썬 코드로 구현도 했다.

딥러닝 다음 편은 XOR 게이트에 대해 알아본다.

XOR 게이트는 약간 다르다.

AI 개발자로 한걸음 더 다가섰다.

끝.

반응형
반응형

구독하면 필요한 정보를 받을 수 있어요!

안녕하세요 신기한 연구소입니다.

 

1. 증상

최근 개발하다가 이상한 현상을 발견했습니다. 제목처럼 jsp파일을 브라우저에서 다음과 같이 호출했는데 jsp파일이 저장되는 상황이 발생했습니다.



http://localhost:8080/test.jsp

 

<%
	out.print("Hello!");
%>

 

이렇게 test.jsp를 생성하고 서버 Start 후 실행을 하면 브라우저에 "Hello!"가 보여야 하는데 test.jsp 파일이 다운로드가 됩니다. 그래서 구글링, 네이버 등 검색을 해서 다양한 해결 방법을 찾아봤습니다.

 

2. 시도한 방법들

파일명에 "-"를 제거해서 해결한 경우도 있고

빌드에서 설정을 바꿔서 해결한 경우도 있고

tomcat-embed-jasper와 tomcat의 두 버전이 일치하면 해결된다고 하고

Implementation의 오타를 찾아서 해결한 경우도 있고

서버를 재시작해서 성공한 경우도 있고

<@page contentType...%> 설정을 최상단으로 이동해서 해결된 경우도 있었답니다.

하지만 이 모든 것을 해봐도 계속 jsp 파일이 실행이 안되고 다운로드가 되더군요.

 

3. 특이한 점

우연히 다운로드 한 jsp 파일을 열어봤습니다. 그런데 jsp 파일이 실행이 되어있더군요.

무슨 말이냐면 jsp 파일이 다운로드가 되긴 했지만 실행한 결과가 기록되어 있었습니다.

실행이 안되고 다운로드가 된 test.jsp 파일을 열어보니 코딩된 소스가 있는 것이 아니고 실행 결과인 Hello! 가 타이핑되어 있었습니다. 헐헐헐~

결국 실행은 되는데 우리가 원하는 페이지로 열리는 것이 아니라 결과를 jsp 파일로 받게 된 것이었습니다.

 

4. 해결

그렇다면 설정에서 문제를 찾을 수 있다는 결론을 내렸습니다. 소스를 다시 확인해 봤습니다.  

<%@page language="java" contentType="application/x-www-form-urlencoded; charset=UTF-8"%>

"contentType"이 "application/x-www-form-urlencoded"로 되어있더군요. 물론 기존 개발자가 코딩한 소스입니다. 그래서 검색해 보니 예전에 form 데이터 전송을 위해 사용한 타입이라고 합니다. "key=value&key=value"형식으로 key와 value를 전달하는 구조입니다. json과 약간 다릅니다. (json은 {key:value, key:value})

데이터 전송을 위한 타입이라는 의미로 그래서 jsp가 실행되고 결과를 jsp로 넘겨준 뒤 브라우저에서 다운로드가 된 것으로 보입니다.

"contentType"을 "application/json"으로 변경 후 테스트하니 더 이상 다운로드 되지 않고 브라우저에서 실행이 됩니다.

 

5. 결론

잘 되니 그대로 사용할까 했지만 기존에 개발되었고 잘 사용하고 있던 소스여서 우선 그대로 두고 다운 받은 jsp를 열어 결과를 확인해도 되지만 불편하더군요.

같은 파일을 복사한 후 contentType을 변경해서 작업 중입니다.

혹시 다양한 방법을 시도했음에도 jsp 파일이 실행 안되고 다운로드가 된다면 contentType을 변경해 보세요.

 

내일도 출근해서 즐거운 코딩을 하고 싶지만, 출근하는 그 자체는 즐겁지가 않네요..ㅎㅎㅎ

공감하면 하트~!

 

반응형