solstyle

공지 사항

temp 2020. 6. 1. 23:31 by solstyle

RNN 실습

  • 시계열 데이터를 RNN으로 돌려보자.
  •  

import tensorflow as tf

import numpy as np

 

#데이터 준비

file = "data-02-stock_daily.csv"

dataset = np.loadtxt(file, delimiter=",")

dataset = dataset[::-1]

 

#min max 만들기 - normalization

#각 열의 값을 그 열의 min값으로 빼주고 그 값을

dataset = (dataset - dataset.min(axis=0)) / (dataset.max(axis=0) - dataset.min(axis=0))

 

x = np.array(

[dataset[i : i + 7] for i in range(len(dataset) - 7 )]

)

y = np.array(

[dataset[i+7, -1:] for i in range(len(dataset) - 7)])

 

print(dataset.shape)

print(dataset[0])

print(x[0])

print(y[0])

print(x.shape)

print(y.shape)

print(y[-1])

 

x_train, x_test = x[:505], x[505:]

y_train, y_test = y[:505], y[505:]

print(x_train.shape, x_test.shape)

print(y_train.shape, y_test.shape)

 

 

#그래프그리기

tf.reset_default_graph()ou

 

X = tf.placeholder(tf.float32, shape = [None, 7, 5])

Y = tf.placeholder(tf.float32, shape = [None, 1])

 

cell = tf.nn.rnn_cell.BasicLSTMCell(10)

output, _ = tf.nn.dynamic_rnn(cell, X, dtype=tf.float32) # 실제 만드는것. state 를 받아서 사용하지 않기때문에 _로 줌

 

print(output.shape) #(?, 7, 10)



H = tf.reshape(output[:, -1 ,:], [-1,10]) # 7행 중에 맨 마지막 행을 가져와라. 2차원으로 reshape

W = tf.Variable(tf.random_normal(shape=[10,1]))

print(output[:, -1 ,:].shape)

print(H.shape)

B = tf.Variable(tf.random_normal(shape=[1]))

logit = tf.add(tf.matmul(H, W) , B)

 

loss = tf.reduce_mean(tf.square(Y - logit)) # MSE

optimizer = tf.train.AdamOptimizer(0.01).minimize(loss)

 

 

sess = tf.Session()

sess.run(tf.global_variables_initializer())

 

for e in range(1000):

sess.run(optimizer, feed_dict={X: x_train, Y: y_train})

if e % 100 == 0 :

print(sess.run(loss, feed_dict={X: x_train, Y: y_train}))

 

pred = sess.run(logit, feed_dict={X: x_test})

 

import matplotlib.pyplot as plt

 

plt.plot(pred)

plt.plot(y_test)

 

MNIST를 RNN으로

  • 분류 데이터를 RNN으로 돌려보자

import tensorflow as tf

 

