카테고리 없음

텐서플로 # RNNBasic_1

쿠와와 2020. 11. 25. 18:12

텐서플로 처음할 때 자동완성이 없으면 하기 힘들기 때문에 tensorflow 버전을 1.14로 맞춰주세요.

 

# 텐서 플로를 이용해서 내부적 동작을 공부할 것
import tensorflow as tf
import numpy as np
import csv

np.set_printoptions(linewidth=1000)     # np 한개에 1000개씩 출력하는 것

# import pandas as pd
# from sklearn import preprocessing

# 1.14 버전 설치
# 최신 버전 2.3 -> 문제 RNN 동작 과정을 보여줘야하는데 2.3은 자동 완성이 안됨

# 텐서플로 4가지 알고리즘     문제가 나왔을 때 밑에 4가지 중 하나 선택해서 ㄱㄱ
# 리니어 리그레션, 멀티플 리그레션
# 로지스틱 리그레션, 소프트맥스 리그레션     우리는 소프트맥스 리그레션(여러가지 중 하나의 정답)할꺼임
# RNN은 여라가지 중에서 여러가지를 찾음
# 나중에 깊은 과정에 들어 갔을 때 살을 붙임


def review_softmax():
    # iris 데이터 파일을 읽어서 x와 y로 분리해서 반환하는 함수를 만드세요
    def get_data():
        f = open('./data/iris.csv', 'r', encoding='utf-8')
        f.readline()
        onehot = {
            'setosa': [1, 0, 0],
            'versicolor': [0, 1, 0],
            'virginica': [0, 0, 1]
        }

        x, y = [], []
        for row in csv.reader(f):
            x.append([float(v) for v in row[1:-1]])
            y.append(onehot[row[-1]])

        f.close()
        # print(*x[:3], sep='\n')
        # print(*y[:3], sep='\n')
        return x, y
        # df = pd.read_csv('./data/iris.csv', index_col=0)
        #
        # x = []
        # for index in df.values[:, : -1]:
        #     ind = []
        #     for i in index:
        #         ind.append(float(i))
        #     x.append(ind)
        # print(*x, sep='\n')
        #
        # # e1 = preprocessing.LabelEncoder()  # 그냥 단순 인코딩 해줌
        # e2 = preprocessing.LabelBinarizer()
        #
        # y = e2.fit_transform(df.Species.values)
        # # c = e2.fit_transform(df.Species)
        # print(y)
        # return x, y

    x, y = get_data()

    # 변수 만들기
    w = tf.Variable(tf.random.uniform([4, 3]))   # 데이터수, 항목 수
    b = tf.Variable(tf.random.uniform([3]))      # 항목 수

    # y = wx + b
    # y = w1 * x1 + w2 * x2 + w3 * x3 + b
    # (150, 3) = (150, 4) @ (4, ?) 이런식으로 계산 되어야 함 ?는 y값에 따라 달라짐

    # 모델 만들기
    z = tf.matmul(x, w) + b     # 행렬 연산 계산

    # 예측하기
    hx = tf.nn.softmax(z)

    # 정답까지의 거리 계산   cro 쓰고 골라서 쓰면됨
    # 손실 함수
    # 111
    # 공식 api보다 low level임
    loss_i = tf.nn.softmax_cross_entropy_with_logits_v2(logits=z, labels=y)
    loss = tf.reduce_mean(loss_i)

    # 경사 하강법
    # optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1)
    # v2 나와서 이런식으로 써야함
    # 가장 기본적인 강사 하강법
    optimizer = tf.compat.v1.train.GradientDescentOptimizer(learning_rate=0.1)
    # 222
    # 전체 골격
    train = optimizer.minimize(loss=loss)

    sess = tf.compat.v1.Session()
    sess.run(tf.compat.v1.global_variables_initializer())

    # 이제 공부할 차례
    for i in range(1000):
        sess.run(train)     # train 이라는 연산 111 ~ 222 까지의 과정을 함 즉 w, b를 업데이트 함
        # print(i, sess.run(loss))    # 손실 함수를 이용해서 검사해봄  손실함수가 줄어들면 정답에 가까워지는 것

    # 정확도 프리딕션해봐야함
    preds = sess.run(hx)
    print(preds)
    print(preds.shape)  # 150, 3 (각각 항목 1,2,3)

    # 이제 문제를 알아봐야함
    preds_arg = np.argmax(preds, axis=1)    # 가장 큰 값 항목을 찾아줌
    print(preds_arg)    # 분석 완료

    # 정답과 비교
    y_arg = np.argmax(y, axis=1)
    print(y_arg)

    equals = (preds_arg == y_arg)
    print(equals)

    print('acc :', np.mean(equals))
    sess.close()

