특수 함수 모음

BABY CAT·2022년 8월 20일
0

data

목록 보기
3/6

txt file load

with open('ratings_train.txt', "r") as f:
    train = f.read()
with open('ratings_test.txt', "r") as f:
    test = f.read()
with open('설명.txt',encoding='euc-kr') as f:
    설명 = f.read()
# encoding='cp949'

csv file load

data = pd.read_csv('data.csv')

colab_google.drive_mount

from google.colab import drive
drive.mount('/content/drive')

file delete

# 폴더 속 파일 지우기    
#코랩 구글 드라이브 업로드폴더 리셋
upload_file_path = "/content/drive/MyDrive/project/static/upload/upload/upload.jpg"
if os.path.exists(upload_file_path):
	os.remove(upload_file_path) # 업로드폴더에 파일을삭제

perceptron 프레임워크

from sklearn.linear_model import Perceptron
X = [ [0,0],[0,1],[1,0],[1,1] ]
y = [ 0,0,0,1 ]  # AND
y = [ 0,1,1,1 ]  # OR
y = [ 1,1,1,0 ]  # NAND
# XOR 불가능 : y = [ 0,1,1,0 ] 
p = Perceptron()
p.fit(X,y)
print(p.coef_) # 기울기
print(p.intercept_) # 절편
# XOR 은 NAND 와 OR 을 AND 연산해야 한다

perceptron def

# def AND

import numpy as np
# y=wx+b
def AND(x1,x2):
   #y=wx+b
   w1,w2=[1 , 1]
   X=np.array([x1,x2])
   W=np.array([w1,w2]) 
   b=-1.5
   t=np.sum(W*X)+b           #    x1 * w1  + x2 * w2  - 1.5 = ? 
   if t<= 0:                 #         1          1  
       return 0 #wx+b가음수  #    x1+x2-1.5
   else:
       return 1 #wx+b양수
print('AND')
print(AND(0,0))
print(AND(0,1))
print(AND(1,0))
print(AND(1,1))  #엔드 둘다1이니까 1로 작동
# 출력 0 0 0 1


# def OR

import numpy as np
# y=wx+b
def OR(x1,x2):
   #y=wx+b
   w1,w2=[1 , 1]
   X=np.array([x1,x2])
   W=np.array([w1,w2]) 
   b=-0.5
   t=np.sum(W*X)+b           # 
   if t<= 0:
       return 0 #wx+b가음수
   else:
       return 1 #wx+b양수
print('OR')
print(OR(0,0))
print(OR(0,1))  # 일이 하나있으니까 OR이니까 작동 1
print(OR(1,0)) # 일이 하나있으니까 OR이니까 작동 1
print(OR(1,1))
# 출력 0 1 1 1


# def NAND (AND에서 리턴값만 reverse)

import numpy as np
# y=wx+b
def NAND(x1,x2):
   #y=wx+b
   w1,w2=[1 , 1]
   X=np.array([x1,x2])
   W=np.array([w1,w2]) 
   b=-1.5
   t=np.sum(W*X)+b           
   if t<= 0:                 
       return 1 #wx+b가음수   
   else:
       return 0 #wx+b양수
print('NAND')
print(AND(0,0))
print(AND(0,1))
print(AND(1,0))
print(AND(1,1))   
# 출력 1 1 1 0 


# def XOR

# AND 는 둘다 1이면 1
# OR 은 하나라도 1이면 1
# NAND 는 AND 반대 ( 둘다 1이 아니면 1 ,둘다 1이면 0)
# XOR 은 1이 1개일 경우 1, 1이 0개 또는 2개일 경우 0 (1이 홀수면 1 , 1이 없거나 짝수면 0)   
# XOR = 베타적논리합 : 두가지 명제에서 한가지만 참인 경우를 말한다. 명제a만 참이거나 명제b만 참이거나
import numpy as np
# y=wx+b
def XOR(x1,x2):
   o1 = NAND(x1,x2)  #아웃원아웃투
   o2 = OR(x1,x2)
   return AND(o1,o2)
print('XOR')
print(XOR(0,0))
print(XOR(0,1))   
print(XOR(1,0))  
print(XOR(1,1))
# 결과 0 1 1 0
# def NAND 와 def OR 을 def AND 로 연산하여 XOR 을 구한다

