1. 오토인코더
- 오토인코더: GAN이 세상에 존재하지 않는 완전한 가상의 것을 만들어내는 반면에, 오토인코더는 입력 데이터의 특징을 효율적으로 담아낸 이미지를 만들어낸다.
1. 모듈 임포트
from tensorflow.keras.datasets import mnist
from tensorflow.keras import models, layers
import matplotlib.pyplot as plt
import numpy as np
import os
os.environ['KMP_DUPLICATE_LIB_OK'] = "TRUE"
2. MNIST 데이터 불러오기
(X_train, _), (X_test, _) = mnist.load_data()
#입력데이터 학습셋과 훈련셋을 mnist에서 가지고 온다.
X_train = X_train.reshape(X_train.shape[0], 28, 28, 1).astype(float) / 255
X_test = X_test.reshape(X_test.shape[0], 28, 28, 1).astype(float) / 255
#학습셋과 훈련셋의 이미지 개수,28*28,흑백을 넣고 나눈다.
#그리고 astype으로 실수형태로 바꾸어준다.
#255로 나누어 0-1로 정규화한다.
3. 딥러닝 모델 만들기
# 생성자 모델을 만듭니다.
autoencoder = models.Sequential()
# 인코딩 부분입니다. 맥스풀링으로 차원을 줄인다.
autoencoder.add(layers.Conv2D(16, kernel_size=3, padding='same', input_shape=(28,28,1), activation='relu'))
autoencoder.add(layers.MaxPooling2D(pool_size=2, padding='same'))
autoencoder.add(layers.Conv2D(8, kernel_size=3, activation='relu', padding='same'))
autoencoder.add(layers.MaxPooling2D(pool_size=2, padding='same'))
autoencoder.add(layers.Conv2D(8, kernel_size=3, strides=2, padding='same', activation='relu'))
#스트라이드를 2번한다.
#padding='same'은 입력사이즈와 출력사이즈르 같게한다.
# 디코딩 부분이 이어집니다. 업샘플링으로 차원을 늘린다.
autoencoder.add(layers.Conv2D(8, kernel_size=3, padding='same', activation='relu'))
autoencoder.add(layers.UpSampling2D())
autoencoder.add(layers.Conv2D(8, kernel_size=3, padding='same', activation='relu'))
autoencoder.add(layers.UpSampling2D())
autoencoder.add(layers.Conv2D(16, kernel_size=3, activation='relu'))
autoencoder.add(layers.UpSampling2D())
autoencoder.add(layers.Conv2D(1, kernel_size=3, padding='same', activation='sigmoid'))
# 전체 구조를 확인해 봅니다.
autoencoder.summary()
- 인코딩과 디코딩이다.
- 입력층보다 적은 수의 노드를 가진 은닉층을 중간에 넣어 차원을 줄여준다.
- 이때 소실된 데이터를 복원하기 위해 학습을 시작하고, 이 과정을 통해 입력 데이터의 특징을 효울적으로 응축한 새로운 출력이 나오는 원리이다.
--> 결과
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d (Conv2D) (None, 28, 28, 16) 160
max_pooling2d (MaxPooling2D (None, 14, 14, 16) 0
)
conv2d_1 (Conv2D) (None, 14, 14, 8) 1160
max_pooling2d_1 (MaxPooling (None, 7, 7, 8) 0
2D)
conv2d_2 (Conv2D) (None, 4, 4, 8) 584
conv2d_3 (Conv2D) (None, 4, 4, 8) 584
up_sampling2d (UpSampling2D (None, 8, 8, 8) 0
)
conv2d_4 (Conv2D) (None, 8, 8, 8) 584
up_sampling2d_1 (UpSampling (None, 16, 16, 8) 0
2D)
conv2d_5 (Conv2D) (None, 14, 14, 16) 1168
up_sampling2d_2 (UpSampling (None, 28, 28, 16) 0
2D)
conv2d_6 (Conv2D) (None, 28, 28, 1) 145
=================================================================
Total params: 4,385
Trainable params: 4,385
Non-trainable params: 0
_________________________________________________________________
- 파라미터 계산
- conv2d: (1*3*3)*16+16=160
- conv2d_1: (16*3*3)*8+8=1160
- conv2d_2: (8*3*3)*8+8=584
- conv2d_3: (8*3*3)*8+8=584
- conv2d_4: (8*3*3)*8+8=584
- conv2d_5: (8*3*3)*16+16=1168
- conv2d_6: (16*3*3)*1+1=145
번외: 커널 사이즈가 짝수라면??
Padding with even kernel size in a convolutional layer in Keras (Theano)
I need to now how data is padded in a 1d convolutional layer using Keras with Theano as backend. I use a "same" padding. Assuming we have an output_length of 8 and a kernel_size of 4. According to...
stackoverflow.com
4. 모델 실행
autoencoder.compile(optimizer='adam', loss='binary_crossentropy')
autoencoder.fit(X_train, X_train, epochs=50, batch_size=128, validation_data=(X_test, X_test))
# 학습된 결과를 출력하는 부분입니다.
random_test = np.random.randint(X_test.shape[0], size=5) # 테스트할 이미지를 랜덤하게 5개를 불러옵니다.
#X_test.shape[0]==> (10000, 28,28,1)에서 데이터개수 1만개를 가리킨다.
ae_imgs = autoencoder.predict(X_test) # 앞서 만든 오토인코더 모델에 집어 넣습니다.
plt.figure(figsize=(7, 2)) # 출력될 이미지의 크기를 정합니다.
for i, image_idx in enumerate(random_test): # 랜덤하게 뽑은 이미지를 차례로 나열합니다.
ax = plt.subplot(2, 7, i + 1)
plt.imshow(X_test[image_idx].reshape(28, 28)) # 테스트할 이미지를 먼저 그대로 보여줍니다.
ax.axis('off')
ax = plt.subplot(2, 7, 7 + i +1)
plt.imshow(ae_imgs[image_idx].reshape(28, 28)) # 오토인코딩 결과를 다음열에 출력합니다.
ax.axis('off')
plt.show()
--> 결과
Epoch 1/50
469/469 [==============================] - 86s 181ms/step - loss: 0.2097 - val_loss: 0.1430
Epoch 2/50
469/469 [==============================] - 91s 195ms/step - loss: 0.1320 - val_loss: 0.1222
Epoch 3/50
469/469 [==============================] - 95s 202ms/step - loss: 0.1188 - val_loss: 0.1134
...
Epoch 48/50
469/469 [==============================] - 88s 187ms/step - loss: 0.0821 - val_loss: 0.0814
Epoch 49/50
469/469 [==============================] - 96s 205ms/step - loss: 0.0820 - val_loss: 0.0810
Epoch 50/50
469/469 [==============================] - 96s 205ms/step - loss: 0.0819 - val_loss: 0.0810
313/313 [==============================] - 1s 3ms/step
- 오토인코더 이미지는 원본의 특징을 담아서 만들어졌다.
2. 전이학습
- 전이학습: 딥러닝의 데이터양이 충분하지 않을때 사용한다. 수만 장에 달하는 기존의 이미지에서 학습한 정보를 가져와 프로젝트에 활용하는 것이다.
- 위의 데이터들은 MRI 뇌 사진 데이터로 치매환자의 뇌 140장과 일반인 뇌 140장으로 구성되어 있다.
1. 모듈 임포트하기
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation, Dropout, Flatten, Dense, Conv2D, MaxPooling2D
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras import optimizers, initializers, regularizers, metrics
import os
os.environ['KMP_DUPLICATE_LIB_OK'] = "TRUE"
2. 이미지 제너레이터 객체 만들기
b_size = 5
#이미지데이터가 부족할때 해당방법으로 부풀린다.
#이미지데이터는 종류별로 최소 1000개 이상 있는 것이 좋다.
train_datagen = ImageDataGenerator(rescale=1./255, #주어진 이미지 크기 설정
horizontal_flip=True, #수평 대칭 이미지를 50% 확률로 만들어 추가합니다.
width_shift_range=0.1, #전체 크기의 10% 범위에서 좌우로 이동합니다.
height_shift_range=0.1, #마찬가지로 위, 아래로 이동합니다.
#아래에 있는 코드는 mri사진을 적용하기에는 불합리해서 주석처리함.
#rotation_range=5, #정해진 각도만큼 회전시킨다.
#shear_range=0.7, #좌표 하나를 고정시키고 나머지를 이동시킨다.
#zoom_range=[0.9, 2.2], #확대 또는 축소시킨다.
#vertical_flip=True, #수직 대칭 이미지를 만든다.
fill_mode='nearest') #빈공간은 가장 비슷한 색으로 채운다.
3. 데이터 분석하기
#flow_from_directory: 이미지를 어디서 가지고 오는지 알려준다.
train_generator = train_datagen.flow_from_directory(
'data/train', #학습셋이 있는 폴더의 위치입니다.
target_size=(150, 150), #이미지크기
batch_size=b_size,
class_mode='binary')#치매/정상 이진 분류이므로 바이너리 모드로 실행한다.
#테스트 셋은 이미지 부풀리기 과정을 진행하지 않습니다.
test_datagen = ImageDataGenerator(rescale=1./255)
test_generator = test_datagen.flow_from_directory(
'data/test', #테스트셋이 있는 폴더의 위치입니다.
target_size=(150, 150),
batch_size=b_size,
class_mode='binary')
--> 결과
Found 160 images belonging to 2 classes.
Found 120 images belonging to 2 classes.
4. 모델 만들기
model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape=(150,150,3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(2))
model.add(Activation('softmax'))
model.summary()
--> 결과
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d (Conv2D) (None, 148, 148, 32) 896
activation (Activation) (None, 148, 148, 32) 0
max_pooling2d (MaxPooling2D (None, 74, 74, 32) 0
)
conv2d_1 (Conv2D) (None, 72, 72, 32) 9248
activation_1 (Activation) (None, 72, 72, 32) 0
max_pooling2d_1 (MaxPooling (None, 36, 36, 32) 0
2D)
conv2d_2 (Conv2D) (None, 34, 34, 64) 18496
activation_2 (Activation) (None, 34, 34, 64) 0
max_pooling2d_2 (MaxPooling (None, 17, 17, 64) 0
2D)
flatten (Flatten) (None, 18496) 0
dense (Dense) (None, 64) 1183808
activation_3 (Activation) (None, 64) 0
dropout (Dropout) (None, 64) 0
dense_1 (Dense) (None, 2) 130
activation_4 (Activation) (None, 2) 0
=================================================================
Total params: 1,212,578
Trainable params: 1,212,578
Non-trainable params: 0
_________________________________________________________________
5. 모델 컴파일
model.compile(loss='sparse_categorical_crossentropy', optimizer=optimizers.Adam(learning_rate=0.0002),
metrics=['accuracy'])
#sparse_categorical_crossentropy: 타겟값이 단순 정수(0,1)로 되어있어도 오차를 계산해준다.
6. 학습하기
history = model.fit(
train_generator,
epochs=20,
validation_data=test_generator )
--> 결과
Epoch 1/20
32/32 [==============================] - 4s 117ms/step - loss: 0.7110 - accuracy: 0.4375 - val_loss: 0.6832 - val_accuracy: 0.5083
Epoch 2/20
32/32 [==============================] - 2s 60ms/step - loss: 0.6949 - accuracy: 0.5000 - val_loss: 0.6744 - val_accuracy: 0.5417
Epoch 3/20
32/32 [==============================] - 2s 59ms/step - loss: 0.6716 - accuracy: 0.6313 - val_loss: 0.6782 - val_accuracy: 0.5000
...
Epoch 18/20
32/32 [==============================] - 2s 61ms/step - loss: 0.1496 - accuracy: 0.9625 - val_loss: 0.1019 - val_accuracy: 0.9750
Epoch 19/20
32/32 [==============================] - 2s 65ms/step - loss: 0.1767 - accuracy: 0.9438 - val_loss: 0.1123 - val_accuracy: 0.9583
Epoch 20/20
32/32 [==============================] - 2s 60ms/step - loss: 0.1747 - accuracy: 0.9500 - val_loss: 0.1230 - val_accuracy: 0.9583
7. 그래프 그리기
acc= history.history['accuracy']
val_acc= history.history['val_accuracy']
y_vloss = history.history['val_loss']
y_loss = history.history['loss']
x_len = np.arange(len(y_loss))
plt.plot(x_len, acc, marker='.', c="red", label='Trainset_acc')
plt.plot(x_len, val_acc, marker='.', c="lightcoral", label='Testset_acc')
plt.plot(x_len, y_vloss, marker='.', c="cornflowerblue", label='Testset_loss')
plt.plot(x_len, y_loss, marker='.', c="blue", label='Trainset_loss')
plt.legend(loc='upper right')
plt.grid()
plt.xlabel('epoch')
plt.ylabel('loss/acc')
plt.show()
--> 결과
3. ImageNet
- 이미지넷: 1000가지 종류로 나누어진 120만개가 넘는 이미지를 놓고 어떤 물체인지 맞히는 '이미지넷 이미지 인식대회(ILSVRC)'에 사용되는 데이터셋이다.
1. 전이학습 구조
- VGGNet: 옥스포드 대학의 연구팀 VGG에 의해 개발된 모델이다. 학습구조 VGG16 사용예정
- fine tuning은 실행안함. 추가한 레이어 dense층만 학습예정이다.(나의 네트워크 부분) 이곳은 분류기이다.
2. 모듈 임포트
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras import Input, models, layers, optimizers, metrics
from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras.applications import VGG16
import os
os.environ['KMP_DUPLICATE_LIB_OK'] = "TRUE"
3. 이미지 제너레이터 객체 만들기
b_size = 5
train_datagen = ImageDataGenerator(rescale=1./255,
horizontal_flip=True, #수평 대칭 이미지를 50% 확률로 만들어 추가합니다.
width_shift_range=0.1, #전체 크기의 10% 범위에서 좌우로 이동합니다.
height_shift_range=0.1, #마찬가지로 위, 아래로 이동합니다.
fill_mode='nearest')
4. 데이터 분석하기
train_generator = train_datagen.flow_from_directory(
'data/train', #학습셋이 있는 폴더의 위치입니다.
target_size=(150, 150),
batch_size=b_size,
class_mode='binary')
#테스트 셋은 이미지 부풀리기 과정을 진행하지 않습니다.
test_datagen = ImageDataGenerator(rescale=1./255)
test_generator = test_datagen.flow_from_directory(
'data/test', #테스트셋이 있는 폴더의 위치입니다.
target_size=(150, 150),
batch_size=b_size,
class_mode='binary')
--> 결과
Found 160 images belonging to 2 classes.
Found 120 images belonging to 2 classes.
5. VGG16 구현
transfer_model = VGG16(weights='imagenet', include_top=False, input_shape=(150, 150, 3))
#include_top: 맨마지막 분류기 빼기
transfer_model.trainable = False
#불러올 부분은 새롭게 학습되는 것이 아니여서 학습되지 않도록 false로 지정한다.
transfer_model.summary()
--> 결과
Model: "vgg16"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_2 (InputLayer) [(None, 150, 150, 3)] 0
block1_conv1 (Conv2D) (None, 150, 150, 64) 1792
block1_conv2 (Conv2D) (None, 150, 150, 64) 36928
block1_pool (MaxPooling2D) (None, 75, 75, 64) 0
block2_conv1 (Conv2D) (None, 75, 75, 128) 73856
block2_conv2 (Conv2D) (None, 75, 75, 128) 147584
block2_pool (MaxPooling2D) (None, 37, 37, 128) 0
block3_conv1 (Conv2D) (None, 37, 37, 256) 295168
block3_conv2 (Conv2D) (None, 37, 37, 256) 590080
block3_conv3 (Conv2D) (None, 37, 37, 256) 590080
block3_pool (MaxPooling2D) (None, 18, 18, 256) 0
block4_conv1 (Conv2D) (None, 18, 18, 512) 1180160
block4_conv2 (Conv2D) (None, 18, 18, 512) 2359808
block4_conv3 (Conv2D) (None, 18, 18, 512) 2359808
block4_pool (MaxPooling2D) (None, 9, 9, 512) 0
block5_conv1 (Conv2D) (None, 9, 9, 512) 2359808
block5_conv2 (Conv2D) (None, 9, 9, 512) 2359808
block5_conv3 (Conv2D) (None, 9, 9, 512) 2359808
block5_pool (MaxPooling2D) (None, 4, 4, 512) 0
=================================================================
Total params: 14,714,688
Trainable params: 0
Non-trainable params: 14,714,688
_________________________________________________________________
6. 딥러닝 구조 구현
finetune_model = models.Sequential()
finetune_model.add(transfer_model)
finetune_model.add(Flatten())#2차원을 1차원으로 바꾸어준다.
finetune_model.add(Dense(64, activation='relu'))
finetune_model.add(Dense(1, activation='sigmoid'))
finetune_model.summary()
--> 결과
Model: "sequential_1"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
vgg16 (Functional) (None, 4, 4, 512) 14714688
flatten_1 (Flatten) (None, 8192) 0
dense_2 (Dense) (None, 64) 524352
dense_3 (Dense) (None, 1) 65
=================================================================
Total params: 15,239,105
Trainable params: 524,417
Non-trainable params: 14,714,688
_________________________________________________________________
7. 모델컴파일
finetune_model.compile(loss='binary_crossentropy',
optimizer=optimizers.Adam(learning_rate=0.0002), metrics=['accuracy'])
8. 모델 실행
history = finetune_model.fit(
train_generator,
epochs=20,
validation_data=test_generator )
--> 결과
Epoch 1/20
32/32 [==============================] - 16s 459ms/step - loss: 0.6415 - accuracy: 0.6313 - val_loss: 0.5521 - val_accuracy: 0.7667
Epoch 2/20
32/32 [==============================] - 14s 452ms/step - loss: 0.4457 - accuracy: 0.8750 - val_loss: 0.4466 - val_accuracy: 0.8000
Epoch 3/20
32/32 [==============================] - 15s 480ms/step - loss: 0.3678 - accuracy: 0.9312 - val_loss: 0.3841 - val_accuracy: 0.8500
...
Epoch 18/20
32/32 [==============================] - 14s 452ms/step - loss: 0.1109 - accuracy: 0.9688 - val_loss: 0.1493 - val_accuracy: 0.9417
Epoch 19/20
32/32 [==============================] - 15s 463ms/step - loss: 0.1033 - accuracy: 0.9563 - val_loss: 0.1364 - val_accuracy: 0.9500
Epoch 20/20
32/32 [==============================] - 15s 466ms/step - loss: 0.1085 - accuracy: 0.9812 - val_loss: 0.1670 - val_accuracy: 0.9167
4. 개 vs 고양이 데이터(feat. VGG16)
https://julian5383.tistory.com/225
[비트교육센터][AI] 7일차 이미지분석
1. 이미지 인식 원리 - MINST 데이터셋: 미국 국립표준기술원이 고등학생과 인구조사국 직원 등이 쓴 손글씨를 이용해 만든 데이터로 구성되어 있다. - 7만 개의 글자 이미지에 각각 0과 9까지 이름
julian5383.tistory.com
- 개 vs 고양이 데이터를 VGG16으로 분석한 것이다.
1. 훈련셋, 데이터셋 경로 설정
train_dir = 'data/dogs_vs_cats/train'
test_dir = 'data/dogs_vs_cats/test'
2. 모듈 임포트
from tensorflow.keras import models, layers, optimizers
from tensorflow.keras.callbacks import ModelCheckpoint,EarlyStopping
from tensorflow.keras.applications import VGG16
from tensorflow.keras.layers import Dense, Flatten
import matplotlib.pyplot as plt
import numpy as np
import os
os.environ['KMP_DUPLICATE_LIB_OK']="TRUE"
3. 딥러닝 구조 만들기
transfer_model = VGG16(weights='imagenet', include_top=False, input_shape=(150, 150, 3))
#include_top: 맨마지막 분류기 빼기
transfer_model.trainable = False
transfer_model.summary()
finetune_model = models.Sequential()
finetune_model.add(transfer_model)
finetune_model.add(Flatten())
finetune_model.add(Dense(64, activation='relu'))
finetune_model.add(Dense(1, activation='sigmoid'))
finetune_model.summary()
--> 결과
Model: "vgg16"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_5 (InputLayer) [(None, 150, 150, 3)] 0
block1_conv1 (Conv2D) (None, 150, 150, 64) 1792
block1_conv2 (Conv2D) (None, 150, 150, 64) 36928
block1_pool (MaxPooling2D) (None, 75, 75, 64) 0
block2_conv1 (Conv2D) (None, 75, 75, 128) 73856
block2_conv2 (Conv2D) (None, 75, 75, 128) 147584
block2_pool (MaxPooling2D) (None, 37, 37, 128) 0
block3_conv1 (Conv2D) (None, 37, 37, 256) 295168
block3_conv2 (Conv2D) (None, 37, 37, 256) 590080
block3_conv3 (Conv2D) (None, 37, 37, 256) 590080
block3_pool (MaxPooling2D) (None, 18, 18, 256) 0
block4_conv1 (Conv2D) (None, 18, 18, 512) 1180160
block4_conv2 (Conv2D) (None, 18, 18, 512) 2359808
block4_conv3 (Conv2D) (None, 18, 18, 512) 2359808
block4_pool (MaxPooling2D) (None, 9, 9, 512) 0
block5_conv1 (Conv2D) (None, 9, 9, 512) 2359808
block5_conv2 (Conv2D) (None, 9, 9, 512) 2359808
block5_conv3 (Conv2D) (None, 9, 9, 512) 2359808
block5_pool (MaxPooling2D) (None, 4, 4, 512) 0
=================================================================
Total params: 14,714,688
Trainable params: 0
Non-trainable params: 14,714,688
_________________________________________________________________
Model: "sequential_4"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
vgg16 (Functional) (None, 4, 4, 512) 14714688
flatten_3 (Flatten) (None, 8192) 0
dense_6 (Dense) (None, 64) 524352
dense_7 (Dense) (None, 1) 65
=================================================================
Total params: 15,239,105
Trainable params: 524,417
Non-trainable params: 14,714,688
_________________________________________________________________
4. 제너레이터 만들기
from tensorflow.keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(
# 타깃 디렉터리
train_dir,
# 모든 이미지를 150 × 150 크기로 바꿈
target_size=(150, 150),
batch_size=20,
# binary_crossentropy 손실을 사용하기 때문에 이진 레이블이 필요
class_mode='binary')
validation_generator = test_datagen.flow_from_directory(
test_dir,
target_size=(150, 150),
batch_size=20,
class_mode='binary')
--> 결과
Found 20000 images belonging to 2 classes.
Found 5000 images belonging to 2 classes.
5. EarlyStopping
model_path = 'model/dogs-vs-cats-vgg16.hdf5'
early_stopping = EarlyStopping(monitor='val_loss', patience=5)
checkpoint = ModelCheckpoint(filepath=model_path, monitor='val_loss',
verbose=1, save_best_only=True)
6. 모델 실행
history = finetune_model.fit(
train_generator,
epochs=20,
validation_data=validation_generator,
callbacks=[early_stopping, checkpoint])
- 학습시간이 줄고 정확도가 올라간다.
--> 결과
Epoch 1/20
1000/1000 [==============================] - ETA: 0s - loss: 0.2571 - accuracy: 0.8903
Epoch 1: val_loss improved from inf to 0.23296, saving model to model\dogs-vs-cats-vgg16.hdf5
1000/1000 [==============================] - 1199s 1s/step - loss: 0.2571 - accuracy: 0.8903 - val_loss: 0.2330 - val_accuracy: 0.9052
Epoch 2/20
1000/1000 [==============================] - ETA: 0s - loss: 0.1952 - accuracy: 0.9181
Epoch 2: val_loss improved from 0.23296 to 0.22334, saving model to model\dogs-vs-cats-vgg16.hdf5
1000/1000 [==============================] - 1275s 1s/step - loss: 0.1952 - accuracy: 0.9181 - val_loss: 0.2233 - val_accuracy: 0.9074
Epoch 3/20
1000/1000 [==============================] - ETA: 0s - loss: 0.1644 - accuracy: 0.9327
Epoch 3: val_loss improved from 0.22334 to 0.21047, saving model to model\dogs-vs-cats-vgg16.hdf5
1000/1000 [==============================] - 1190s 1s/step - loss: 0.1644 - accuracy: 0.9327 - val_loss: 0.2105 - val_accuracy: 0.9138
Epoch 4/20
1000/1000 [==============================] - ETA: 0s - loss: 0.1441 - accuracy: 0.9405
Epoch 4: val_loss did not improve from 0.21047
1000/1000 [==============================] - 1143s 1s/step - loss: 0.1441 - accuracy: 0.9405 - val_loss: 0.2200 - val_accuracy: 0.9140
Epoch 5/20
1000/1000 [==============================] - ETA: 0s - loss: 0.1236 - accuracy: 0.9531
Epoch 5: val_loss did not improve from 0.21047
1000/1000 [==============================] - 1199s 1s/step - loss: 0.1236 - accuracy: 0.9531 - val_loss: 0.2440 - val_accuracy: 0.9018
Epoch 6/20
1000/1000 [==============================] - ETA: 0s - loss: 0.1088 - accuracy: 0.9570
Epoch 6: val_loss did not improve from 0.21047
1000/1000 [==============================] - 1274s 1s/step - loss: 0.1088 - accuracy: 0.9570 - val_loss: 0.2286 - val_accuracy: 0.9116
Epoch 7/20
1000/1000 [==============================] - ETA: 0s - loss: 0.0902 - accuracy: 0.9664
Epoch 7: val_loss did not improve from 0.21047
1000/1000 [==============================] - 1118s 1s/step - loss: 0.0902 - accuracy: 0.9664 - val_loss: 0.2564 - val_accuracy: 0.9012
Epoch 8/20
1000/1000 [==============================] - ETA: 0s - loss: 0.0781 - accuracy: 0.9712
Epoch 8: val_loss did not improve from 0.21047
1000/1000 [==============================] - 1273s 1s/step - loss: 0.0781 - accuracy: 0.9712 - val_loss: 0.2451 - val_accuracy: 0.9098
'비트교육센터 > AI' 카테고리의 다른 글
[비트교육센터][AI] 9일차 한국어 모델링, RNN, GAN (0) | 2023.08.11 |
---|---|
[비트교육센터][AI] 8일차 파이토치로 이미지 분석, 자연어 처리,EDA, 토크나이징,한국어 모델링 (0) | 2023.08.11 |
[비트교육센터][AI] 7일차 이미지분석 (0) | 2023.08.10 |
[비트교육센터][AI] 6일차 데이터 예측하기 (0) | 2023.08.09 |
[비트교육센터][AI] AI 3일차 회귀,배치, tensorflow, pytorch 설치 (0) | 2023.08.06 |