1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
from tensorflow.keras.datasets import cifar10
from tensorflow.keras.preprocessing.image import load_img, img_to_array, ImageDataGenerator
import matplotlib.pyplot as plt
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
# x_train = x_train.reshape(-1, 32, 32, 3)
# x_test = x_test.reshape(-1, 32, 32, 3)
x_train = x_train.astype(np.float32)/255.0
x_test = x_test.astype(np.float32)/255.0
def make_model():
model = Sequential()
model.add(Conv2D(input_shape=(32, 32, 3), kernel_size=(3, 3), filters=32, activation='relu'))
model.add(Conv2D(kernel_size=(3, 3), filters=64, activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(10, activation='softmax'))
return model
model = make_model()
model.compile(loss='sparse_categorical_crossentropy', optimizer=tf.keras.optimizers.Adam(), metrics=['accuracy'])
history = model.fit(x_train, y_train, validation_split=0.2, batch_size=64, epochs=30)
model.evaluate(x_test, y_test)
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.xlabel('epoch')
plt.ylabel('accuracy')
plt.legend(['train', 'validation'], loc='best')
plt.show()
|
cs |
위 소스코드를 실행시키면 아래와 같은 출력값을 확인할 수 있다. (테스트 데이터셋, accuracy 70% 내외)

이미지 제너레이터 사용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
from tensorflow.keras.datasets import cifar10
from tensorflow.keras.preprocessing.image import load_img, img_to_array, ImageDataGenerator
import matplotlib.pyplot as plt
# Augmentation을 위해 2가지 함수 사용 가능 -> flow(), flow_from_directory()
# load_img() 함수는 리턴 타입이 jpeg 이므로 numpy 타입으로 변환해주기 위해, img_to_array() 사용
## flow() ##
img_list = []
img_name = ['./chipmonk_1.jpg', './chipmonk_2.jpg', './tiger_1.jpg', './tiger_2.jpg']
imageGenerator = ImageDataGenerator(rotation_range=30, width_shift_range=0.2, shear_range=0.3, horizontal_flip=True)
batch_size = 2
for i in range(len(img_name)):
loaded_img = load_img(img_name[i], target_size=(100, 100))
load_img_array = img_to_array(loaded_img)/255.0
img_list.append(load_img_array)
plt.figure(figsize=(6, 6))
for i in range((len(img_list))):
plt.subplot(1, len(img_list), i+1)
plt.xticks([])
plt.yticks([])
plt.title(img_name[i])
plt.imshow(img_list[i])
plt.show()
data_gen = imageGenerator.flow(np.array(img_list), batch_size=batch_size)
# np.array(img_list) : (100, 100, 3) -> (-1, 100, 100, 3) 4차원 텐서로 변환해주기 위해서
gen_image = data_gen.next() # batch_size=2 개수만큼 이미지 생성
plt.figure(figsize=(6, 6))
for i in range((len(gen_image))):
plt.subplot(1, len(gen_image), i+1)
plt.xticks([])
plt.yticks([])
plt.imshow(gen_image[i])
plt.show()
|
cs |


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
from tensorflow.keras.datasets import cifar10
from tensorflow.keras.preprocessing.image import load_img, img_to_array, ImageDataGenerator
import matplotlib.pyplot as plt
# Augmentation을 위해 2가지 함수 사용 가능 -> flow(), flow_from_directory()
## flow_from_directory() ##
imageGenerator = ImageDataGenerator(rotation_range=30, width_shift_range=0.2, shear_range=0.3,
horizontal_flip=True, rescale=1./255)
batch_size = 2
image_path = './dataset/'
# class_mode : binary, categorical, sparse
data_gen = imageGenerator.flow_from_directory(directory=image_path, batch_size=batch_size,
shuffle=True, target_size=(100, 100), class_mode='categorical')
gen_image, label = data_gen.next()
plt.figure(figsize=(6, 6))
for i in range((len(gen_image))):
plt.subplot(1, len(gen_image), i+1)
plt.xticks([])
plt.yticks([])
plt.title(str(np.argmax(label[i])))
plt.imshow(gen_image[i])
plt.show()
|
cs |

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
from tensorflow.keras.datasets import cifar10
from tensorflow.keras.preprocessing.image import load_img, img_to_array, ImageDataGenerator
import matplotlib.pyplot as plt
# 데이터셋 생성
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
x_train = x_train.astype(np.float32)/255.0
x_test = x_test.astype(np.float32)/255.0
image_gen = ImageDataGenerator(rotation_range=30, shear_range=0.3, width_shift_range=0.3,
height_shift_range=0.3, horizontal_flip=True)
augment_size = int(1.2 * x_train.shape[0]) # 50000 * 1.2 = 60000
random_idx = np.random.randint(x_train.shape[0], size=augment_size)
x_gen = x_train[random_idx].copy() # 원본 데이터 복사
y_gen = y_train[random_idx].copy()
x_gen, y_gen = image_gen.flow(x_gen, y_gen, batch_size=augment_size, shuffle=False).next()
x_train = np.concatenate((x_train, x_gen)) # 원본이미지에 생성된 이미지 합치기
y_train = np.concatenate((y_train, y_gen))
index_list = np.arange(x_train.shape[0]) # 데이터를 랜덤하게 섞음
np.random.shuffle(index_list)
x_train = x_train[index_list]
y_train = y_train[index_list]
# 모델 생성
def make_model():
model = Sequential()
model.add(Conv2D(input_shape=(32, 32, 3), kernel_size=(3, 3), padding='same', filters=32, activation='relu'))
model.add(Conv2D(kernel_size=(3, 3), padding='same', filters=32, activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.2))
model.add(Conv2D(kernel_size=(3, 3), padding='same', filters=64, activation='relu'))
model.add(Conv2D(kernel_size=(3, 3), padding='same', filters=64, activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.2))
model.add(Conv2D(kernel_size=(3, 3), padding='same', filters=128, activation='relu'))
model.add(Conv2D(kernel_size=(3, 3), padding='same', filters=128, activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(10, activation='softmax'))
return model
model = make_model()
model.compile(loss='sparse_categorical_crossentropy', optimizer=tf.keras.optimizers.Adam(), metrics=['accuracy'])
history = model.fit(x_train, y_train, validation_split=0.2, batch_size=128, epochs=200)
model.evaluate(x_test, y_test)
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.xlabel('epoch')
plt.ylabel('accuracy')
plt.legend(['train', 'validation'], loc='best')
plt.show()
|
cs |
이미지 제너레이터 사용 전 : 정확도 70% 내외
이미지 제너레이터 사용 후 : 정확도 80 % 초반
반응형
'머신러닝_딥러닝 > Tensorflow + Keras' 카테고리의 다른 글
(Tensorflow 2.x) CNN 3탄 (Transfer Learning) (0) | 2021.10.23 |
---|---|
(Tensorflow 2.x) CNN 2탄 (With Garbage Classification) (0) | 2021.10.23 |
(Tensorflow 2.x) Fashion MNIST (With CNN) (0) | 2021.10.23 |
(Tensorflow 2.x) MNIST (With CNN) (0) | 2021.10.23 |
(Tensorflow 2.x) Classification (다중 분류) (0) | 2021.10.23 |