텐서플로 처음할 때 자동완성이 없으면 하기 힘들기 때문에 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()