Translate

2019년 4월 17일 수요일

R을 이용한 딥러닝 (1)



 앞서 R을 이용한 간단한 신경망 예제에서 계속되는 포스트로 R과 H2O, 케라스 등을 이용한 딥러닝 예제를 살펴보겠습니다. 이미지 인식에서는 고전에 속하는 MNIST로 일단 시작해 보겠습니다. MNIST는 인공지능 분야의 대가 가운데 하나인 얀 르쿤 (Yann LeCun)이 공개한 데이터로 손으로 쓴 글씨를 인식하는 데이터입니다. 총 6만개의 훈련용 데이터셋과 1만개의 테스트 셋으로 구성되어 있으며 각각이 숫자는 28x28 픽셀의 형태입니다. 


원본 파일 받기 : http://yann.lecun.com/exdb/mnist/


 워낙 유명한 데이터셋이라 케라스에서는 기본 데이터로 내장되어 있습니다. 따라서 케라스를 설치한 경우 R에서 바로 불러올 수 있습니다. 앞서 포스팅에서 설명한 바 있습니다. 만약 그렇지 못해도 구글링을 통해서 쉽게 다운로드 받을 수 있을 것입니다. 


 R에서 케라스 설치: https://blog.naver.com/jjy0501/221473685330


 R에서 케라스 설치는 의외로 충돌이 잘 일어나는 부분인데, 이러면 열심히 구글링을 통해서 해결책을 찾는 것이 연구자와 개발자의 숙명 (?)일 것입니다. 일단 여기서는 케라스에서 불러내 H2O에서 예제를 구현해 보겠습니다. 


#MNIST

library(h2o)
library(tidyverse)
library(ggplot2)

#data

library(keras)
model <- keras_model_sequential="" span="">
mnist <- dataset_mnist="" span="">

str(mnist)


> str(mnist)
List of 2
 $ train:List of 2
  ..$ x: int [1:60000, 1:28, 1:28] 0 0 0 0 0 0 0 0 0 0 ...
  ..$ y: int [1:60000(1d)] 5 0 4 1 9 2 1 3 1 4 ...
 $ test :List of 2
  ..$ x: int [1:10000, 1:28, 1:28] 0 0 0 0 0 0 0 0 0 0 ...
  ..$ y: int [1:10000(1d)] 7 2 1 0 4 1 4 9 5 9 ...


 MNIST 데이터는 train과 test 두 개의 리스트로 되어 있으며 X에는 픽셀로 구현된 이미지 데이터가 있고 Y 에는 0-9까지 숫자가 배정되어 있습니다. 일부 값을 이미지로 구현해 보겠습니다. 


mnist_smpl <- mnist="" train="" x="">% tbl_df() %>% 
  sample_n(50)

par(mfrow=c(5,10), mar=c(0.1,0.1,0.1,0.1))

display_digit <- function="" input="" span="">
  m <- byrow="FALSE)</span" input="" matrix="" nrow="28," unlist="">
  m <- 2="" apply="" m="" rev="" span="" t="">
  image(m, col=grey.colors(255), axes=FALSE)
}

for(i in 1:50) {
  display_digit(mnist_smpl[i,])
}




 50개를 불러냈는데, 숫자는 일치하지 않아도 위와 같이 이미지가 나와야 정상입니다. 0-9까지는 비교적 일정하게 분포되어 있는데 ggplot2를 이용해서 각 숫자의 분포를 알 수 있습니다. 


mnist$train$y %>% tbl_df() %>% 
  ggplot(aes(x=as.factor(value), fill=as.factor(value))) +
  geom_bar(stat="count") +
  scale_y_continuous(labels = scales::comma) +
  theme_bw() +
  labs(title="data ", x="number", y="frequency", fill="") +
  theme(legend.position = "right")






 이제 케라스에서 불러온 R 객체를 H2O로 옮겨보겠습니다. 그런데 이 과정도 간단하지가 않습니다. 그냥 train과 test로 나누면 list이기 때문에 객체를 변환하기 어려워서 as.data.frame으로 데이터 프레임으로 바꾼 후 시도했으나 여러 가지 에러 메세지가 나옵니다. 


 #H2O

localH2O = h2o.init(ip = "localhost", port = 54321, startH2O = TRUE,min_mem_size = "10G",nthreads = 8)

train_file <- as.data.frame="" mnist="" span="" train="">
test_file <- as.data.frame="" mnist="" span="" test="">

train<- as.h2o="" destination_frame="train" span="" x="train_file,">
test<- as.h2o="" destination_frame="train" span="" x="test_file,">


 중략 ... 


ERROR MESSAGE:

Provided column type array is unknown.  Cannot proceed with parse due to invalid argument.



 이 에러를 해결하기 위해 여러 가지 해봤으나 실패했고 결국 train과 test 데이터를 csv 파일로 저장한 후 다시 불러들이는 우회적인 방법으로 해결했습니다. 아마도 패키지 자체의 문제로 보입니다. 


write.csv(train_file,"H:/data/deeplearning/MNIST_train.csv",row.names=F,na="")
write.csv(test_file,"H:/data/deeplearning/MNIST_test.csv",row.names=F,na="")

trainfile = "H:/data/deeplearning/MNIST_train.csv"
train = h2o.importFile(path = trainfile,sep=",")

testfile = "H:/data/deeplearning/MNIST_test.csv"
test = h2o.importFile(path = testfile,sep=",")



 만약 이것도 안되는 경우 온라인에서 바로 데이터를 받는 방법도 있습니다. 


#alternative 

train_file <- a="" class="con_link" href="https://h2o-public-test-data.s3.amazonaws.com/bigdata/laptop/mnist/train.csv.gz" style="overflow-wrap: break-word; text-decoration-line: none;" target="_blank">https://h2o-public-test-data.s3.amazonaws.com/bigdata/laptop/mnist/train.csv.gz
"
test_file <- a="" class="con_link" href="https://h2o-public-test-data.s3.amazonaws.com/bigdata/laptop/mnist/test.csv.gz" style="overflow-wrap: break-word; text-decoration-line: none;" target="_blank">https://h2o-public-test-data.s3.amazonaws.com/bigdata/laptop/mnist/test.csv.gz
"

train <- h2o.importfile="" span="" train_file="">
test  <- h2o.importfile="" span="" test_file="">


 데이터 전처리 과정이 길어서 여기서 한 번 끊어고 다음에 이야기를 진행하겠습니다. 


 참고 









댓글 없음:

댓글 쓰기