2017의 게시물 표시

#7 <처음 읽는 로마사>를 읽으며..

이미지
책 정보 저자 : 모토무라 료지 출판사 : 교유서가 이 독서의 주된 이유는 로마사에 대해 공부하기 위해서 이다.  또한 콜린 메컬로의 책을 읽고 싶어서 이 책을 선행 학습으로 읽었다. 평소에 로마에 대한 관심이 많았다.  그래서 콜린 메컬로의 <마스터즈 오브 로마> 시리즈 전권을 읽고 싶었다. 하지만 시리즈의 첫번째인 로마의 일인자를 앞부분만 읽었는데 배경 지식이 부족해 이해가 가지 않았다. 그래서 배경 지식을 좀 학습하고자 이 책을 먼저 읽기 시작한 것이다. 이 책은 기승전결로 나뉘며 기승전결에 포함된 7가지 질문에 답하는 형식이다. 기 1. 왜 로마인은 공화정을 선택했을까? 2. 왜 로마군은 강했을까? 승 3. 왜 로마는 대제국이 되었을까? 4. 왜 로마는 속주민에까지 시민권을 주었을까? 전 5. 왜 황제는 빵과 서커스를 제공했을까? 6. 왜 그리스도교는 탄압을 받았을까? 결 7. 왜 로마는 멸망했을까? 위 내용들을 모두 열거하며 정리할 수는 없으니 각 장마다 내가 생각하는 중요한 부분들을 정리하는 형식으로 글을 써야겠다. 로마 건국 시기에는 왕정이었다. 하지만 기원전 509년, 로마는 원로원이 루키웃흐 타르퀴니우스 수페르부스를 추방하는 방식으로 왕정에서 원로원 중심의 공화정 국가로 이행했다. 저자는 왕을 추방하고 또 왕을 뽑을 수도 있었는데 원로원 중심의 공화정을 택했는가라는 질문에 로마인 정신인 '나는 자유인이다.'라는 정신이 작용했다고 한다. 하지만 내 생각은 조금 다르다.  대부분 인간은 남이 잘 되는 꼴을 잘 못 본다. 그리고 원로원 내에서 내가 좋아하지 않는 사람이 왕이 되는 꼴을 못 볼 것이다. 그래서 권력을 공정하고 나누는 방식을 택한 듯하다. 집정관이라는 직무에 두 명의 사람으로 구성한 것도 같은 이유인 것 같다.  로마가 공화정을 선택할 시기에 그리스 또한 ...

#8 <세일즈맨의 죽음>을 읽으며..

이미지
책 정보 저자 : 아서 밀러 출판사 : 민음사  신곡과 대학.중용 시험을 마치고 이제 세일즈맨의 죽음이라는 책을 선택하여 시험을 봤다. 통과 후 쓰는 독후감이다보니 후련하다. 사실 이 책을 선택하게 된 계기는 가장 얇은 책이었기 때문이다. 200페이지도 되지 않는다. 하지만 짧은 내용 속에 많은 것이 담겨져있다. 배경은 미국 대공황 시기이다. 아메리칸 드림이 깨지는 순간을 잘 묘사해냈다. 이 책의 저자인 아서 밀러는 자신의 삼촌을 모티브로 이 책을 썼다고 한다. 저자의 삼촌과 이 책의 주인공인 윌리는 많이 닮았다. 미국은 공급이 넘치고 수요가 따라가지 못할 때 세일즈맨이라는 직업이 히트를 쳤다고 한다. 모두가 풍부한 시기인 아메리칸 드림이었다. 하지만 대공황을 맞딱뜨리고 세일즈맨은 물론 모두 무너지고 만다. 그 시대의 한 가정의 세일즈맨이라는 직업을 가진 아버지가 무너지는 과정을 그리고 있다. 그 과정 속에서 가족간의 충돌, 이웃 친구간의 충돌 등 일반 시민들이 겪을 가능성이 있는 소재가 나타난다. 주인공 윌리는 너무 힘든 상황을 겪을 때마다 과거를 회상하는데 주로 아들들과 좋은 추억들을 떠올리며 그 회상 속으로 빠져든다. 윌리는 자신의 아들들은 굉장히 대단하다고 믿고 좋은 측면만 바라보는 아버지이다. 하지만 현실은 그렇지 못한 아들들이 되어버리고 만다. 첫째인 비프는 미식축구 선수로 고등학교 때부터 멋진 활약을 하지만 아버지의 불륜 현장을 목격하고 좌절한 뒤 모든 것을 포기한다. 3개의 좋은 대학에서 스카웃 제의를 했지만 비프는 수학 낙제를 지우지 못하고 대학에 들어가지 못한다. 둘째인 해피는 여자를 좋아하는 바람둥이로 나온다. 해피는 책에서 큰 역할을 하지 않지만 비프와 윌리 사이에서 중재하는 역할을 한다. 윌리의 아내인 린다는 헌신적인 아내이다. 남편이 기죽을까봐 수입에 대해 얘기하지 않고 자식들에게 아버지를 좀 도와달라고 한다. 마지막에도 윌리의 묘 앞에서 독백하는 장면에서 윌리를 ...

