imports

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. Fashion_mnist, DNN (30점)

(1) tf.keras.datasets.fashion_mnist.load_data()을 이용하여 fashion_mnist 자료를 불러온 뒤 아래의 네트워크를 이용하여 적합하라. (6점)

  • 평가지표로 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"
}
''')

<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> G cluster_1 Layer 0 cluster_2 Layer 1: relu cluster_3 Layer 2: relu cluster_4 Layer 3: softmax x1 x1 node1 node1 x1->node1 node2 node2 x1->node2 ... ... x1->... node20 node20 x1->node20 x2 x2 x2->node1 x2->node2 x2->... x2->node20 .. .. ..->node1 ..->node2 ..->... ..->node20 x784 x784 x784->node1 x784->node2 x784->... x784->node20 node1 node1 node1->node1 node2 node2 node1->node2 ... ... node1->... node30 node30 node1->node30 node2->node1 node2->node2 node2->... node2->node30 ...->node1 ...->node2 ...->... ...->node30 node20->node1 node20->node2 node20->... node20->node30 y10 y10 node1 ->y10 y1 y1 node1 ->y1 . . node1 ->. node2 ->y10 node2 ->y1 node2 ->. ... ->y10 ... ->y1 ... ->. node30 ->y10 node30 ->y1 node30 ->.

(풀이)

(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)
2022-06-21 13:22:45.132504: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:939] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
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)
Epoch 1/10
1875/1875 [==============================] - 2s 740us/step - loss: 1.5549 - accuracy: 0.5059
Epoch 2/10
1875/1875 [==============================] - 1s 722us/step - loss: 0.9540 - accuracy: 0.6122
Epoch 3/10
1875/1875 [==============================] - 1s 741us/step - loss: 0.9147 - accuracy: 0.6224
Epoch 4/10
1875/1875 [==============================] - 1s 740us/step - loss: 0.8895 - accuracy: 0.6273
Epoch 5/10
1875/1875 [==============================] - 1s 725us/step - loss: 0.8622 - accuracy: 0.6347
Epoch 6/10
1875/1875 [==============================] - 1s 735us/step - loss: 0.8717 - accuracy: 0.6344
Epoch 7/10
1875/1875 [==============================] - 1s 744us/step - loss: 0.8444 - accuracy: 0.6391
Epoch 8/10
1875/1875 [==============================] - 1s 734us/step - loss: 0.8603 - accuracy: 0.6388
Epoch 9/10
1875/1875 [==============================] - 1s 739us/step - loss: 0.8437 - accuracy: 0.6392
Epoch 10/10
1875/1875 [==============================] - 1s 736us/step - loss: 0.8342 - accuracy: 0.6412
<keras.callbacks.History at 0x7f8ab82af1f0>

(2) (1)에서 적합된 네트워크를 이용하여 test data의 accuracy를 구하라. (6점)

(풀이)

net.evaluate(XX,yy) 
313/313 [==============================] - 0s 730us/step - loss: 0.8405 - accuracy: 0.6457
[0.8405390381813049, 0.6456999778747559]

(3) train set에서 20%의 자료를 validation 으로 분리하여 50에폭동안 학습하라. 텐서보드를 이용하여 train accuracy와 validation accuracy를 시각화 하고 결과를 해석하라. 오버피팅이라고 볼 수 있는가? (6점)

(풀이)

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,validation_split=0.2,callbacks=cb1,verbose=0)
<keras.callbacks.History at 0x7f8ab07b7880>
 

validation loss가 줄어들다가 증가한다면 오버피팅으로 판단한다. 그렇지 않으면 오버핏이 아니다.

(4) (3)에서 적합된 네트워크를 이용하여 test data의 accuracy를 구하라. (2)의 결과와 비교하라. (6점)

(풀이)

net.evaluate(XX,yy)
313/313 [==============================] - 0s 884us/step - loss: 1.2193 - accuracy: 0.4664
[1.2193024158477783, 0.46639999747276306]

accuracy가 상승함. 따라서 에폭을 늘린것이 유의미한 결정이라 볼 수 있다.

(5) 조기종료기능을 이용하여 (3)의 네트워크를 다시 학습하라. 학습결과를 텐서보드를 이용하여 시각화 하라. (6점)

  • patience=3 으로 설정할 것

(풀이)

!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,verbose=0,validation_split=0.2,callbacks=[cb1,cb2]) 
#%tensorboard --logdir logs --host 0.0.0.0
<keras.callbacks.History at 0x7f8ab05346a0>

2. Fashion_mnist, CNN (30점)

(1) tf.keras.datasets.fashion_mnist.load_data()을 이용하여 fashion_mnist 자료를 불러온 뒤 아래의 네트워크를 이용하여 적합하라. (10점)

  • 이때 n1=6, n2=16, n3=120 으로 설정한다, 드랍아웃비율은 20%로 설정한다.
  • net.summary()를 출력하여 설계결과를 확인하라.

(풀이)

(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)
net = tf.keras.Sequential()
net.add(tf.keras.layers.Conv2D(6,(5,5),activation='relu')) # activation이 relu임은 그림에서 명시되지 않았으므로 생략해도 무방함. 
net.add(tf.keras.layers.MaxPool2D())
net.add(tf.keras.layers.Conv2D(16,(5,5),activation='relu')) # 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)
Epoch 1/5
1875/1875 [==============================] - 4s 1ms/step - loss: 0.8601 - accuracy: 0.7537
Epoch 2/5
1875/1875 [==============================] - 2s 1ms/step - loss: 0.4388 - accuracy: 0.8412
Epoch 3/5
1875/1875 [==============================] - 2s 1ms/step - loss: 0.3892 - accuracy: 0.8596
Epoch 4/5
1875/1875 [==============================] - 2s 1ms/step - loss: 0.3642 - accuracy: 0.8665
Epoch 5/5
1875/1875 [==============================] - 2s 1ms/step - loss: 0.3437 - accuracy: 0.8739
<keras.callbacks.History at 0x7f8ab04a7d60>
net.summary()
Model: "sequential_3"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 conv2d (Conv2D)             (32, 24, 24, 6)           156       
                                                                 
 max_pooling2d (MaxPooling2D  (32, 12, 12, 6)          0         
 )                                                               
                                                                 
 conv2d_1 (Conv2D)           (32, 8, 8, 16)            2416      
                                                                 
 max_pooling2d_1 (MaxPooling  (32, 4, 4, 16)           0         
 2D)                                                             
                                                                 
 flatten_3 (Flatten)         (32, 256)                 0         
                                                                 
 dense_9 (Dense)             (32, 120)                 30840     
                                                                 
 dropout (Dropout)           (32, 120)                 0         
                                                                 
 dense_10 (Dense)            (32, 10)                  1210      
                                                                 
=================================================================
Total params: 34,622
Trainable params: 34,622
Non-trainable params: 0
_________________________________________________________________

(2) n1=(6,64,128), n2=(16,256)에 대하여 test set의 loss가 최소화되는 조합을 찾아라. 결과를 텐서보드로 시각화하는 코드를 작성하라. (20점)

  • epoc은 3회로 한정한다.
  • validation_split은 0.2로 설정한다.

(풀이)

from tensorboard.plugins.hparams import api as hp
!rm -rf logs
for n1 in [6,64,128]: 
    for n2 in [16,256]: 
        logdir = 'logs/hp_{}_{}'.format(n1,n2)
        with tf.summary.create_file_writer(logdir).as_default():
            net = tf.keras.Sequential()
            net.add(tf.keras.layers.Conv2D(n1,(5,5),activation='relu'))
            net.add(tf.keras.layers.MaxPool2D())
            net.add(tf.keras.layers.Conv2D(n2,(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':n1, 'n2':n2})
            net.fit(X,y,epochs=3,validation_split=0.2,callbacks=cb3)
            tf.summary.scalar('loss(테스트셋)',net.evaluate(XX,yy)[0], step=1) 
Epoch 1/3
1500/1500 [==============================] - 2s 1ms/step - loss: 0.9984 - accuracy: 0.6880 - val_loss: 0.5805 - val_accuracy: 0.7720
Epoch 2/3
1500/1500 [==============================] - 2s 1ms/step - loss: 0.5349 - accuracy: 0.8008 - val_loss: 0.4375 - val_accuracy: 0.8393
Epoch 3/3
1500/1500 [==============================] - 2s 1ms/step - loss: 0.4426 - accuracy: 0.8385 - val_loss: 0.4026 - val_accuracy: 0.8521
313/313 [==============================] - 0s 1ms/step - loss: 0.4230 - accuracy: 0.8421
Epoch 1/3
1500/1500 [==============================] - 2s 2ms/step - loss: 0.8688 - accuracy: 0.7790 - val_loss: 0.3846 - val_accuracy: 0.8619
Epoch 2/3
1500/1500 [==============================] - 2s 1ms/step - loss: 0.4005 - accuracy: 0.8566 - val_loss: 0.3601 - val_accuracy: 0.8673
Epoch 3/3
1500/1500 [==============================] - 2s 1ms/step - loss: 0.3573 - accuracy: 0.8681 - val_loss: 0.3566 - val_accuracy: 0.8753
313/313 [==============================] - 0s 1ms/step - loss: 0.3782 - accuracy: 0.8665
Epoch 1/3
1500/1500 [==============================] - 3s 2ms/step - loss: 1.0166 - accuracy: 0.6389 - val_loss: 0.5612 - val_accuracy: 0.7935
Epoch 2/3
1500/1500 [==============================] - 2s 1ms/step - loss: 0.4938 - accuracy: 0.8190 - val_loss: 0.4099 - val_accuracy: 0.8506
Epoch 3/3
1500/1500 [==============================] - 2s 2ms/step - loss: 0.4063 - accuracy: 0.8515 - val_loss: 0.4044 - val_accuracy: 0.8562
313/313 [==============================] - 0s 1ms/step - loss: 0.4145 - accuracy: 0.8471
Epoch 1/3
1500/1500 [==============================] - 3s 2ms/step - loss: 0.6996 - accuracy: 0.8248 - val_loss: 0.3712 - val_accuracy: 0.8720
Epoch 2/3
1500/1500 [==============================] - 3s 2ms/step - loss: 0.3572 - accuracy: 0.8721 - val_loss: 0.3415 - val_accuracy: 0.8758
Epoch 3/3
1500/1500 [==============================] - 3s 2ms/step - loss: 0.3291 - accuracy: 0.8809 - val_loss: 0.3196 - val_accuracy: 0.8840
313/313 [==============================] - 0s 1ms/step - loss: 0.3423 - accuracy: 0.8772
Epoch 1/3
1500/1500 [==============================] - 3s 2ms/step - loss: 1.0239 - accuracy: 0.6182 - val_loss: 0.6486 - val_accuracy: 0.7352
Epoch 2/3
1500/1500 [==============================] - 2s 2ms/step - loss: 0.6093 - accuracy: 0.7655 - val_loss: 0.5057 - val_accuracy: 0.8081
Epoch 3/3
1500/1500 [==============================] - 2s 2ms/step - loss: 0.4804 - accuracy: 0.8188 - val_loss: 0.4293 - val_accuracy: 0.8408
313/313 [==============================] - 0s 1ms/step - loss: 0.4580 - accuracy: 0.8315
Epoch 1/3
1500/1500 [==============================] - 3s 2ms/step - loss: 0.7253 - accuracy: 0.8230 - val_loss: 0.3436 - val_accuracy: 0.8747
Epoch 2/3
1500/1500 [==============================] - 3s 2ms/step - loss: 0.3646 - accuracy: 0.8684 - val_loss: 0.3540 - val_accuracy: 0.8688
Epoch 3/3
1500/1500 [==============================] - 3s 2ms/step - loss: 0.3364 - accuracy: 0.8783 - val_loss: 0.3238 - val_accuracy: 0.8858
313/313 [==============================] - 0s 1ms/step - loss: 0.3431 - accuracy: 0.8819
 

3. CIFAR10 (30점)

tf.keras.datasets.cifar10.load_data()을 이용하여 CIFAR10을 불러온 뒤 적당한 네트워크를 사용하여 적합하라.

  • 결과를 텐서보드로 시각화할 필요는 없다.
  • 자유롭게 모형을 설계하여 적합하라.
  • test set의 accuracy가 70%이상인 경우만 정답으로 인정한다.

(풀이)

(x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data()
X=x_train.reshape(-1,32,32,3)/255 
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)
net = tf.keras.Sequential()
net.add(tf.keras.layers.Conv2D(128,(2,2),activation='relu'))
net.add(tf.keras.layers.Conv2D(128,(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.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)
Epoch 1/5
1250/1250 [==============================] - 5s 3ms/step - loss: 1.4194 - accuracy: 0.4870 - val_loss: 1.2295 - val_accuracy: 0.5636
Epoch 2/5
1250/1250 [==============================] - 4s 3ms/step - loss: 0.9424 - accuracy: 0.6697 - val_loss: 0.8725 - val_accuracy: 0.6981
Epoch 3/5
1250/1250 [==============================] - 4s 3ms/step - loss: 0.7412 - accuracy: 0.7393 - val_loss: 0.8261 - val_accuracy: 0.7159
Epoch 4/5
1250/1250 [==============================] - 4s 3ms/step - loss: 0.5820 - accuracy: 0.7974 - val_loss: 0.7932 - val_accuracy: 0.7406
Epoch 5/5
1250/1250 [==============================] - 4s 3ms/step - loss: 0.4402 - accuracy: 0.8464 - val_loss: 0.8420 - val_accuracy: 0.7349
<keras.callbacks.History at 0x7f8b30b2b610>
net.evaluate(XX,yy)
313/313 [==============================] - 0s 1ms/step - loss: 0.8734 - accuracy: 0.7265
[0.8733922839164734, 0.7264999747276306]

4. 다음을 읽고 물음에 답하라. (10점)

(1) (1,128,128,3)의 shape을 가진 텐서가 tf.keras.layers.Conv2D(5,(2,2))으로 만들어진 커널을 통과할시 나오는 shape은?

(풀이)

l=tf.keras.layers.Conv2D(5,(2,2))
x=tnp.arange(1*128*128*3).reshape(1,128,128,3)/255
l(x).shape
TensorShape([1, 127, 127, 5])

(2) (1,24,24,16)의 shape을 가진 텐서가 tf.keras.layers.Flatten()을 통과할때 나오는 텐서의 shape은?

(풀이)

l=tf.keras.layers.Flatten()
x=tnp.arange(1*24*24*16).reshape(1,24,24,16)/255
l(x).shape
TensorShape([1, 9216])

(3)-(4)

아래와 같은 모형을 고려하자.

$$y_i= \beta_0 + \sum_{k=1}^{5} \beta_k \cos(k t_i)+\epsilon_i$$

여기에서 $t=(t_1,\dots,t_{1000})=$ np.linspace(0,5,1000) 이다. 그리고 $\epsilon_i \sim i.i.d~ N(0,\sigma^2)$, 즉 서로 독립인 표준정규분포에서 추출된 샘플이다. 위의 모형에서 아래와 같은 데이터를 관측했다고 가정하자. ($\beta_0,\dots,\beta_5$의 참값은 각각 -2, 3, 1, 0, 0, 0.5 이다.)

np.random.seed(43052)
t= np.linspace(0,5,1000)
y = -2+ 3*np.cos(t) + 1*np.cos(2*t) + 0.5*np.cos(5*t) + np.random.randn(1000)*0.2
plt.plot(t,y,'.',alpha=0.1)
[<matplotlib.lines.Line2D at 0x7f6f63d9b0a0>]

(3) 모형에 대한 설명 중 옳은 것을 모두 골라라.

(하영) 이 모형의 경우 MSEloss를 최소화하는 $\hat{\beta}_0,\dots,\hat{\beta}_5$를 구하는것은 최대우도함수를 최대화하는 $\hat{\beta}_0,\dots,\hat{\beta}_5$를 구하는 것과 같다.

(재인) 하영의 말이 옳은 이유는 오차항이 정규분포를 따른다는 가정이 있기 때문이다.

~(서연) 이 모형에서 적절한 학습률이 선택되더라도 경사하강법을 이용하면 MSEloss를 최소화하는 $\hat{\beta}_0,\dots,\hat{\beta}_5$를 종종 구할 수 없는 문제가 생긴다. 왜냐하면 손실함수가 convex하지 않아서 local minimum에 빠질 위험이 있기 때문이다.~

  • 이 모형은 ${\bf y}={\bf X}{\boldsymbol \beta}+{\boldsymbol \epsilon}$꼴이므로 선형모형으로 볼 수 있다. 따라서 제곱오차손실을 사용할 경우 손실함수는 항상 convex하다.

~(규빈) 만약에 경사하강법 대신 확률적 경사하강법을 쓴다면 local minimum을 언제나 탈출 할 수 있다. 따라서 서연이 언급한 문제점은 생기지 않는다.~

  • 확률적경사하강법을 쓴다고 해도 local minimum에 빠지는 문제가 완전히 해결되지는 않는다.

(4) 다음은 위의 모형을 학습한 결과이다. 옳게 해석한 것을 모두 고르시오.

y = y.reshape(1000,1)
x1 = np.cos(t) 
x2 = np.cos(2*t)
x3 = np.cos(3*t)
x4 = np.cos(4*t)
x5 = np.cos(5*t)
X = tf.stack([x1,x2,x3,x4,x5],axis=1)
net = tf.keras.Sequential()
net.add(tf.keras.layers.Dense(1)) 
net.compile(loss='mse',optimizer='adam')
net.fit(X,y,epochs=500,batch_size=100, validation_split=0.45,verbose=0) 
<keras.callbacks.History at 0x7f6ee0696380>
plt.plot(y,'.',alpha=0.1)
plt.plot(net(X),'--')
[<matplotlib.lines.Line2D at 0x7f6ee05367a0>]

(재인) 처음 550개의 데이터만 학습하고 이후의 450개의 데이터는 학습하지 않고 validation으로 이용하였다.

(서연) validation에서의 적합결과가 좋지 않다.

~(규빈) validation의 적합결과가 좋지 않기 때문에 오버피팅을 의심할 수 있다. 따라서 만약에 네트워크에 드랍아웃층을 추가한다면 오버피팅을 방지하는 효과가 있어 validation의 loss가 줄어들 것이다.~

  • 오버핏이 아닌 상황이다. (강의노트 참고)

(하영) 이 모형의 경우 더 많은 epoch으로 학습한다면 train loss와 validation loss를 둘 다 줄일 수 있다.

(5) 다음을 잘 읽고 참 거짓을 판별하라.

Convolution은 선형변환이다.

~CNN을 이용하면 언제나 손실함수를 MSEloss로 선택해야 한다.~

  • 그런법은 없다.

~CNN은 adam optimizer를 통해서만 최적화할 수 있다.~

  • 그런법은 없다.

~이미지자료는 CNN을 이용하여서만 분석할 수 있으며 DNN으로는 분석불가능하다.~

  • DNN으로도 이미지자료를 분석한다. (강의노트 참고)

~CNN은 칼라이미지일 경우에만 적용가능하다.~

  • 흑백이미지일 경우도 적용가능하다.