빅데이터분석 특강 기말고사 예상문제
- imports
- 1. Fashion_mnist, DNN (30점)
- 2. Fashion_mnist, CNN (30점)
- 3. CIFAR10 (30점)
- 4. 다음을 읽고 물음에 답하라. (10점)
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
import tensorflow.experimental.numpy as tnp
tnp.experimental_enable_numpy_behavior()
%load_ext tensorboard
import graphviz
def gv(s): return graphviz.Source('digraph G{ rankdir="LR"'+ s + ';}')
(1)
tf.keras.datasets.fashion_mnist.load_data()
을 이용하여 fashion_mnist 자료를 불러온 뒤 아래의 네트워크를 이용하여 적합하라.
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.fashion_mnist.load_data()
x_train.shape, y_train.shape, x_test.shape, y_test.shape
X = tf.constant(x_train.reshape(-1,28,28,1),dtype=tf.float64)
y = tf.keras.utils.to_categorical(y_train)
XX = tf.constant(x_test.reshape(-1,28,28,1),dtype=tf.float64)
yy = tf.keras.utils.to_categorical(y_test)
- 평가지표로 accuracy를 이용할 것
- epoch은 10으로 설정할 것
- optimizer는 adam을 이용할 것
gv('''
splines=line
subgraph cluster_1{
style=filled;
color=lightgrey;
"x1"
"x2"
".."
"x784"
label = "Layer 0"
}
subgraph cluster_2{
style=filled;
color=lightgrey;
"x1" -> "node1"
"x2" -> "node1"
".." -> "node1"
"x784" -> "node1"
"x1" -> "node2"
"x2" -> "node2"
".." -> "node2"
"x784" -> "node2"
"x1" -> "..."
"x2" -> "..."
".." -> "..."
"x784" -> "..."
"x1" -> "node20"
"x2" -> "node20"
".." -> "node20"
"x784" -> "node20"
label = "Layer 1: relu"
}
subgraph cluster_3{
style=filled;
color=lightgrey;
"node1" -> "node1 "
"node2" -> "node1 "
"..." -> "node1 "
"node20" -> "node1 "
"node1" -> "node2 "
"node2" -> "node2 "
"..." -> "node2 "
"node20" -> "node2 "
"node1" -> "... "
"node2" -> "... "
"..." -> "... "
"node20" -> "... "
"node1" -> "node30 "
"node2" -> "node30 "
"..." -> "node30 "
"node20" -> "node30 "
label = "Layer 2: relu"
}
subgraph cluster_4{
style=filled;
color=lightgrey;
"node1 " -> "y10"
"node2 " -> "y10"
"... " -> "y10"
"node30 " -> "y10"
"node1 " -> "y1"
"node2 " -> "y1"
"... " -> "y1"
"node30 " -> "y1"
"node1 " -> "."
"node2 " -> "."
"... " -> "."
"node30 " -> "."
label = "Layer 3: softmax"
}
''')
tf.random.set_seed(1213)
!rm -rf logs
net = tf.keras.Sequential()
net.add(tf.keras.layers.Flatten())
net.add(tf.keras.layers.Dense(20,activation='relu'))
net.add(tf.keras.layers.Dense(30,activation='relu'))
net.add(tf.keras.layers.Dense(10,activation='softmax'))
net.compile(optimizer='adam',loss=tf.losses.categorical_crossentropy,metrics='accuracy')
net.fit(X,y,epochs=10,batch_size=200)
net.summary()
(2)
(1)에서 적합된 네트워크를 이용하여 test data의 accuracy를 구하라.
net.evaluate(XX,yy)[1]
(3)
train set에서 20%의 자료를 validation 으로 분리하여 50에폭동안 학습하라. 텐서보드를 이용하여 train accuracy와 validation accuracy를 시각화 하고 결과를 해석하라. 오버피팅이라고 볼 수 있는가?
tf.random.set_seed(1213)
!rm -rf logs
net = tf.keras.Sequential()
net.add(tf.keras.layers.Flatten())
net.add(tf.keras.layers.Dense(20,activation='relu'))
net.add(tf.keras.layers.Dense(30,activation='relu'))
net.add(tf.keras.layers.Dense(10,activation='softmax'))
net.compile(optimizer='adam',loss=tf.losses.categorical_crossentropy,metrics='accuracy')
cb1 = tf.keras.callbacks.TensorBoard()
net.fit(X,y,epochs=50,batch_size=200,validation_split=0.2,callbacks=cb1,verbose=1)
%tensorboard --logdir logs --host 0.0.0.0
train accuracy보다validation accuracy accuracy가 0.01정도 높게 나왔다.
우리의 목적은 validation accuracy가 더 좋게 나오길 원하는 것이었다.
training loss와 같이 validation loss도 줄어들고 있었다.
비록 중간에 조금 상승하는 구간이 보이지만 결국 training loss와 비슷한 값에 수렴했다.(0.01 정도 차이)
오버피팅은 아니다.
(4)
(3)에서 적합된 네트워크를 이용하여 test data의 accuracy를 구하라. (2)의 결과와 비교하라.
net.evaluate(XX,yy)[1]
validation을 split하여 training하니 정확도가 높아졌다.
20%의 validation을 제외한 training data로 학습을 한 것보다 20%의 validation의 loss가 더 낮아지는 결과가 도출되었다.
(3)의 결과에서 알 수 있듯이 오버피팅의 징조가 보이니 validation split을 한 network는 좋은 net을 설계했다고 볼 수 없겠다.
(5)
조기종료기능을 이용하여 (3)의 네트워크를 다시 학습하라. 학습결과를 텐서보드를 이용하여 시각화 하라.
- patience=3 으로 설정할 것
tf.random.set_seed(1213)
!rm -rf logs
net = tf.keras.Sequential()
net.add(tf.keras.layers.Flatten())
net.add(tf.keras.layers.Dense(20,activation='relu'))
net.add(tf.keras.layers.Dense(30,activation='relu'))
net.add(tf.keras.layers.Dense(10,activation='softmax'))
net.compile(optimizer='adam',loss=tf.losses.categorical_crossentropy,metrics='accuracy')
cb1 = tf.keras.callbacks.TensorBoard()
cb2 = tf.keras.callbacks.EarlyStopping(patience=3)
net.fit(X,y,epochs=50,batch_size=200,validation_split=0.2,callbacks=[cb1,cb2])
%tensorboard --logdir logs --host 0.0.0.0
(1)
tf.keras.datasets.fashion_mnist.load_data()
을 이용하여 fashion_mnist 자료를 불러온 뒤 아래의 네트워크를 이용하여 적합하라.
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.fashion_mnist.load_data()
X = tf.constant(x_train.reshape(-1,28,28,1),dtype=tf.float64)
y = tf.keras.utils.to_categorical(y_train)
XX = tf.constant(x_test.reshape(-1,28,28,1),dtype=tf.float64)
yy = tf.keras.utils.to_categorical(y_test)
- 이때 n1=6, n2=16, n3=120 으로 설정한다, 드랍아웃비율은 20%로 설정한다.
-
net.summary()
를 출력하여 설계결과를 확인하라.
tf.random.set_seed(1213)
!rm -rf logs
net = tf.keras.Sequential()
net.add(tf.keras.layers.Conv2D(6,(5,5),activation='relu'))
net.add(tf.keras.layers.MaxPool2D())
net.add(tf.keras.layers.Conv2D(16,(5,5),activation='relu'))
net.add(tf.keras.layers.MaxPool2D())
net.add(tf.keras.layers.Flatten())
net.add(tf.keras.layers.Dense(120,activation='relu'))
net.add(tf.keras.layers.Dropout(0.2))
net.add(tf.keras.layers.Dense(10,activation='softmax'))
net.compile(optimizer='adam',loss=tf.losses.categorical_crossentropy,metrics='accuracy')
net.fit(X,y,epochs=5)
net.layers
c1,m1,c2,m2,flttn,rel,dro,dns = net.layers
print(X.shape)
print(c1(X).shape)
print(m1(c1(X)).shape)
print(c2(m1(c1(X))).shape)
print(m2(c2(m1(c1(X)))).shape)
print(flttn(m2(c2(m1(c1(X))))).shape)
print(rel(flttn(m2(c2(m1(c1(X)))))).shape)
print(dro(rel(flttn(m2(c2(m1(c1(X))))))).shape)
print(dns(dro(rel(flttn(m2(c2(m1(c1(X)))))))).shape)
net.summary()
(2)
n1=(6,64,128), n2=(16,256)에 대하여 test set의 loss가 최소화되는 조합을 찾아라. 결과를 텐서보드로 시각화하는 코드를 작성하라.
- epoc은 3회로 한정한다.
- validation_split은 0.2로 설정한다.
from tensorboard.plugins.hparams import api as hp
a=[]
tf.random.set_seed(1213)
!rm -rf logs
for u in [6,64,128]:
for d in [16,256]:
logdir = 'logs/hp_{}_{}'.format(u,d)
with tf.summary.create_file_writer(logdir).as_default():
net = tf.keras.Sequential()
net.add(tf.keras.layers.Conv2D(u,(5,5),activation='relu'))
net.add(tf.keras.layers.MaxPool2D())
net.add(tf.keras.layers.Conv2D(d,(5,5),activation='relu'))
net.add(tf.keras.layers.MaxPool2D())
net.add(tf.keras.layers.Flatten())
net.add(tf.keras.layers.Dense(120,activation='relu'))
net.add(tf.keras.layers.Dropout(0.2))
net.add(tf.keras.layers.Dense(10,activation='softmax'))
net.compile(optimizer='adam',loss=tf.losses.categorical_crossentropy,metrics='accuracy')
cb3 = hp.KerasCallback(logdir, {'n1':u, 'n2':d})
net.fit(X,y,epochs=3,batch_size=200,validation_split=0.2,callbacks=cb3)
_rslt=net.evaluate(XX,yy)
a.append(_rslt[0])
tf.summary.scalar('loss(테스트셋)',_rslt[0], step=1)
%tensorboard --logdir logs --host 0.0.0.0
a
위는 순서대로
- $n_1$=(6), $n_2$=(16)
- $n_1$=(6), $n_2$=(256)
- $n_1$=(64), $n_2$=(16)
- $n_1$=(64), $n_2$=(256)
- $n_1$=(128), $n_2$=(16)
- $n_1$=(128), $n_2$=(256)
$n_1=128, n_2 = 256$에서 test set의 loss가 $0.2948054075241089$로 최소화된다.
tf.keras.datasets.cifar10.load_data()
을 이용하여 CIFAR10을 불러온 뒤 적당한 네트워크를 사용하여 적합하라.
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data()
x_train.shape, y_train.shape, x_test.shape, y_test.shape
X=x_train.reshape(-1,32,32,3)/255 # 50000 by 1024 by
y=tf.keras.utils.to_categorical(y_train)
XX=x_test.reshape(-1,32,32,3)/255
yy=tf.keras.utils.to_categorical(y_test)
X.shape,y.shape,XX.shape,yy.shape
- 결과를 텐서보드로 시각화할 필요는 없다.
- 자유롭게 모형을 설계하여 적합하라.
- test set의 accuracy가 70%이상인 경우만 정답으로 인정한다.
tf.random.set_seed(1213)
net = tf.keras.Sequential()
net.add(tf.keras.layers.Conv2D(98,(2,2),activation='relu'))
net.add(tf.keras.layers.Conv2D(98,(2,2),activation='relu'))
net.add(tf.keras.layers.MaxPool2D())
net.add(tf.keras.layers.Conv2D(256,(2,2),activation='relu'))
net.add(tf.keras.layers.Conv2D(256,(2,2),activation='relu'))
net.add(tf.keras.layers.MaxPool2D())
net.add(tf.keras.layers.Flatten())
net.add(tf.keras.layers.Dense(256,activation='relu'))
net.add(tf.keras.layers.Dropout(0.2))
net.add(tf.keras.layers.Dense(10,activation='softmax'))
net.compile(optimizer='adam',loss=tf.losses.categorical_crossentropy,metrics='accuracy')
net.fit(X,y,epochs=5,validation_split=0.2)
net.evaluate(XX,yy)[1]
(1) (128,128,3)의 shape을 가진 텐서가 tf.keras.layers.Conv2D(5,(2,2))
으로 만들어진 커널을 통과할시 나오는 shape은?
cnv = tf.keras.layers.Conv2D(5,(2,2))
XXX = tnp.arange(1*128*128*3,dtype=tf.float64).reshape(1,128,128,3)
cnv(XXX).shape
answer: (1, 127, 127, 5)
(2) (24,24,16)의 shape을 가진 텐서가 tf.keras.layers.Flatten()
을 통과할때 나오는 텐서의 shape은?
24*24*16
flltn = tf.keras.layers.Flatten()
XXX = tnp.arange(1*24*24*16,dtype=tf.float64).reshape(1,24,24,16)
flltn(XXX).shape
answerL (1,9216)
(3) 관측치의 수가 10인 자료에서 batch_size=3으로 설정하면 한 에폭당 몇번의 이터레이션이 수행되는가?
3
(4) 적당한 선형변환을 적용하여 (28,28)의 크기를 가진 흑백이미지를 (27,27)의 크기를 가지는 흑백이미지로 바꾸려 한다. (2,2) 크기의 커널을 가진 Conv2D layer를 이용한다면 몇개의 가중치가 필요한가? (바이어스는 무시한다)
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.fashion_mnist.load_data()
X= x_train.reshape(-1,28,28,1)/255
y = tf.keras.utils.to_categorical(y_train)
conv = tf.keras.layers.Conv2D(1,(2,2))
conv(X)
conv.weights
conv.weights[0]
conv(X).shape
4개
(5) 적당한 선형변환을 적용하여 (28,28)의 크기를 가진 흑백이미지를 (27,27)의 크기를 가지는 흑백이미지로 바꾸려 한다. Dense layer를 이용한다면 몇개의 가중치가 필요한가? (바이어스는 무시한다)
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.fashion_mnist.load_data()
X= x_train.reshape(-1,28,28,1)/255
y = tf.keras.utils.to_categorical(y_train)
plt.imshow(X[0])
X.shape
flatten = tf.keras.layers.Flatten()
dense = tf.keras.layers.Dense(729,activation='relu')
dense.weights[0]
dense(flatten(X)).reshape(-1,27,27,1).shape
plt.imshow(dense(flatten(X)).reshape(-1,27,27,1)[0],cmap='gray')
729개