tensorflow multi class classification

Lee Hyun Joon ·2022년 7월 19일
0

ML_Basic

목록 보기
10/14

Tensorflow multi class mini codes

본 코드는 tensorflow로 구현한 multi class classifier로 구조를 복습하고자 작성했습니다.
데이터 경로에 가서 다운받고 import 하는 과정이 있지만, 기본 logic만 다루는 코드를 정리했습니다.

우선 데이터 preprocessing 과정을 통해 학습에 필요한 데이터를 준비합니다.

 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를 쓸 수 있습니다.

Image dataset 접근을 위해 ImageDataGenerator를 씁니다.

  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합니다.

모델 구조를 구현하고 compile을 진행합니다.

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으로 넣어줍니다.
profile
우당탕탕 개발 지망생

0개의 댓글