# review_softmax():
# 모두의 딥러닝을 시청해보면
# char rnn:     글자 하나로 작업   char을 토큰으로 만들어서 진행
# word rnn:     단어 하나로 작업   word를 토큰으로 만들어서 진행
# time series: 시계열
# RNN softmax랑 유사
# grove
# g -> r
# r -> o
# o -> v
# v -> e
# e -> ?    # y 데이터 없음

# 오늘 그로브 카페에 가서 공부했다
# 오늘 -> 그로브
# 그로브 -> 카페에
# 카페에 -> 가서
# 가서 -> 공부했다
# 공부했다 -> y 데이터 없음
# RNN 과 softmax의 차이점 -> s가 현재 입력이라면, 그 다음에 올 글자는 ?
# softmax는 정답이 하나로 정해저 있음
# tensor -> o
# smile -> m
# boss -> s
# RNN( 자연어 처리 )
# 어떤 말이 나와도 정답일 가능성이 높음


# 문제
# tensor(임의의 단어) <- 중복된 단어가 없음 x와 y를 만들어서 소프트맥스 리그레션 모델을 구성하세요
def rnn_basic_1():
    # x : tenso     => 내 맘대로
    # y : ensor     => 정해져 있음

    # x 정렬 -> enorst
    x = [
        [0, 0, 0, 0, 0, 1],     # t
        [1, 0, 0, 0, 0, 0],     # e
        [0, 1, 0, 0, 0, 0],     # n
        [0, 0, 0, 0, 1, 0],     # s
        [0, 0, 1, 0, 0, 0],     # o
    ]
    y = [
        [1, 0, 0, 0, 0, 0],     # e
        [0, 1, 0, 0, 0, 0],     # n
        [0, 0, 0, 0, 1, 0],     # s
        [0, 0, 1, 0, 0, 0],     # o
        [0, 0, 0, 1, 0, 0],     # r
    ]
    x = np.float32(x)
    # 변수 만들기
    w = tf.Variable(tf.random.uniform([6, 6]))  # 데이터수 피처, 항목 수 클래스
    b = tf.Variable(tf.random.uniform([6]))  # 항목 수

    # y = wx + b
    # y = w1 * x1 + w2 * x2 + w3 * x3 + b
    # (5, 6) = (5, 6) @ (6, 6) 이런식으로 계산 되어야 함 ?는 y값에 따라 달라짐

    # 모델 만들기
    z = tf.matmul(x, w) + b  # 행렬 연산 계산

    # 예측하기
    hx = tf.nn.softmax(z)

    # 정답까지의 거리 계산   cro 쓰고 골라서 쓰면됨
    # 손실 함수
    # 111
    # 공식 api보다 low level임
    loss_i = tf.nn.softmax_cross_entropy_with_logits_v2(logits=z, labels=y)
    loss = tf.reduce_mean(loss_i)

    # 경사 하강법
    # optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1)
    # v2 나와서 이런식으로 써야함
    # 가장 기본적인 강사 하강법
    optimizer = tf.compat.v1.train.GradientDescentOptimizer(learning_rate=0.1)
    # 222
    # 전체 골격
    train = optimizer.minimize(loss=loss)

    sess = tf.compat.v1.Session()
    sess.run(tf.compat.v1.global_variables_initializer())

    # 이제 공부할 차례
    for i in range(100):
        sess.run(train)  # train 이라는 연산 111 ~ 222 까지의 과정을 함 즉 w, b를 업데이트 함
        # print(i, sess.run(loss))    # 손실 함수를 이용해서 검사해봄  손실함수가 줄어들면 정답에 가까워지는 것

    # 정확도 프리딕션해봐야함
    preds = sess.run(hx)
    print('-' * 30)
    # 이제 문제를 알아봐야함
    preds_arg = np.argmax(preds, axis=1)  # 가장 큰 값 항목을 찾아줌
    print(preds_arg)  # 분석 완료

    word = 'enorst'
    print([i for i in preds_arg])
    print([word[i] for i in preds_arg])

    word = np.array(list('enorst'))
    print(word[preds_arg])
    sess.close()


rnn_basic_1()