perceptron 한 블록 정리

import numpy as np
#y=wx+b
def AND(x1,x2):
  #y=wx+b
  w1,w2=[0.42202853,0.42202853]
  X=np.array([x1,x2])
  W=np.array([w1,w2])
  b=-1.54273328
  t=np.sum(W*X)+b
  if t<=0:
    return 0
  else:
    return 1
def OR(x1,x2):
  #y=wx+b
  w1,w2=[1.0,1.0]
  X=np.array([x1,x2])
  W=np.array([w1,w2])
  b=-0.5
  t=np.sum(W*X)+b
  if t<=0:
    return 0
  else:
    return 1
def NAND(x1,x2):
  #y=wx+b
  w1,w2=[1.0,1.0]
  X=np.array([x1,x2])
  W=np.array([w1,w2])
  b=-1.5
  t=np.sum(W*X)+b
  if t<=0:
    return 1
  else:
    return 0
def XOR(x1,x2):
  o1=NAND(x1,x2)
  o2=OR(x1,x2)
  return AND(o1,o2)
print("AND")
print(AND(0,0))
print(AND(0,1))
print(AND(1,0))
print(AND(1,1))
print("OR")
print(OR(0,0))
print(OR(0,1))
print(OR(1,0))
print(OR(1,1))
print("NAND")
print(NAND(0,0))
print(NAND(0,1))
print(NAND(1,0))
print(NAND(1,1))
print("XOR")
print(XOR(0,0))
print(XOR(0,1))
print(XOR(1,0))
print(XOR(1,1))

XOR def

# 케라스프레임워크로 간단히 할 수 있지만 한번은 원리 파악 필요

# XOR class로 구현
# 입력층노드3개 -  은닉층노드6개 - 출력층노드1개

import numpy as np
#뉴런은노드의수로가중치의개수가결정된다
# 3 6 1

# 시그모이드 함수
def actf(x):
    return 1 / (1 + np.exp(-x))

# 시그모이드 함수의 미분값
def actf_deriv(x):
    return x * (1 - x)

# XOR 연산을 위한 4행*2열의 입력 행렬
# 마지막 열[1]은 바이어스값을 나타낸다.
X = np.array([[0, 0, 1], [0, 1, 1], [1, 0, 1], [1, 1, 1]])  #  00 01 10 11

# XOR 연산을 위한 4행*1열의 목표 행렬 # 0인지 1인지 출력이 1개니까 한개
y = np.array([[0], [1], [1], [0]])  # 0110 이니까 XOR 이 부분 0001로 바꾸면 AND

np.random.seed(5)

inputs = 3  # 입력층의 노드 개수
hiddens = 6  # 은닉층의 노드 개수
outputs = 1  # 출력층의 노드 개수

# 가중치를 –1.0에서 1.0 사이의 난수로 초기화한다.
weight0 = 2 * np.random.random((inputs, hiddens)) - 1 #입력층과 은닉층 사이의 웨이트
weight1 = 2 * np.random.random((hiddens, outputs)) - 1  #은닉층과 출력층 사이의 웨이트

# 반복한다.
for i in range(10000): # 백프로파게이션 자꾸 반복~
    # 순방향 계산           레이어0 입력층 , 레이어1: 은닉층 , 레이어2: 출력층
    layer0 = X  # 입력을 layer0에 대입한다.
    net1 = np.dot(layer0, weight0)  # 행렬의 곱을 계산한다.       #은닉층으로 들어갈 인풋에 웨이트 적용
    layer1 = actf(net1)  # 활성화 함수를 적용한다.                #은닉층에서 액티베이션펑션 적용
    layer1[:, -1] = 1.0  # 마지막 열은 바이어스를 나타낸다. 1.0으로 만든다.
    net2 = np.dot(layer1, weight1)  # 행렬의 곱을 계산한다        #은닉층에서 액티베이션펑션 적용되어 나온 것에 웨이트 적용
    layer2 = actf(net2)  # 활성화 함수를 적용한다.                #출력층에서 액티베이션펑션 적용 > 출력층아웃풋
    
    #layer2는프레딕트값이니까 아래 오차를 계산


##백프로파게이션과정

#로스게산
    # 출력층에서의 오차를 계산한다.
