인공지능 과제 31. AND1) codeAND 구분을 위해 사용한 코드를 보면 가장 위에 _CRT_SECURE_NO_WARNINGS를 사용해 파일 입출력으로 인한 에러를 방지했다. 이전의 코드에서는 학습 횟수가 많지 않아도 결과가 나오기에 콘솔 창에 출력하였었는데 이번 과제에서는 학습 횟수가 많아 가중치와 바이어스 업데이트 현황을 텍스트 파일에 출력하기 위해 파일 입출력을 사용했다. 또한 기존에서는 임계 값보다 작으면 0 크면 1로 확실하게 값이 나오는 hard limiting을 활성함수로 사용했으나 이번 과제에서는 활성함수로 시그모이드 함수를 사용했다. 이를 위해 시그모이드 함수에 사용되는 를 편하게 사용하고자 math.h를 헤더에 추가하였다. math.h의 사용으로 exp(-x)의 형태로 를 쉽게 표현할 수 있었다. 또한 목표값과 출력값 차이가 크지 않으면 학습을 진행하지 않도록 하는 코드에 실수의 절댓값을 계산해주는 fabs를 사용했는데 이 함수 또한 math.h를 헤더에 선언함으로써 쉽게 사용할 수 있다. 이번 과제에서는 AND를 Xor에 사용된 코드를 통해 학습하는 것이기 때문에 2개의 입력이 총 4번 들어오고, 하나의 히든 레이어에 두 개의 노드가 있는 구조로 AND 구분을 진행했다. 이 값들은 define을 사용해 미리 사이즈를 정의했다. 가중치와 바이어스 등의 값은 전역변수로 선언해 변경된 값을 저장하기 쉽도록 했다. h가 붙은 것은 hiddne layer를 위한 값들이고 h가 없는 것은 출력 레이어를 위한 값이다. 역전파 방식을 위해서는 각 노드의 net와 이전 노드의 out 값을 알아 두어야 하므로 이를 저장하기 위해 여러 배열을 사용했다. compute는 입력 값과 행을 인자로 받으면 해당 행에 있는 입력 노드의 값을 이용해 net를 구하고 구한 net값을 시그모이드 함수로 넘겨 최종 out을 계산하는 함수이다. 반복문을 통해 입력되는 노드의 수만큼 가중치와 곱한 값을 wx변수에 누적해준다. 누적된 값에 bias까지 더해준 최종 net 값을산한다. 가장 out쪽에 있는 델타는 델타바의 현재 노드의 net값을 시그모이드 미분 함수에 인자로 넣은 결과 값을 곱한 값이다. 이 델타 값을 사용해 가중치와 bias를 구한다. bias도 하나의 가중치처럼 사용되므로 델타를 곱해주고, bias는 이전 노드가 없으므로 이전 노드 값 대신 1을 곱해주는데 1은 생략이 가능하므로 생략했다. output쪽의 가중치를 학습한 후에는 히든 레이어의 가중치 값들을 학습시키기 위해 델타바를 업데이트 해야 한다. 델타바의 업데이트는 이전 델타 값에다 해당 노드로 가는 가중치를 곱한 값이다. 이렇게 구해진 델타 바에 현재 노드의 net값을 시그모이드 미분 함수에 인자로 넣고 얻어진 값을 곱해주면 히든 레이어에서 사용할 델타 값을 구할 수 있다. 이 델타 값을 이용해 히든 레이어의 가중치와 바이어스들을 업데이트 해준다. 그리고 가중치 업데이트에 모멘텀을 사용했다. tmp이름이 붙은 변수에 이전에 가중치 변화량을 저장함으로써 모멘텀과 곱을 계산해 가중치 업데이트에 사용할 수 있도록 했다. 모멘텀 값은 보편적으로 사용하는 값의 범위에 속하는 0.5로 지정했다. 또한 학습에 사용한 bias의 경우 x가 무조건 1로 고정되어 있다고 가정하므로 Bias학습에서는 이전 노드의 값을 따로 표현하지 않고 생략했다. 학습을 끝낸 후 다음 입력 값으로 넘어가기 전에 error변수에 출력과 목표 값의 차의 제곱을 계산해 더해준다. 이 값을 2로 나눈 결과도 텍스트 파일에 함께 출력해 에러 그래프를 그릴 때 사용한다. 00/10/01/11 각 입력에 대해 위의 방법을 반복해가면서 학습을 진행한 후 변화한 가중치과 Bias, error를 텍스트 파일에 문자열로 저장한다.Reset함수는 초기 가중치와 bias값을 설정하는 함수이다. 가중치의 경우 랜덤함수를 사용해 임의의 값을 할당 받는데 이때 W는 rand값을 RAND_MAX + 1로 나누어 주어 0~1까지로 한정된 범위의 값만 할당 받을 수 있다. bias는 랜덤으로 할당 받지 않고 임의로 –1이라이루는 형태로 학습이 진행되고 있음을 관찰할 수 있다. 또한 출력 레이어의 그래프는 (0,1.5)와 (1.5,0) 점을 지나는 기울기가 1인 직선으로 향하는 모습을 볼 수 있다. 이를 통해 AND를 완전히 구분해 내는 그래프는 x절편과 y절편이 각각 1.5인 직선의 그래프이며 이를 성립시키는 가중치 값이 우리가 원하는 AND 목표 값을 출력하는 가중치 값일 것이라는 것을 예상할 수 있다.4) 에러 그래프에러 그래프는 위의 그림과 같이 나온다. 학습횟수 증가함에 따라 에러가 감소하는 형태의 그래프임을 알 수 있다. 약 1000정도 학습이 완료되면 에러가 거의 없고 2000번 이상 학습을 진행하면 에러율이 0에 매우 근접하다는 것을 알 수 있다. 학습을 진행하면서 에러율이 낮아졌으므로 알맞게 학습이 진행되었음을 알 수 있다.2. OR1) codeOR분류의 경우 위의 사진처럼 코드에서 목표로 하는 out값과 결과를 출력할 파일만 바꾸어 주면 된다. AND의 결과가 훼손되지 않고 OR를 따로 저장할 수 있도록 OR의 출력을 저장할 텍스트 파일을 새로 사용한다.2) 결과 화면목표 값이 0111로 학습이 잘 이루어졌음을 보여준다. 각 test는 입력의 각 값을 넣어서 테스트한 결과이며 각 번호의 테스트의 인풋은 AND와 동일하다.3) 학습그래프OR의 학습 그래프 또한 그래프를 그려주는 사이트인 desmos를 이용해 그래프를 그렸다. 학습그래프에는 텍스트파일에 출력한 w값들과 bias 값들을 이용했다. 빨간색과 파란색이 히든 레이어에 있는 두 노드의 그래프이고 초록색이 출력 레이어에 있는 노드를 그래프로 표현한 것이다.* OR 학습 전* OR 10번 학습* OR 100번 학습* OR 250번 학습* OR 500번 학습* OR 7000번 학습 – 최종 학습OR의 경우 반복횟수에 따른 Error 그래프의 감소 변화가 AND와 비교해서 초기의 변화가 매우 커서 AND보다 저 적은 횟수의 학습한 경우를 사용했다. OR를 구분하는 학습그래프를 그려보면 AND와는 다르게 하든 레이어로 알 수 있다. XOR구분을 위해서는 히든 레이어 사용이 필수적이다.4) 에러그래프반복횟수에 따른 에러 그래프를 보면 처음에 급격히 에러율이 감했다가 반복횟수가 200번 정도일 때까지 에러율이 감소하지 않고 정체되어 있는 모습을 보인다. 그러다 반복횟수가 400~500번 정도 되면 다시 에러율이 낮아지기 시작한다. 에러율이 중간에 정체되어 있는 부분에서 코드에서 오차가 0.01보다 작으면 학습을 진행하지 않고 파일에 출력하게 했는데 그것 때문에 정체되어 있는 모양이 나온 것인가 하고 출력된 엑셀 파일을 보니 가중치는 꾸준히 변하고 있었다. 다만 그 변화가 매우 미미해서 에러 그래프를 그렸을 때 정체되어 있는 것처럼 보이는 것이었다. 에러율 그래프는 반복횟수가 1000이 될 때 까지는 에러가 빠르게 줄어드는 모습을 보이다 1000번을 넘어서면 에러율의 감소폭이 작아진다. 그래도 3000번 까지는 에러율이 꾸준히 감소하는 모양을 보이면서 반복횟수가 3000번을 넘어가서는 에러율이 0에 수렴하는 형태임을 볼 수 있다. AND의 에러그래프는 반복횟수가 2000번을 넘어 가서부터 0에 수렴하고 OR의 에러그래프는 반복횟수가 1000번도 채 되기 전에 에러율이 0에 수렴하는 것에 비해서 XOR는 위의 다른 두 개 보다 더 많은 학습이 필요한 것을 알 수 있다. 이는 XOR의 학습이 다른 두 개의 비해 어렵고 필수로 출력 레이어만큼 hidden layer의 학습도 중요하기 때문에 더 많은 업데이트가 필요하기 때문으로 보인다. 전제척으로는 학습이 반복됨에 따라 에러율이 0에 수렴하는 형태의 그래프가 그려졌으므로 XOR학습이 알맞게 이루어졌음을 확인할 수 있다.5) 오류 분석위의 코드를 반복해서 실행하다 보면 간혹 위의 사진처럼 제대로 학습을 하지 못한 상태에서 학습이 종료되는 경우가 발생한다. 이를 해결하기 위해 반복횟수를 10000번 이상으로 늘려서 학습해 보기도 하고 학습률을 증가시키거나 감소시켜서 학습률의 값을 여러가지로 바꾸어 가면서 실행을 반복해 보아도 처음에 임인 000000001에 근접한 값이 나온 것을 알 수 있다. 각 테스트에 대해 test1은 (0.0,0.0), test2는 (0.0,1.0), test3은 (1.0,0.0), test4는 (1.0,1.0), test5는 (0.5,1.0), test6은 (1.0,0.5), test7은 (0.0,0.5), test8은 (0.5,0.0), test9는 (0.5,0.5)를 의미한다.3) 학습 그래프Doughnut 또한 desmos를 이용해 그래프를 그렸다. 텍스트파일에 출력한 w값들과 bias 값들을 이용했고 이들 중 일부만 선정해 그래프로 표현했다. 빨간색과 파란색이 히든 레이어에 있는 두 노드의 그래프이고 초록색이 출력 레이어에 있는 노드를 그래프로 표현한 것이다.* Doughnut 학습 전* Doughnut 5번 학습* Doughnut 10번 학습* Doughnut 1500번 학습* Doughnut 2000번 학습* Doughnut 3000번 학습* Doughnut 4000번 학습* Doughnut 7000번 학습Doughnut의 학습 그래프를 보면 학습을 진행하면서 히든 레이어에 있는 두 개의 노드의 학습 그래프는 서로 평행해지는 방향으로 바뀌고 출력 레이어의 학습 그래프는 기울기가 1인 직선으로 향하고 있는 것을 볼 수 있다. Doughnut역시 완벽한 구분을 위해서는 하나의 직선의 그래프로는 불가능 하고 히든 레이어의 사용이 필수적이다. 위의 학습 그래프 그림에서 히든 레이어의 노드의 학습 그래프가 없다면 목표로 하는 값으로 구분이 불가능하다. 또한 Doughnut 구분 학습 그래프 결과를 보면 XOR구분과 방향만 다를 뿐 유사한 형태의 그래프가 나온 것을 볼 수 있다.Doughnut 학습그래프XOR 학습그래프4) 에러 그래프Doughnut의 반복횟수에 따른 에러율을 보면 초반에 급격히 감소하다 학습 횟수가 2000번을 넘어가기 전까지 에러율이 감소하지 않고 정체되어 있다가 학습횟수가 약 2200번 정도 될 때부터 다시 에러율이 감소하기 시작한다. 3000.
인공지능 과제4: Mnist데이터 CNN 최적화수업 자료의 경우위의 경우는 수업 자료로 사용된 코드를 그대로 입력한 경우이다. 수업 자료의 경우 i%500==0이라 500번에 한 번씩 테스트하고 그 결과를 출력하지만 출력결과를 한 화면에 보기 쉽도록 i%1000==0 으로만 바꾸어 코드를 실행시켜보았다. 정확도는 99%정도로 매우 높으며 loss는 260~290정도가 나오는 것을 확인할 수 있다.필수 조건을 만족한 경우필터의 크기 변경convolution레이어의 필터의 크기는 수업 자료의 경우 5*5로 설정되어 있다. 이것을 과제 지정 형식인 3*3으로 모두 변경시켰다.레이어 수 증가레이어 수를 하나 이상 증가시키는 것이 과제의 필수 조건 중 하나이기 때문에 Fully Connected layer와 convolution and pooling layer사이에 새로운 convolution and pooling layer를 추가했다. 3번째 convolution and pooling layer레이어는 128개의 필터를 사용하고 이 레이어까지 거치면 이미지는 4*4 크기의 128개로 축소된다.필수로 변경해야 하는 것만 변경한 결과 값은 아래와 같다.필수로 바꾸어야 하는 부분을 바꾼 후 결과를 보면 정확도는 0.99정도가 나오고 loss는 220~295사이의 값이 나오는 것을 확인할 수 있다.코드를 확장한 경우여러가지 방식을 사용해 코드를 변형해보았다.레이어 추가 및 활성함수 변경기본으로 추가한 3번째 convolution and pooling layer에 이어 이미지 사이즈를 1*1까지 축소시키도록 레이어를 추가했다. 수업 내용 중 1*1이 될 때까지 convolution과 pooling을 사용한다는 내용이 있기에 이를 반영했다. 4번째 레이어까지는 필터의 수를 두 배로 늘리다가 마지막의 5번째 convolution and pooling layer에서는 4번째 레이어의 필터 수와 동일한 값을 주었다. 그 이유는 마지막 필터 수를 4번째 필터 수인 256의 두배인 51 방식을 테스트 해본 결과 큰 차이가 없어 어느 것을 사용하는 것이 더 좋을 지 알아보다가 he_normal이 ReLU활성화함수에 더 적합하다는 글을 읽고 he_normal을 사용했다.바이어스의 경우 0으로 되어 있는 부분을 random하게 받도록 했다. 가중치가 0인 경우 무엇을 곱하든 0이 나오기 때문에 학습이 원활하게 진행되지 않을 가능성이 있기 때문이다.또한 마지막 결과를 구하기 전의 Fully connected layer의 출력을 1024에서 4096으로 늘려 학습의 성능을 높이고자 하였다.Loss 함수 수정 및 learning rate기존의 경우 softmax를 계산한 후에 loss를 따로 계산하는 방식이었는데 이렇게 하는 방식은 출력 부분에 nan이 나타날 가능성이 높기 때문에 loss와 softmax 계산을 같이 해주는 softmax_cross_entropy_with_logits_v2를 적용했다.위의 사진은 수업 자료에 있는 코드에서 loss부분만 바꾼 것이다. 테스트 결과 기존 loss와 동일한 결과가 나오는 것을 확인할 수 있다.learnig rate도 0.0001에서 0.0005로 변경했다. 교재에서 변형하기 전의 원본 코드에서 얻어진 최적의 learning rate가 0.0005라고 해서 해당 값을 그대로 사용했다.학습 횟수 및 배치 비율매 레이어 마다 drop out을 하고 있기 때문에 마지막 fully connected layer에서 drop out 비율이 0.5까지 갈 필요가 없다고 판단했다. 그래서 0.5보다 큰 값인 0.8로 비율을 변경했다. 또 학습의 정확도를 향상하기 위해 학습횟수를 50000번으로 늘렸고 횟수를 늘린 만큼 속도를 높이기 위해 batch size를 250으로 증가시켰다. 기존의 코드였다면 overfitting이 발생해 nan이 나올 수 있는 횟수지만 확장을 통해 overfitting에 대비했기 때문에 안정적으로 코드가 동작하는 모습을 확인할 수 있다. 테스트해 보면서 랜덤으로 값을 받기 때문에 어떤 경우는 10단해 정규화 부분을 주석 처리했다.전체코드%tensorflow_version 1.ximport tensorflow as tfimport numpy as npimport matplotlib.pyplot as pltimport _pickle as pickleimport mathfrom tensorflow.examples.tutorials.mnist import input_datanp.random.seed(2017920031)tf.set_random_seed(2017920031)keep_prob = tf.placeholder(tf.float32)phase_train = tf.placeholder(tf.bool, name='phaase_train')mnist = input_data.read_data_sets("/tmp/data/", one_hot=True)def xavier_init(n_inputs, n_outputs, uniform=True):"""Set the parameter initialization using the method described.This method is designed to keep the scale of the gradients roughly the samein all layers.Xavier Glorot and Yoshua Bengio (2010):Understanding the difficulty of training deep feedforward neuralnetworks. International conference on artificial intelligence andstatistics.Args:n_inputs: The number of input nodes into each output.n_outputs: The number of output nodes for each input.uniform: If true use a uniform distribution, otherwise use a normal.Returns:An init,28,28,1]) #입력을 이밎로 인식하기 위한 변환#28*28*1W_conv1 = tf.Variable(tf.truncated_normal([3,3,1,num_filters1], stddev=0.1)) #3*3 크기의 필터 32장h_conv1 = tf.nn.conv2d(x_image, W_conv1, strides=[1,1,1,1], padding='SAME') #convolution 연산#x이미지에 W_conv1 필터로 convolution -> 필터는 1칸씩 움직인다, , 패딩은 출력에 맞게 제공b_conv1 = tf.Variable(tf.truncated_normal([num_filters1], stddev=0.1)) #각 필터에 대한 바이어스 = 필터수인 32만큼bn_conv1 = batch_norm(h_conv1,num_filters1,phase_train)h_conv1_cutoff = tf.nn.leaky_relu(bn_conv1 + b_conv1) #con결과에 ReLU 액티베이션h_pool1 = tf.nn.max_pool(h_conv1_cutoff, ksize=[1,2,2,1], strides=[1,2,2,1], padding='SAME')# pooling통해 이미지 축소 -> 의미있는 값만 가져옴h_pool1 = tf.nn.dropout(h_pool1,0.8)#h_pool1 결과 layer1 - ? *14*14*32num_filters2 = 64W_conv2 = tf.Variable( tf.truncated_normal([3,3,num_filters1,num_filters2], stddev=0.1))h_conv2 = tf.nn.conv2d(h_pool1, W_conv2, strides=[1,1,1,1], padding='SAME')b_conv2 = tf.Variable(tf.constant(0.1, shape=[num_filters2]))bn_conv2 = batch_norm(h_conv2,num_filters2,phase_train)h_c'SAME')h_pool5 = tf.nn.dropout(h_pool5,0.8)h_pool4_flat = tf.reshape(h_pool5, [-1, 1*1*num_filters5])#fully를 위해 1차원 배열로 변환num_units2 = 1*1*num_filters5 #입력num_units3 = 4096 #출력#w4 = tf.Variable(tf.truncated_normal([num_units2, num_units3]))#tf.contrib.layers.variance_scaling_initializer() = he normalizew4 =tf.get_variable("w4", shape=[num_units2, num_units3],initializer=tf.contrib.layers.variance_scaling_initializer())#w4 = tf.get_variable("w4",shape=[num_units2, num_units3], initializer=xavier_init(num_units2, num_units3))b4 = tf.Variable(tf.constant(0.1, shape=[num_units3]))hidden4 = tf.nn.relu(tf.matmul(h_pool4_flat, w4) + b4)hidden4_drop = tf.nn.dropout(hidden4,keep_prob)w0 =tf.get_variable("w0", shape=[num_units3,10],initializer=tf.contrib.layers.variance_scaling_initializer())b0 = tf.Variable(tf.random_normal([10]))p = tf.matmul(hidden4_drop, w0) + b0t = tf.placeholder(tf.float32, [None, 10]) #out#loss =-tf.reduce_sum(t * tf.log(p))loss = tf.reduce_sum(tf.nn.softmax_cross_entropyst')
경계의 허묾 SEQ _ * ARABIC 1 [작품명] 둘이서 언제까지나 [작가명] JUNE [재료] 잘모르겠음 [제작년도] 2019JUNE의 ‘다른 이름으로 저장하기’ 개인전을 다녀왔다. 다른 이름으로 저장하기 란 보통 컴퓨터에서 파일의 다른 버전을 만들어 원본과 함께 유지하기 위해 사용한다. 이 전시회의 대부분의 작품은 일상에서 쉽게 볼 수 있는 모습과 쉽게 보기 어려운 우주를 결합한 모습이다. 전시회의 이름은 작품이 현실에 기반을 두고 약간의 변형을 가한 다른 이름으로 저장된 다른 이름의 현실이라는 것을 전달하고자 하는 것 같다.이 전시회장은 전시공간과 휴게공간의 경계가 명시적으로 구분되어 있지 않다는 특징이 있다. 그렇게 때문에 휴게공간에 전시된 일부 작품의 경우 현실에서 분리되지 못해 예술 작품 보다 장식으로서 존재하는 것으로 볼 수 있다. 그래서 작가는 휴게 공간에 있는 작품에 대해 개별 조명과 QR코드로 연결되는 작품 설명을 부착함으로써 비현실성을 부여해 현실로부터 분리해냈다. 이러한 방식은 이 전시회의 제목과 같이 휴게 공간인 현실적 공간을 전시 공간이라는 가상성이 존재하는 다른 이름으로 저장할 수 있음을 보여준다. 이 전시회의 각 작품에 대한 설명을 작품 하단에 존재하는 QR코드를 통해 볼 수 있는데 이는 전시장소가 물리적인 공간에서 인터넷이라는 디지털 공간까지 확장되었다고 볼 수 있다. QR코드로 연결된 디지털 공간에서 작품명과 제작연도, 작가이름, 작품 설명이 존재함으로써 디지털 공간에서 또한 일반적인 이미지와 구별되는 비현실적 조건을 부여함으로 인터넷 상의 그림이 작품임을 드러냈다. 디지털 공간이 전시장과 같은 역할을 수행해 인터넷 상의 그림과 현실의 그림이 연결되어 하나의 예술 작품으로 형상화한 시도가 돋보인다.전시회에서 가장 먼저 눈에 들어온 작품은 ‘둘이서 언제까지나’라는 제목의 작품이다. 그림의 두 인물이 쓰고 있는 둥근 막으로 현재 두 인물이 위치한 곳이 우주라는 것을 드러낸다. 또한 하얗게 샌 머리와 지팡이로 인물의 나이가 많음을 짐작할 수 작품의 제목을 보아 두 노부부의 낭만적인 모습을 그렸다고 볼 수도 있지만, 모래와 달에 회색과 흰색이라는 차가운 느낌을 주는 색을 사용하고 그림에서 다른 인물이 등장하지 않아 고독과 외로움을 표현하고 있다. 현대에 오면서 개인주의의 확산으로 부모를 챙기지 않는 현상을 그리고 있는 것으로 보인다. 의지할 사람이 서로 밖에 없는 두 인물은 둘 중 하나가 먼저 떠나버리면 아무것도 없는 사막에 혼자 남겨지게 된다. 그런 상황에서 두 인물은 길도 이정표도 없는 사막을 오로지 달을 향해서만 걸어가고 있다. 둘만이라는 것이 얼핏 보면 낭만적으로도 보일 수 있으나 배경을 사막으로 설정함으로써 작가는 둘만이라는 것의 쓸쓸함을 강조하고자 한 것으로 보인다. 걸어가는 두 인물의 뒤를 보면 그림자가 생긴 것을 볼 수 있는데 이것으로 달이 현재 빛나고 있다는 것을 알 수 있다. 이 작품에서 달은 인물이 의지할 수 있고, 욕망하는 무언가로 볼 수 있으며 두 인물이 계속해서 나아갈 수 있는 목표의 역할을 하고 있다고 생각 할 수 있다. 달이 빛난다는 것을 표현한 것은 이러한 역할을 더욱 강조하기 위한 방법으로 사용되었다고 볼 수 있다. 또한 달의 왼쪽을 보면 주홍빛의 붉은 구름처럼 모래먼지로 보이는 것이 존재하는데 이로 인해 달이 아닌 태양의 모습이 떠오르면서 마치 노을이 지고 있는 것처럼 보이게 한다. 이것은 이 두 인물의 목표하는 달이라는 것은 차갑기만 한 것이 아니라 온기를 가지고 있다는 것을 보여준다. 이 주홍빛으로 작품이 가지는 차갑고 쓸쓸한 느낌을 완화시켜주며 자칫 단조로울 수 있는 작품의 색감을 더욱 풍부하게 해 주었다고 볼 수 있다.두 번째 작품은 ‘달을 만지는 아기’라는 이름의 작품으로 ‘둘이서 언제까지나’ 와 구도는 유사한데 색감이 상반되어 다른 느낌을 주기 때문에 이 작품을 선택했다. ‘달을 만지는 아기’라는 이 작품은 푸른 계열의 색을 사용한 하늘과 채도가 낮은 회색으로 아기를 표현해 붉은색을 가진 달의 색이 두드러지게 함으로서 달에 대한 집중도를 높였다. 보편적으로 달이라고 하면 흰색이나 노란색과 같은 밝고 연한 계열의 색을 사용해 표현하는데 이 작품은 달을 붉은 색으로 표현했다. 우주에서 빛나는 별들은 색으로 나이를 구분하는데 푸른색이나 하얀색은 별의 나이가 적고, 붉은 색은 나이가 많음을 드러낸다. 이에 기반해서 달을 붉은 색으로 표현한 이유를 추론해보면 달의 나이가 많음을 표현함으로써 어린 아기와의 차이를 두드러지게 하려는 작가의 의도인 것으로 보인다. 달의 옆에 존재하는 아기는 무채색으로 표현되었는데 이는 이 작품에 등장하는 아기는 진짜 어린 아이를 표현한 것이 아니라 달의 관점에서 어린 것을 의미한다고 보인다. 즉 상대적으로 인간은 달에 비하면 모두 아기에 불가하다는 의미를 담고 있는 것으로 해석된다. 어린 아기를 인간으로 보면 ‘달을 만지는 아기’라는 작품은 달로부터 시작된 인간의 우주에 대한 열망과 호기심으로 마침내 인간이 달에 도달한 것을 상징적으로 그려냈다고 볼 수 있다. 또한 구름을 표현함으로써 아기가 현재 매우 높은 위치에 있음을 알 수 있는데 아기가 이러한 높은 위치에 존재하게 하는 수단으로 풍선을 사용해 마치 영화 UP을 연상시킨다. 이는 작가가 인간이 달에 도달한 원동력이 영화 up에서 집을 들어올리는 풍선처럼 동화적인 상상력, 공상이라는 것을 말하고자 한 것으로 보인다.두 작품을 동시에 두고 비교해보면 중심에 달이 존재하고 달의 아래 부분이 다른 것으로 가려졌으며 등장하는 인물이 달을 향한다는 공통점이 있다. 그러나 왼쪽의 ‘둘이서 언제까지나’의 경우 인물이 노인이고 회색 사막 배경과 부드러운 색채를 사용한 달의 모습에서 정적이고 고요한 분위기를 생성하는 반면 오른쪽의 ‘달을 만지는 아기’는 인물이 아기이고 푸른 하늘과 구름 배경에 분홍 풍선과 붉은 달과 같이 선명한 색을 사용해 뚜렷하고 강렬한 분위기를 발생시킨다는 차이가 있다. 또한 두 작품은 전시되어 있는 위치상에서도 차이가 있는데, ‘둘이서 언제까지나’는 전시공간에 존재하기 때문에 공간의 가상성으로 예술 작품임이 명확하게 드러나 있다. 그러나 ‘달을 만지는 아기’의 경우 휴게공간에 위치해 얼핏 보면 전시 작품이 아닌 휴게 공간의 장식으로 착각할 수 있게 존재한다. 그렇기 때문에 현실의 물건처럼 보이지만 작가는 이 작품에도 QR코드와 전용 조명을 사용함으로써 비현실성을 추가해 예술작품임을 드러냈다.JUNE 작가의 이번 전시회의 핵심은 경계를 허물었다는 것에 있다고 보인다. 우선 작품들을 보면 현실과 상상의 경계를 허물어 현실적 요소와 상상의 요소를 결합했다. 일상의 모습과 우주를 결합해 현실의 모습이 새롭게 다가올 수 있도록 했다. 다음으로 전시공간과 휴게공간을 허물어 작품을 위치시켰다. 휴게 공간에 위치한 작품의 경우 작품임을 드러내기 위해 작품 설명이 담긴 QR코드를 배치하고 전용 조명을 사용해 현실의 물건과 구분되도록 했다. 마지막으로 물리적 공간과 디지털 공간을 허물어 QR코드를 통해 연결시켰다. 코드로 연결된 인터넷 공간에 작품 이미지와 작품 설명, 제작연도 등을 제공해 전시 공간을 인터넷 상의 디지털 공간으로 확장했다. 이처럼 경계를 허무는 작가의 시도는 기존의 것과 새로운 것의 경계를 허물어 기존의 것과 동시에 존재하는 새로운 것 즉, 다른 이름으로 저장된 것을 만들어냈다고 볼 수 있다.
1. 가로 숫자 증가, 숫자를 별로 변환가능(i -> *)******012345******012345******012345******012345******012345******012345int main (void){int i,num;for(num=0;num<6;num++){for(i=0; i<6; i++)printf("%d", i);printf("n");}return 0;}2. 같은줄 동일 문자, 내려갈수록 수 증가, 숫자를 별로 변환가능(i -> *)******000000******111111******222222******333333******444444******555555int main(void){int i, num;for(num=0;num<6;num++){for(i=0; i<6; i++)printf("%d",num);printf("n");}return 0;}