(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()

 

x_train = x_train / 255

x_test = x_test / 255

 

y_train = tf.keras.utils.to_categorical(y_train)

y_test = tf.keras.utils.to_categorical(y_test)

print(x_train.shape)

print(y_train.shape)

# 그래프 그리기

tf.reset_default_graph()

 

X = tf.placeholder(tf.float32, shape=[None, 28, 28])

Y = tf.placeholder(tf.float32, shape=[None, 10])

 

cell = tf.nn.rnn_cell.BasicLSTMCell(100)

#cell = tf.nn.rnn_cell.BasicLSTMCell(28)

#cell = tf.nn.rnn_cell.MultiRNNCell([cell] * 2) # 똑같은 셀을 또 쌓는 법. input 갯수가 같아야해서 위cell 갯수를 28로 해야함.

output, _ = tf.nn.dynamic_rnn(cell, X, dtype=tf.float32)

 

# output shape => (None, 28, 100)

 

H = tf.reshape(output[:, -1, :], [-1, 100])

W = tf.Variable(tf.random_normal(shape=[100, 10]))

B = tf.Variable(tf.random_normal(shape=[10]))

logit = tf.add(tf.matmul(H, W), B)

 

loss = tf.nn.softmax_cross_entropy_with_logits_v2(logits=logit, labels=Y)

loss = tf.reduce_mean(loss)

optimizer = tf.train.AdamOptimizer(0.01).minimize(loss)

 

pred = tf.nn.softmax(logit)

acc = tf.equal(tf.argmax(pred, axis=1), tf.argmax(Y, axis=1))

acc = tf.reduce_mean(tf.cast(acc, tf.float32))

sess = tf.Session()

sess.run(tf.global_variables_initializer())

 

epochs = 10

batch = 128

n_batch = len(x_train) // batch

 

for e in range(epochs):

for b in range(n_batch):

x = x_train[b * batch:(b+1) * batch]

y = y_train[b * batch:(b+1) * batch]

sess.run(optimizer, feed_dict={X: x, Y: y})

 

if b % 20 == 0:

print(sess.run(acc, feed_dict={X: x_train, Y: y_train}))

 

 

sess.run(acc, feed_dict={X: x_test, Y: y_test})

 

 

keras - MNlist

  • keras 사용방법 두가지를 leanear 모델로 설명

from tensorflow import keras

import numpy as np

 

#데이터 준비

 

(x, y), (xx, yy) = keras.datasets.mnist.load_data()

x = x.reshape(-1,28*28) /255

xx = xx.reshape(-1,28*28) /255

 

#one_hot_encording : y 10개 컬럼에 1~9까지 숫자가 맞는지 아닌지를 0,1로 넣어주는 작업

y= keras.utils.to_categorical(y)

yy=keras.utils.to_categorical(yy)

 

print(x.shape, y.shape)

print(xx.shape, yy.shape)

#모델 만들기

model = keras.models.Sequential()

# model.add(keras.layers.Dense(

# 10, input_shape=(28*28, ), activation=keras.activations.softmax

# ))

#hiden layer에서는 relu Activation fuc를 쓰고

model.add(keras.layers.Dense(128, input_shape=(784, )))

model.add(keras.layers.BatchNormalization())

model.add(keras.layers.Activation(keras.activations.relu))

model.add(keras.layers.Dropout(0.2)) # 0.2를 끄고 돌려라, 평가는 자동으로 100

 

#output layer에서는 softmax Activation fuc를 쓴다

 

model.add(keras.layers.Dense(10)) # 최초에만 input_shape를 만들고 후에는 자동으로 맞춰줌

model.add(keras.layers.Activation(keras.activations.softmax))

 

# sigmoid 는 이진분류, 다중분류는 softmax activation function을 쓴다

#relu는 layer를 쓸때 쓰는 activation

model.compile(loss=keras.losses.categorical_crossentropy,

optimizer=keras.optimizers.Adam(lr=0.01),

metrics=[keras.metrics.categorical_accuracy])

 

model.summary()

# 7850 W (784,10) 784*10 + B 10 => 7850 개 param

 

model.fit(x, y, epochs=10,batch_size=256)

 

#평가

model.evaluate(xx,yy)

 

pred = model.predict(xx[1].reshape(-1, 784))

 

import matplotlib.pyplot as plt

plt.imshow(xx[1].reshape(28, 28))

print(np.argmax(pred))

print(np.argmax(yy[1]))

 

 

 

 

fashion mnist keras

 

 

from tensorflow import keras

import numpy as np

 

#데이터 준비

 

(x, y), (xx, yy) = keras.datasets.fashion_mnist.load_data()

print(x.shape, y.shape)

 

 

x = x.reshape(-1,28*28) /255

xx = xx.reshape(-1,28*28) /255

 

#one_hot_encording : y 10개 컬럼에 1~9까지 숫자가 맞는지 아닌지를 0,1로 넣어주는 작업

y= keras.utils.to_categorical(y)

yy=keras.utils.to_categorical(yy)

 

print(x.shape, y.shape)

print(xx.shape, yy.shape)

 

#모델 만들기

model = keras.models.Sequential()

# model.add(keras.layers.Dense(

# 10, input_shape=(28*28, ), activation=keras.activations.softmax

# ))

#hiden layer에서는 relu Activation fuc를 쓰고

model.add(keras.layers.Dense(128, input_shape=(784, )))

model.add(keras.layers.BatchNormalization())

model.add(keras.layers.Activation(keras.activations.relu))

#model.add(keras.layers.Dropout(0.2)) # 0.2를 끄고 돌려라, 평가는 자동으로 100

 

#output layer에서는 softmax Activation fuc를 쓴다

 

model.add(keras.layers.Dense(10)) # 최초에만 input_shape를 만들고 후에는 자동으로 맞춰줌

model.add(keras.layers.Activation(keras.activations.softmax))

 

# sigmoid 는 이진분류, 다중분류는 softmax activation function을 쓴다

#relu는 layer를 쓸때 쓰는 activation

model.compile(loss=keras.losses.categorical_crossentropy,

optimizer=keras.optimizers.Adam(lr=0.01),

metrics=[keras.metrics.categorical_accuracy])

 

model.summary()

model.fit(x, y, epochs=10,batch_size=128, validation_split=0.2 )

#batch 사이즈 줄이면 확률 높아짐

#validation_split 추가

 

model.history.history.keys()

import matplotlib.pyplot as plt

 

plt.plot(model.history.history['loss'])

plt.plot(model.history.history['categorical_accuracy'])

plt.legend(["loss","acc"])

 

 

plt.plot(model.history.history['val_loss'])

plt.plot(model.history.history['val_categorical_accuracy'])

 

#평가

model.evaluate(xx,yy)

 

pred = model.predict(xx[1].reshape(-1, 784))

 

import matplotlib.pyplot as plt

plt.imshow(xx[1].reshape(28, 28))

print(np.argmax(pred))

print(np.argmax(yy[1]))


BLOG main image
solstyle
From the Depth of My Drawer
by solstyle

카테고리

분류 전체보기 (56)
SolStorys (27)
temp (3)
SolBox (25)

태그목록

달력

«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
tistory!get rss Tistory Tistory 가입하기!

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백