Chapter01-02 Reinforcement Learning

Chapter 01-02. 수업 소개 & OpenAI Gym Sung kim님의 유뷰트 강의 에서 공부한 내용을 정리하고자 한다. 강화 학습은 공부할 수 있는 기회가 별로 없기 때문에 소중한 자료이기도 하다. 대부분이 알듯이 게임 분야에만 특화된 것이 아니라 회계, 비즈니스, 메디아 등 여러 분야에 투입될 수 있다. 예상 독자는 의지만 있으면 누구나 가능하다고 하니 다행이다. tensorflow와 python 으로 예제를 수행하기 때문에 나와 매우 적합하다고 판단하여 이 강의를 선택하게 됐다. OpenAI Gym 은 강화학습에서 환경 설정을 해주는 프레임 워크이다. 특정한 환경 안에서 Action과 State를 가지고 Agent가 학습하게 된다. """ * Reinforcement Learning """ import gym import tensorflow as tf from gym.envs.registration import register import sys, tty, termios class _Getch : def __call__ (self) : fd = sys.stdin.fileno() old_settings = termios.tcgetattr(fd) try : tty.setraw(sys.stdin.fileno()) ch = sys.stdin.read( 3 ) finally : termios.tcsetattr(fd, termios.TCSADRAIN,old_settings) return ch inkey = _Getch() LEFT = 0 DOWN = 1 RIGHT = 2 UP = 3 arrow_keys = { '\x1b[A' : UP, '\x1b[B' : D...

Deep Learning with Standford Tutorial heart.csv data ( keras )

''' * llewyn 17.03.02 * 3 Layers Neural Network using Stanford-Tutorial's heart.csv data ''' from keras.models import Sequential from keras.layers import Dense, Dropout from sklearn.model_selection import train_test_split import pandas as pd import os ''' * Set up Paths and Numbers ''' DATA_PATH = os.getcwd() + '/data/heart.csv' FEATURE_NUM = 9 BATCH_SIZE = 50 HIDDEN1_SIZE = 32 HIDDEN2_SIZE = 13 OUTPUT = 1 MAX_RANGE = 5000 ''' -------------------- Preprocessing ------------------- * Read csv data and split to label and features * Change 'Present' in 'famhist' feature to 1.0 float --> I think there is another way to do that. * Make dataframe to list in order to insert to train_test_split function. ''' features_str = [] feature_cols = [ i for i in range( 9 ) ] label_col = [ 9 ] features_df = pd.read_csv(DATA_PATH, header= 0 , usecols = feature_cols) label_...

Deep Learning with Standford Tutorial heart.csv data (tensorflow)

''' * llewyn 17.03.02 * 3 Layers Neural Network using Stanford-Tutorial's heart.csv data ''' import tensorflow as tf import os ''' * Set up Paths ( Checkpoints, Summary, Data ) ''' SUMMARY_PATH = os.getcwd() + '/summary/' CKPT_PATH = os.getcwd() + "/ckpt/heart.ckpt" DATA_PATH = os.getcwd() + '/data/heart.csv' DATA_LIST = [DATA_PATH] ''' * Set up Numbers ''' FEATURE_NUM = 9 BATCH_SIZE = 50 CLASSES = 2 HIDDEN1_SIZE = 30 HIDDEN2_SIZE = 10 MAX_RANGE = 1000 ''' * Get data using tensorflow and put it to queue ''' data_queue = tf.train.string_input_producer(DATA_LIST) reader = tf.TextLineReader(skip_header_lines= 1 ) _, value = reader.read(data_queue) ''' * Set up records for csv format ''' record_defaults = [[ 1.0 ] for _ in range(FEATURE_NUM)] record_defaults[ 4 ] = [ '' ] record_defaults.append([ 1 ]) ...

Tensorflow Chapter 6. 파일 불러오기

Chapter 6. 파일 불러오기 6강에서는 파일 불러오기를 완벽히 가르쳐주지 않고 다음 강의인 7강에 내용을 보충하여 설명해주셨다. 파일 뿐만 아니라 7강에서는 이미지 또한 불러오는 내용도 추가했다. 하지만 pandas 처럼 간단하지 않고 queue 에 넣고 queue_runner와 Coordinator를 실행해 하나씩 파일을 꺼내야 한다. 결론적으로 이미지를 불러오는 코드를 공부해봐야겠다. 강의에서 오류 없이 돌아가지만 내 컴퓨터에서 돌아가지 않는 코드는 일부 수정했다. 아래 코드는 강의를 8강까지 더 듣고 수정했다. csv 파일과 image파일을 읽어 오는 코드이다. import tensorflow as tf from PIL import Image IMAGE_PATH = '../data/Face00001.png' LABEL_PATH = '../data/Label.csv' IMAGE_LIST = [ IMAGE_PATH ] LABEL_LIST = [ LABEL_PATH ] IMAGE_WIDTH = 49 IMAGE_HEIGHT = 61 label_queue = tf.train.string_input_producer(LABEL_LIST) image_queue = tf.train.string_input_producer(IMAGE_LIST) reader_csv = tf.TextLineReader() reader_image = tf.WholeFileReader() label_key, label_value = reader_csv.read(label_queue) key, value = reader_image.read(image_queue) image_decoded = tf.image.decode_png(value) label_decoded = tf.decode_csv(label_value,record_defaults = [[ 0 ]]) x = tf.cast(image_decoded, tf.float32) ...

Tensorflow Chapter 7. CNN

Chapter 7-8. CNN 이번 강의에서는 cnn을 공부했다. dimension 때문에 한참 다시 봤던 것 같다. 아직도 완벽히 이해하지 못했다. cs231n 강의를 봐야 cnn에 대한 이해도가 좀 높아질것 같다. 텐서에 대한 차원만 이해해도 반은 이해할 것 같다. 왜 None으로 선언을 하는지 reshape에 -1은 무엇인지 이런 것들에 대한 해답을 찾는데 시간을 다 써버렸다. 이 두개를 통해 깨달은 것은 텐서플로우는 똑똑한 라이브러리라는 것이다. reshape에서 -1은 행렬에 맞게 나머지 차원을 알아서 잡아주고 placeholder에서 None도 나머지 행렬만 맞으면 알아서 넣어준다. import tensorflow as tf from PIL import Image IMAGE_PATH = '../data/Face00001.png' LABEL_PATH = '../data/Label.csv' IMAGE_LIST = [ IMAGE_PATH ] LABEL_LIST = [ LABEL_PATH ] IMAGE_WIDTH = 49 IMAGE_HEIGHT = 61 label_queue = tf.train.string_input_producer(LABEL_LIST) image_queue = tf.train.string_input_producer(IMAGE_LIST) reader_csv = tf.TextLineReader() reader_image = tf.WholeFileReader() label_key, label_value = reader_csv.read(label_queue) key, value = reader_image.read(image_queue) image_decoded = tf.image.decode_png(value) label_decoded = tf.decode_csv(label_value,record_defaults = [[ 0 ]]) x = tf.cast(image_decoded...

Tensorflow Chapter 5. 텐서보드 활용

이미지
Chapter 5. 텐서보드 활용 이번에는 텐서보드를 작성하는 강의를 보았다. 저번에도 해봤지만 참 멋있는기능이라고 생각한다. 구글은 참 대단한 기업이라는 생각이 절로 나게 하는 기능이다. 강의의 시작 부분은 파이썬의 with 문법으로 시작한다. 보통 파일 입출력에 많이 쓰이는 문법이다. close하기 귀찮을 때 자주 사용한다고 한다. 또한 텐서플로우에서도 Session을 파일로 생각해서 with 문법을 사용하는게 맞다고 한다. 예를 들면, 아래와 같이 Session을 열고 실행시킬 수 있다. with tf.Session as sess: _, loss, acc = sess.run([ train, cost, accuracy], feed_dict = feed_dict) 위와 같이 사용한다면 마지막에 굳이 Session을 닫지 않아도 된다. 즉, sess.close() 함수를 사용하지 않아도 된다. 그렇다면 이제 2가지만 기억하면 된다. * scope를 지정한다. * summary를 합치고 그래프를 그린다. scope를 지정하는 코드의 예를 들어보자. with tf.name_scope( 'hidden1' ) as h1_scope: hidden1 = tf.sigmoid(tf.matmul(x, w1) + b1, name= 'hidden1' ) with tf.name_scope( 'hidden2' ) as h2_scope: hidden2 = tf.sigmoid(tf.matmul(hidden1, w2) + b2, name= 'hidden2' ) with tf.name_scope( 'output' ) as o_scope: y = tf.sigmoid( tf.matmul( hidden2, wo ) + bo , name= 'y' ) with tf.name_scope( 'cost' ) as scope: cos...

Tensorflow Chapter 4. 모델 불러오기

이미지
Tensorflow Chapter 4. 모델 불러오기 이번 강의에서는 트레이닝한 모델을 불러들여 weight를 더 트레이닝하거나 새로운 데이터를 테스트할 수 있다. 강의에서 후반부로 갈수록 내가 이해하기엔 좀 힘들어서 모델 불러들이는 부분만 정리해야겠다. 이번엔 test.py와 train.py로 나뉘어서 train.py에서 모델을 트레이닝하고 weight를 model.ckpt에 저장하고 test.py에서 weight를 불러들여 바로 y에 넣는다. 이 두개를 비교하기 위해 restore.py를 만들었다. 트레이닝한 모델을 불러들여 accuracy를 측정하는 코드이다. 아래 코드는 test.py와 train.py를 diff 명령어를 통해 비교한 것이다. 3 , 4 c3, 4 # test 코드이기 때문에 데이터를 바꾸었다. < input_data = [[ 10 , 5 , 7 , 3 , 9 , 11 ], < [ 10 , 5 , 11 , 1 , 21 , 2 ]] --- > input_data = [[ 1 , 3 , 5 , 3 , 8 , 3 ], > [ 15 , 2 , 14 , 15 , 23 , 25 ]] 7 a8 > 34 a36, 41 # 모델을 트레이닝하는 코드들은 모두 지웠다. > cost = tf.reduce_mean(-y_ * tf.log(y) - ( 1 -y)*tf.log( 1 -y)) > train = tf.train.GradientDescentOptimizer(Learning_Rate).minimize(cost) > > comp_pred = tf.equal(tf.arg_max(y, 1 ) , tf.arg_max(y_, 1 )) > accuracy = tf.reduce_mean(tf.cast(comp_pred, dtype= tf.float32)) > 36 , 38 c43, 52 # 변수들을 init하는 함수들을 지우고 saver.resto...

Tensorflow Chapter 3. 평가 & 모델 저장

Tensorflow Chapter 3. 평가 & 모델 저장 1. Evaluation 모델을 평가하기 위해 cost를 측정해 비교할 수 있었다. 그 전에 reduce_sum이라는 함수를 굉장히 많이 쓰이므로 공부하고 넘어간다. RSS를 구하기 위해서도 reduce_sum 함수를 사용한다. 행렬의 원하는 원소의 합을 구할 수 있는 함수이다. 이 강의에서 깨달은 것은 batch에 관한 개념이었다. 이 예시에서는 데이터가 2개 밖에 없어 풀배치로 Train을 했기 때문에 cost_=tf.reduce_sum((-y_*tf.log(y)-(1-y)*tf.log(1-y)), 1) 연산을 해보면 원소는 2개가 나온다. 즉, batch의 갯수와 cost 행렬의 행의 개수는 같다. 역시 함수에 대한 이해는 텐서플로우 공식 다큐먼트를 보고 하는 것이 옳다. 함수 설명 tf.reduce_sum(input_tensor, axis=None, keep_dims = False, name = None, reduction_indices = None) 사용 예시 ‘x’ is [[1, 1, 1], [1, 1, 1]] tf.reduce_sum(x) ==> 6 tf.reduce_sum(x, 0) ==> [2, 2, 2] tf.reduce_sum(x, 1) ==> [3, 3] tf.reduce_sum(x, 1, keep_dims=True) ==> [[3], [3]] tf.reduce_sum(x, [0, 1]) ==> 6 그리고 기존 코드에서 아래와 같은 코드를 추가해 accuracy를 확인한다. comp_pred = tf.equal(tf.arg_max(y, 1 ), tf.arg_max(y_, 1 )) accuracy = tf.reduce_mean(tf.cast(comp_pred, dtype=tf.float32)) y행렬의 각 행에서 가장 큰 값을 가진 값의 인덱스와 y_행렬의 각행에거...

Tensorflow Chapter 2. 모델 설계하기

Tensorflow Chapter 2. 모델 설계하기 이번 강의에서는 간단한 모델을 만들어 실행해보는 예제 구현을 한다. 머신 러닝을 조금 공부해본 사람들이 이해하기 쉬운 강의였다고 생각한다. 편집본을 봐서 그런지 weight, bias 에 대한 지식은 안다고 가정하고 강의하시는 것 같다. weight나 bias 같은 개념을 조금이나마 알기 때문에 weight과 bias 값에는 tf.Variable을 통해 값을 저장한다는 것을 이해할 수 있었다. 만약 모르는 사람이라면 constant나 placeholder로 선언하지 왜 굳이 variable인가 라고 의문을 던질 수 있다고 생각한다. 우선 강의에서 사용한 예제를 살펴보자면 아래와 같다. import tensorflow as tf import numpy as np input_data = [[ 1 , 5 , 3 , 7 , 8 , 10 , 12 ], [ 5 , 8 , 10 , 3 , 9 , 7 , 1 ]] label_data = [[ 0 , 0 , 0 , 1 , 0 ], [ 1 , 0 , 0 , 0 , 0 ]] # 좋은 코드의 예 INPUT_SIZE = 7 HIDDEN1_SIZE = 10 HIDDEN2_SIZE = 8 CLASSES = 5 Learning_Rate = 0.01 # 행렬인 데이터들을 텐서로 만들어주기 위해 placeholder를 이용해 선언 x = tf.placeholder( tf.float32, shape = [ None , INPUT_SIZE]) y_ = tf.placeholder( tf.float32, shape = [ None ,CLASSES] )언 feed_dict = {x: input_data, y_: label_data} # hidden layer의 weight와 bias 선언 W_h1 = tf.Variable( tf.truncated_normal(shape=[INPUT...

Tensorflow Chapter 1.텐서플로우 자료형

Tensorflow Chapter 1. 텐서플로우 자료형 Youtube에서 chanwoo lee님께서 올린 동영상 을 정리하고자 쓴 글이다. 그냥 딥러닝 공부하다가 쓰이는 라이브러리라고 생각하고 공부했다고 좌절한 기억이 있다. 그래서 텐서플로우부터 공부하고자 한다. 이찬우님께서 올리신 동영상을 봤는데 굉장히 설명이 자세하고 텐서플로우 라이브러리에 대한 이해를 높일 수 있는 기회가 될 수 있겠다고 생각했다. 첫 수업은 크게 2가지로 나뉜다. * 텐서플로우의 기본 작동 원리 * 자료형에 대한 이해 1. 텐서플로우의 기본 작동 원리 텐서플로우의 작동 원리를 크게 보자면 session이라는 큰 틀에 그래프를 넣고 session을 device(ex.gpu,cpu)에서 실행시키는 것이다. 간단히 예를 들어보자면, import tensorflow as tf ph = tf.placeholder(dtype=tf.float32) const = tf.constant([ 3 ]) const1 = tf.constant([ 4 ]) var = tf.Variable([ 2 ]) result_const = const + const1 sess = tf.Session() //session을 열고 res = sess.run(result_const) //result_const안에 있는 그래프를 session에 넣고 session을 device에서 연산하고 값을 반환 print(res) 2. 텐서플로우 자료형에 대한 이해 2.1 constatnt constatnt 위 예제와 같이 선언되며 초기화됨과 동시에 노드 안에 값을 갖게 된다. 그래서 따로 초기화를 안해주어도 되며 result_const값을 run안에 넣어주면 연산하게 된다. 2.2 variable variable은 constant와는 조금 다르다. constant은 초기화 되고 바로 노드에 값이 저장되지만 variable은 빈 노드를 그래프에 그려넣어 놓고 tf....

#6 <대학.중용>을 읽으며..

이미지
책 정보 저자 : 주희 출판사 : 홍익 출판사 학교 고전 독서 인증제 덕분에 책 4권을 더 읽고 시험을 봐야한다. 평가 도서 목록 중 대학.중용을 골랐고 한 번 읽은 뒤 정리하고자 한다. 독서 동기가 참 별로지만 좋은 책을 골랐으니 열심히 읽었다. 그렇다고 평가 도서 목록이 별로라는 것은 아니다. 모두 걸작이고 고전이다. 하지만 책에 대한 시험을 본다는 제도가 참 아이러니하다. 좋은 책들을 읽게 하고픈 학교 입장도 고려하지 않는 것은 아니다. 조금 더 나은 차선책이 있다면 더 좋지 않을까 싶다. 책에 대한 내용 정리를 해야겠다. 크게 이 책의 전체적인 내용 및 구성, 대학, 중용으로 나뉜다. 개요 첫번째 부분인 개요는 대학,중용이라는 책에 대한 설명을 주로 한다. 어떻게 대학.중용이 세상에 널리 알려졌는가? 수당대에서 불교가 크게 번성하자 유가측에서 불교를 비판할 이론을 마련하고자 고심하면서부터라고한다. 저술된 시기는 여러 시각이 존재한다. 첫째는 진나라 말에서 한나라 초에 저술된 것으로 본다. 두번째는 공자 이후 맹자 이전의 시기에 저술되었다는 견해이다. 마지막으로 현대 중국의 사상가인 서복관은 오륜이 논어에서는 한꺼번에 거론되지 않았는데 중용과 맹자에서는 모두 한꺼번에 언급되고 있다는 점, 그리고 맹자는 오륜이 개인적인 차원에서 이루어지지만 중용에서는 정치적인 차원에서 이루어진다는 점에 의거하여 논어와 맹자 사이에 중용이 저술되었다고 본다. 저자는 누구인가? 대학은 증자가 저술하고 중용을 자사가 저술한 것으로 본다. 대학.중용이 사상사에서 부각된 배경은? 대학에서 개인의 수양으로부터 가족 국가로 확대되어 가는 도덕 실천의 체계는 유학자들에게 불교를 비판할 수 있는 논거를 제시했고 중용에서 제시하고 있는 중화의 도는 유가의 도를 지지하는 도로 판단했다. 사서체제를 완성시킨 주희는 사서를 읽을 때 대학.논어.맹자.중용의 순서로 읽으라고 권한다. 중용은 도덕의 보편성과 필연성을 보장...

#5 <신곡>을 읽으며.. (연옥 & 천국)

이제 연옥으로 들어선다. 연옥을 지키는 자유의 상징인 카토 노인이 일행을 맞이한다. 베르길리우스는 단테의 얼굴을  이슬로 씻어주고 겸손의 상징인 갈대를 단테의 허리에 메어준다. 연옥은 의지가 가장 중요한 곳이다. 의지는 산을 오르고 오르면서 죄를 씻고 마침내 빛으로 나아가고자 하는 의지이다. 연옥의 입구에는 2개의 비탈이 단테를 기다린다. 첫번째 비탈은 교회를 능멸하다가 죽을 때 회개하고 뉘우친 자들이 죄를 저지린 시간의 30배의 기간을 머무르는 곳이다. 두번째 비탈은 게으른 나머지 회개를 미루던 영혼들이 그 미룬 횟수만큼 하늘을 도는 동안 머무르는 곳이다. 열망을 담아내는 기도, 특히 남이 해주는 기도는 죄를 씻는 데 가장 중요하다. 연옥의 문에 다다른 단테에게 천사가 P자 7개를 이마에 새겨준다. 첫번째 고리에는 오만의 죄를 지은 자들이 고통받고 있다. 두번째 고리에는 시기와 질투의 죄를 지은 자들이 고통받고 있다. 세번째 고리에는 쉽게 분노한 자들이 있다. 네번째 고리에는 태만한 자들이 한순간도 쉬지 않고 달리고 있다. 다섯번째 고리에는 인색한 자들과 낭비한 자들이 울고 있다. 여섯번째 고리에는 음식을 탐한 자들이 갈증과 허기에 괴로워하고 있다. 일곱번째 고리에는 애욕의 죄를 지은 자들이 죄를 씻고 있다. 이렇게 산을 오르면서 단테의 이마에 새겨진 P가 사라진다. 죄의 기억을 지우는 힘을 지닌 레테 강과 선행의 기억을 회복시키는 에우노에 강에 몸을 적시면서 단테는 순수한 존재로 다시 살아나 천국으로 올라간다. 이곳에서 길잡이 베르길리우스의 역할을 다한다. 베아트리체가 나타나 천국으로 인도한다. 인도하는 과정에서 논다니를 만나는데 논다니의 금술잔은 현실세계의 타락한 교황을 보여준다. 연옥은 정죄와 희망의 왕국이다. 영혼들이 쉼 없이 기도하며 산을 오르며 정죄한다. 여섯번째 고리에서 거꾸로 자라는 나무가 하는 말 중 "인류의 첫 시대는 황금처럼 아름다웠어. 배고픔은 도토리를 맛있게 했고 목마름은 어느 냇물에서...

#5 <신곡>을 읽으며.. (지옥)

이미지
책 정보 저자 : 단테 알리기에리 출판사 : 서해문집  단테의 신곡은 내가 좋아하는 영화에 자주 등장하기 때문에 꼭 읽어보고 싶은 책이었다. 인페르노와 다빈치 코드에 나왔었는데 그냥 지옥에 대한 얘기구나 싶었다. 마침 학교의 고전 독서 인증제의 평가 도서에 신곡이  있는 것을 알고 읽어야겠다고 생각했다. 그리고 알라딘 중고서점에 찾아봤더니 있는 것을 보고 운명인가 싶었다. 하지만 무교인 나에겐 큰 감명을 받기 쉽지 않았다. 단지 소설로서 상세한 묘사에 놀랐다. 그리스도에 대한 얘기가 주를 이루고 지옥, 연옥, 천국으로 크게 나뉘어져 있다. 그리스도에 대한 얘기는 그 전에 읽은 책인 처음 읽는 로마사에서 짧게 읽은 적 있다. 그리스도가 신은 단지 자신들이 믿고 있는 하나의 신 밖에 존재하지 않는다 하여 다른 종교를 인정하지 않았다는 내용을 읽은 적이 있는데 여러 종교를 인정하는 나라에서 교육 받는 나로서는 이해하기 쉽지 않았다. 이 책을 읽다보면 단테가 정말 사후세계를 보고 온 것이 아닌가라는 착각을 불러일으킨다. 그만큼 묘사가 섬세하고 자세하다. 그 묘사는 그림을 통해 더욱 자세해진다. 지옥에 들어서기에 앞서 단테는 어두운 숲에서 이야기를 시작한다. 이 어두운 숲에서 표범, 사자, 암늑대를 만난다, 세 마리의 야수는 각각 인간의 야심과 탐욕, 오만을 뜻한다. 단테는 목숨을 잃는구나 싶을 때 아이네이스의 저자인 베르길리우스가 나타나 도와준다. 베르길리우스는 베아트리체가 자신을 불러 단테를 구원해달라고 청했다고 한다. 여기서 베아트리체는 현존 인물이었는데 단테가 사랑하는 인물이었다가 소설 신곡에서 사랑의 신으로 재탄생한다. 이제 지옥의 문에 들어선다. 지옥에 들어서자 망령을 배로 실어나르는 카론을 만나 스틱스 강을 건넌다. 강을 건너 첫번째 고리에 들어섰다. 이 고리에는 아무런 죄도 짓지 않았지만 세례를 받지 못한 망령들이 한숨을 쉬고 있다. 이들이 사는 곳을 림보라고 한다. 두번째 고리로 내려...