# layer2에러 : 은닉층과 출력층 사이의 오차값
    layer2_error = layer2 - y

    #가중치의갱신을위해역으로돌아간다 : 오차 역전파  백프로파게이션   오차역전파를 통해 가중치를 업데이트해서 학습

    #미분을하면줄어든다-많이하면-문제가생긴다-딥러닝의학습문제-(층이깊어지면문제 레이어를거치다
    #계속줄어서 사라진다 오차역전파가 전달이 안된다) 이걸보완하는법-
    #뒤로갈때 미분을 사용

#액티베이션펑션을미분한것으로뒤로가기
    # 출력층에서의 델타값을 계산한다.
    layer2_delta = layer2_error * actf_deriv(layer2)   # actf_deriv은 액티베이션펑션을 미분한 것 
   #레이어2델타로 아래서                                          #이게 미분
        #델타:오차곱하게엑티베이션평션미분~~~~

    # 은닉층에서의 오차를 계산한다.
    # 여기서 T는 행렬의 전치를 의미한다.수
    # 역방향으로 오차를 전파할 때는 반대방향이므로 행렬이 전치되어야 한다.

# layer1에러 : 입력층과 은닉층 사이의 오차값
    layer1_error = np.dot(layer2_delta, weight1.T)
                    #내적    입력층과 은닉층 사이의 오차값
#   입력층 -  은닉층  -  출력층
#         오차1     오차2
#두가지오차가 아래서 갱신된다 weight

    # 은닉층에서의 델타를 계산한다.
    layer1_delta = layer1_error * actf_deriv(layer1)


    # 은닉층->출력층을 연결하는 가중치를 수정한다.
    weight1 += -0.2 * np.dot(layer1.T, layer2_delta)  # 웨이트1은 은닉층과 출력층 사이의 웨이트,  레이어1은 은닉층 레이어2는 출력층
# -0.2는 그레디언트 학습률
    # 입력층->은닉층을 연결하는 가중치를 수정한다.
    weight0 += -0.2 * np.dot(layer0.T, layer1_delta) # 웨이트0은 입력층과 은닉층 사이의 웨이트
print(layer2)  # 현재 출력층의 값을 출력한다.
print(layer2>0.5)

# 출력
[[0.02391914]
 [0.9757925 ]
 [0.97343127]
 [0.03041428]]
[[False]     # 0
 [ True]     # 1
 [ True]     # 1
 [False]]    # 0

XOR deeplearning

# XOR 을 딥러닝모델로 풀기

# XOR 연산을 위한 4행*2열의 입력 행렬
# 마지막 열[1]은 바이어스값을 나타낸다.
import numpy as np
X = np.array([[0, 0, 1], [0, 1, 1], [1, 0, 1], [1, 1, 1]])  #  00 01 10 11
# XOR 연산을 위한 4행*1열의 목표 행렬 # 0인지 1인지 출력이 1개니까 한개
y = np.array([[0], [1], [1], [0]])  # 0110 이니까 XOR 이 부분 0001로 바꾸면 AND 

from tensorflow import keras
from tensorflow.keras import Sequential #모델
from tensorflow.keras.layers import Flatten , Dense #layer 층

m = Sequential() #모델선언

m.add(Flatten(input_shape=(3,)))   #     아래  d', input_shape=(3,) ) ) 인풋쉐입을 빼고 따로 인풋레이어를 설정하는 것

# 첫 레이어 첫 층     # input_shape=(3,)
m.add( Dense( 6, activation='sigmoid',  ) )  # 6: 은닉층 노드 수,  #인풋쉐입(입력은 0 0 1 모두3개짜리 하나가 입력),입력데이터피처수3개
# 출력 층
m.add( Dense( 1, activation='sigmoid' ) ) # 1 :출력층노드수 (아웃풋은 0또는1로 두개중 하나)

m.summary # 모델 정보 확인

#학습방법선언
m.compile(loss = 'binary_crossentropy' , metrics = 'acc') # acc:accuracy약어  #metrics(측정항복): 데이터를어떻게판단할것인가

#학습
m.fit(X,y, epochs=5000 )

m.predict(np.array([[0,0,1]])) # 0 , 0 이니까 0 에 가깝다

# m.summary()

0개의 댓글