콘텐츠로 이동

Subject Example

1절. 7장 과제

2절. 8장 과제

3절. 10장 과제

4절. 11장 과제

1절. 7장 과제

keras : MNIST

import matplotlib.pyplot as plt
import tensorflow as tf
import cv2 as cv

(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()

print(train_images.shape)

print(train_labels)
print(test_images.shape)

plt.imshow(train_images[0], cmap = "Greys")

model = tf.keras.models.Sequential()

model.add(tf.keras.layers.Dense(512, activation = 'relu', input_shape=(784,)))
model.add(tf.keras.layers.Dense(10, activation = 'sigmoid'))

model.compile(optimizer = 'rmsprop',
                loss = 'mse',
                metrics=['accuracy'])

train_images = train_images.reshape((60000, 784))
train_images = train_images.astype('float32') / 255.0
test_images = test_images.reshape((10000, 784))
test_images = test_images.astype('float32') / 255.0

train_labels = tf.keras.utils.to_categorical(train_labels)
test_labels = tf.keras.utils.to_categorical(test_labels)

model.fit(train_images, train_labels, epochs=5, batch_size=128)

test_loss, test_acc = model.evaluate(test_images, test_labels)
print('테스트 정확도 : ', test_acc)

history = model.fit(train_images, train_labels, epochs=5, batch_size=128)
loss = history.history['loss']
acc = history.history['accuracy']
epochs = range(1, len(loss)+1)

plt.plot(epochs, loss, 'b', label='Training Loss')
plt.plot(epochs, acc, 'r', label='Accuracy')
plt.xlabel('epochs')
plt.ylabel('loss/acc')
plt.show()

image = cv.imread('test.png', cv.IMREAD_GRAYSCALE)
image = cv.resize(image, (28, 28))
image = image.astype('float32')
image = image.reshape(1, 784)
image = 255-image
image /= 255.0

plt.imshow(image.reshape(28, 28),cmap='Greys')
plt.show()

pred = model.predict(image.reshape(1, 784), batch_size = 1)
print("추정 숫자 = ", pred.argmax())

DNN : MNIST

from tensorflow import keras
import tensorflow as tf
import matplotlib.pyplot as plt
import pandas as pd
import time


class_names = ["T-shirt/top", "Trouser", "Pullover", "Dress", "Coat", "Sandal", "Shirt", "Sneaker", "Bag", "Ankle boot"]

def load_data():

    (X_train_full, y_train_full), (X_test, y_test) = tf.keras.datasets.fashion_mnist.load_data()
    # 훈련 세트는 60,000개의 흑백 이미지
    # 각 이미지의 크기는 28x28 픽셀

    return X_train_full, y_train_full, X_test, y_test


def data_normalization(X_train_full, y_train_full, X_test):

    X_valid, X_train = X_train_full[:5000] / 255., X_train_full[5000:] / 255.
    y_valid, y_train = y_train_full[:5000], y_train_full[5000:]
    X_test = X_test / 255.

    return X_valid, X_train, y_valid, y_train, X_test


def show_oneimg(X_train):
    plt.figure()
    plt.imshow(X_train[0], cmap = "binary")
    plt.axis('off')


def show_40images(X_train, y_train):
    n_rows = 4
    n_cols = 10
    plt.figure(figsize=(n_cols * 1.2, n_rows * 1.2))
    for row in range(n_rows):
        for col in range(n_cols):
            index = n_cols * row + col
            plt.subplot(n_rows, n_cols, index + 1) # figure 안의 figure를 사용하는 함수
            plt.imshow(X_train[index], cmap = "binary", interpolation = "nearest")
            plt.axis('off')
            plt.title(class_names[y_train[index]], fontsize=12)
    plt.subplots_adjust(wspace=0.2, hspace=0.5)
    plt.show()


def makemodel(X_train, y_train, X_valid, y_valid):
    model = keras.models.Sequential()
    model.add(keras.layers.Flatten(input_shape = [28, 28]))
    # 입력층 (28 * 28 = 784)
    model.add(keras.layers.Dense(300, activation = "relu"))
    # 은닉층 1 : 300개
    model.add(keras.layers.Dense(100, activation = "relu"))
    # 은닉층 2 : 100개
    model.add(keras.layers.Dense(10, activation = "softmax"))
    # 출력층 : 10개

    # (784 * 300 + 300) + (300 * 100 + 100) + (100 * 10 + 10) = 266,610
    # 학습 필요 데이터

    model.summary()

    model.compile(loss = "sparse_categorical_crossentropy",
                  optimizer = "sgd",
                  metrics = ["accuracy"])

    # 시간 측정
    tb_hist = keras.callbacks.TensorBoard(log_dir = './graph',
                                          histogram_freq = 0,
                                          write_graph = True,
                                          write_images = True)
    start = time.time()
    history = model.fit(X_train, y_train, epochs = 10,
                        validation_data = (X_valid, y_valid),
                        callbacks = [tb_hist])
    print("time : ", time.time() - start)
    return model, history


def evalmodel(model, history, X_test, y_test):
    model.evaluate(X_test, y_test)

    X_new = X_test[:3]
    # 3개만 보여지는 데이터셋
    y_proba = model.predict(X_new).round(2)

    plt.figure(figsize = (7.2, 2.4))
    for index, image in enumerate(X_new):
        plt.subplot(1, 3, index + 1)
        plt.imshow(image, cmap = "binary", interpolation = "nearest")
        plt.axis('off')
        plt.title(class_names[y_test[index]], fontsize = 12)
    plt.subplots_adjust(wspace = 0.2, hspace = 0.5)

    pd.DataFrame(history.history).plot(figsize = (8, 5))
    plt.grid(True)
    plt.gca().set_ylim(0, 1)

def main():
    X_train_full, y_train_full, X_test, y_test = load_data()

    X_valid, X_train, y_valid, y_train, X_test = data_normalization(X_train_full, y_train_full, X_test)
    show_oneimg(X_train)
    show_40images(X_train, y_train)
    model, history = makemodel(X_train, y_train, X_valid, y_valid)
    evalmodel(model, history, X_test, y_test)
    plt.show()

main()

2절. 8장 과제

CNN : MNIST

from tensorflow.keras import Model
from tensorflow import keras
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Flatten
from tensorflow.keras.layers import Conv2D, MaxPooling2D
from tensorflow.keras.datasets import mnist
import matplotlib.pyplot as plt
import numpy as np
import time
import random

def load_data():

    (X_train_full, y_train_full), (X_test, y_test) = mnist.load_data()
    X_train_full = X_train_full.astype(np.float32)
    X_test = X_test.astype(np.float32)

    return X_train_full, y_train_full, X_test, y_test

def data_normalization(X_train_full, X_test):
    X_train_full = X_train_full / 255.

    X_test = X_test / 255.
    train_feature = np.expand_dims(X_train_full, axis=3)
    test_feature = np.expand_dims(X_test, axis=3)

    print(train_feature.shape, train_feature.shape)
    print(test_feature.shape, test_feature.shape)

    return train_feature,  test_feature


def draw_digit(num):
    for i in num:
        for j in i:
            if j == 0:
                print('0', end='')
            else :
                print('1', end='')
        print()


def makemodel(X_train, y_train, X_valid, y_valid, weight_init):
    model = Sequential()
    model.add(Conv2D(32, kernel_size=(3, 3), input_shape=(28, 28, 1), activation='relu'))
    # n1 = 32
    model.add(MaxPooling2D(pool_size=2))
    model.add(Conv2D(64, kernel_size=(3, 3), activation='relu'))
    # n2 = 64 = bias
    # 즉, 32 * 3 * 3 * 64 + 64
    model.add(MaxPooling2D(pool_size=2))
    model.add(Dropout(0.25))
    model.add(Flatten())
    model.add(Dense(128, activation = 'relu'))
    model.add(Dense(10, activation = 'softmax'))

    model.compile(loss = 'sparse_categorical_crossentropy',
                  optimizer = 'adam',
                  metrics = ['accuracy'])

    #tb_hist = keras.callbacks.TensorBoard(log_dir='./graph', histogram_freq=0, write_graph=True, write_images=True)
    start = time.time()
    history = model.fit(X_train, y_train, epochs = 10,
                        validation_data=(X_valid, y_valid)) #callbacks=[tb_hist])
    print("time :", time.time() - start)
    return model, history

def plot_history(histories, key='accuracy'):
    plt.figure(figsize=(16,10))

    for name, history in histories:
        val = plt.plot(history.epoch, history.history['val_'+key],
                       '--', label=name.title()+' Val')
        plt.plot(history.epoch, history.history[key], color=val[0].get_color(),
                 label=name.title()+' Train')

    plt.xlabel('Epochs')
    plt.ylabel(key.replace('_',' ').title())
    plt.legend()

    plt.xlim([0,max(history.epoch)])
    plt.show()

def draw_prediction(pred, k,X_test,y_test,yhat):
    samples = random.choices(population=pred, k=16)

    count = 0
    nrows = ncols = 4
    plt.figure(figsize=(12,8))

    for n in samples:
        count += 1
        plt.subplot(nrows, ncols, count)
        plt.imshow(X_test[n].reshape(28, 28), cmap='Greys', interpolation='nearest')
        tmp = "Label:" + str(y_test[n]) + ", Prediction:" + str(yhat[n])
        plt.title(tmp)

    plt.tight_layout()
    plt.show()

def evalmodel(X_test,y_test,model):
    yhat = model.predict(X_test)
    yhat = yhat.argmax(axis=1)

    print(yhat.shape)
    answer_list = []

    for n in range(0, len(y_test)):
        if yhat[n] == y_test[n]:
            answer_list.append(n)

    draw_prediction(answer_list, 16,X_test,y_test,yhat)

    answer_list = []

    for n in range(0, len(y_test)):
        if yhat[n] != y_test[n]:
            answer_list.append(n)

    draw_prediction(answer_list, 16,X_test,y_test,yhat)

def main():
    X_train, y_train, X_test, y_test = load_data()
    X_train, X_test = data_normalization(X_train,  X_test)

    #show_oneimg(X_train)
    #show_40images(X_train, y_train)

    model, history= makemodel(X_train, y_train, X_test, y_test,'glorot_uniform')

    evalmodel(X_test, y_test, model)
    plot_history([('baseline', history)])

main()

3절. 10장 과제

Simple RNN

import numpy as np
import tensorflow as tf
from keras.models import Sequential
from keras.layers import Dense, SimpleRNN, Activation

X = []
Y = []
for i in range(6):
    lst = list(range(i,i+4))
    X.append(list(map(lambda c: [c/10], lst)))
    Y.append((i+4)/10)
X = np.array(X)
Y = np.array(Y)
print(X)
print(Y)



model = Sequential()
#model.add(SimpleRNN(50,  return_sequences=False, input_shape=(4,1)))
model.add(SimpleRNN(20,  return_sequences = False, input_shape=(4,1)))
model.add(Dense(1))
model.summary()
model.compile(loss='mse',
              optimizer='adam',
              metrics=['accuracy'])
model.fit(X,Y,epochs=200,  verbose=2)
print(model.predict(X))

X_test = np.array([[[0.8],[0.9],[1.0],[1.1]]])
print(model.predict(X_test))

4절. 11장 과제

Compare RNN LSTM

import numpy as np
import tensorflow as tf
from keras.models import Sequential
from keras.layers import Dense, SimpleRNN, Activation, LSTM
import matplotlib.pyplot as plt
import pandas as pd

def make_data_increase_linear():
  trainX = []
  trainY = []
  testX= []
  testY = []
  for i in range(4):
      lst = list(range(i,i+4))
      trainX.append(list(map(lambda c: [c/10], lst)))
      trainY.append((i+4)/10)
  trainX = np.array(trainX)
  trainY = np.array(trainY)
  lst = list(range(i,i+4))
  testX.append(list(map(lambda c: [c/10], lst)))
  testY.append((i+4)/10)

  return trainX,trainY,testX,testY

# convert into dataset matrix
def convertToMatrix(data, step):
    X, Y = [], []
    for i in range(len(data) - step):
        d = i + step
        X.append(data[i:d, ])
        Y.append(data[d, ])
    return np.array(X), np.array(Y)

def make_data_random_sin():
  # 데이터 생성
  N = 1000
  Tp = 800
  step = 4
  t = np.arange(0, N)
  x = np.sin(0.2*t) + 0.5 * np.random.rand(N)  # 노이즈 추가된 SIN 파
  df = pd.DataFrame(x)

  # Train/Test 데이터 분리
  values = df.values
  train, test = values[:Tp], values[Tp:]

  # 데이터 자르기
  train = np.append(train, np.repeat(train[-1], step))
  test = np.append(test, np.repeat(test[-1], step))
  trainX, trainY = convertToMatrix(train, step)
  testX, testY = convertToMatrix(test, step)

  # 데이터 Reshape
  trainX = np.reshape(trainX, (trainX.shape[0], trainX.shape[1],1))
  testX = np.reshape(testX, (testX.shape[0], testX.shape[1], 1))
  return trainX, trainY, testX,testY

def plot_history(histories):
  plt.figure(figsize=(16,10))


  for name, history in histories:
    plt.plot(history.epoch, history.history['loss'],label=name.title())

  plt.xlabel('Epochs')
  plt.legend()

  plt.xlim([0,max(history.epoch)])
  plt.show()


def makemodel(model_name,trainX, trainY, stacked_size):

  model = Sequential()
  #model.add(SimpleRNN(50,  return_sequences=False, input_shape=(4,1)))
  if stacked_size > 1 :
     for i in range(stacked_size) :
         model.add(model_name(20,  return_sequences=True, input_shape=(4,1)))
  model.add(model_name(20,  return_sequences=False, input_shape=(4,1)))
  model.add(Dense(1))
  model.summary()
  model.compile(loss='mse',
                optimizer='adam',
                metrics=['accuracy'])
  hist = model.fit(trainX,trainY,epochs=100)
  return model, hist

#단순히 0.1씩 증가 하는 데이터
#trainX, trainY, testX, testY =  make_data_increase_linear()

#sin 함수에 랜덤 값을 추가한 데이터
trainX, trainY, testX, testY =  make_data_random_sin()

model_simpleRNN, hist_simpleRNN = makemodel(SimpleRNN, trainX,  trainY, 1)

model_LSTM, hist_LSTM = makemodel(LSTM, trainX, trainY, 1)

model_stackeRNN, hist_stackeRNN = makemodel(SimpleRNN, trainX, trainY, 3)

X_test = np.array([[[0.8],[0.9],[1.0],[1.1]]])

print(model_simpleRNN.predict(X_test))
print(model_LSTM.predict(X_test))
print(model_stackeRNN.predict(X_test))


plot_history([('SimpleRNN', hist_simpleRNN),('SimpleLSTM', hist_LSTM),('StackedRNN', hist_stackeRNN)])