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]))