앞서 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="">->
데이터 전처리 과정이 길어서 여기서 한 번 끊어고 다음에 이야기를 진행하겠습니다.
참고
댓글
댓글 쓰기