본 코드는 tensorflow로 구현한 multi class classifier로 구조를 복습하고자 작성했습니다.
데이터 경로에 가서 다운받고 import 하는 과정이 있지만, 기본 logic만 다루는 코드를 정리했습니다.
with open(filename) as file:
csv_reader = csv.reader(file, delimiter=',')
next(csv_reader, None)
labels = []
images = []
for row in csv_reader:
# print(csv_reader)
labels.append(np.array(row[0])) # (20000,) 이런 형태
images.append( np.array(row[1:]).reshape(28,28))# (20000,28,28) 이런 형태
images = np.array(images).astype('float')
labels = np.array(labels).astype('float')
return images, labels
위 과정에서 csv 파일에서 데이터를 접근하는데 이미지의 reshape후 append를 진행하고 맨마지막 list형태를 numpy ndarray 형태로 만들고자 np.array를 사용한 후 return 해줍니다.
여기서 처음에 알아차려하는 것은 나중에 sparse_categorical_crossentropy를 사용해야겠다는 생각입니다. multi class이지만, 하나의 정수형 수치가 label로 주어졌다면 sparse categorical crossentropy를 사용해야합니다. 물론 원 핫 인코딩으로 레이블들을 변경하면 sparse가 아닌 loss를 쓸 수 있습니다.
training_images = np.expand_dims(training_images, -1)
validation_images = np.expand_dims(validation_images, -1)
train_datagen = ImageDataGenerator(rescale=1./255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
)
# Pass in the appropriate arguments to the flow method
train_generator = train_datagen.flow(x=training_images,
y=training_labels,
batch_size=32)
validation_datagen = ImageDataGenerator(rescale=1./255.,
)
validation_generator = validation_datagen.flow(x=validation_images,
y=validation_labels,
batch_size=32)
return train_generator, validation_generator
위 코드에서는 image들의 차원을 grayscale임을 명시하기 위해 1차원을 높여줍니다. expand_dims(index location)을 명시하면 해당 index에 새로운 차원이 생깁니다. ImageDataGenerator로 데이터를 rescale하고, augment 과정을 진행할 수 있습니다.
이전 프로젝트에서 이런 augmentation 방식도 systematic 하기 때문에 raw 데이터만큼의 명시성이 없기에 이 방법을 지양한다고 하셨는데, 이번 강의에서는 그런 내용과 말씀은 없어서 나중에 프로젝트를 더 하면서 차차 알아가볼 예정입니다.
train_generator와 validation_generator를 구하고 이를 return합니다.
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(8,(3,3),activation='relu',input_shape=(28,28,1)),
tf.keras.layers.MaxPooling2D((2,2)),
tf.keras.layers.Conv2D(32,(3,3),activation='relu'),
tf.keras.layers.MaxPooling2D((2,2)),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(1024,activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(26,activation=tf.nn.softmax)
])
model.compile(optimizer = tf.keras.optimizers.RMSprop(learning_rate=0.0001),
loss = 'sparse_categorical_crossentropy',
metrics=['accuracy'])
return model
구조에 대한 이야기는 넘어가고, loss는 아까 위에서 언급한 것처럼 sparse 를 사용합니다.
제가 compile에 대한 자세한 공부는 안했었는데,
Compile defines the loss function, the optimizer and the metrics. That's all.
이라고 합니다. 그래서 optimizer와 loss, metrics 를 명시하는 것이 끝입니다.
model = model # 바로 이 위에 return된 model을 임의로 직접 명시해서 가져온것 (올바른 코드 형식이 아닙니다.)
history = model.fit(train_generator,
epochs=15,
validation_data=validation_generator)
# 모델 fit으로 train하는데 generator를 input으로 넣어줍니다.