Skip to content

Commit

Permalink
Merge pull request #81 from elibooklover/master
Browse files Browse the repository at this point in the history
GAN Ch4-pix2pix
  • Loading branch information
SDSTony authored Mar 25, 2021
2 parents bb22a5e + 63ae6a4 commit f07cc47
Show file tree
Hide file tree
Showing 3 changed files with 2,108 additions and 46 deletions.
1,952 changes: 1,951 additions & 1 deletion book/chapters/GAN/Ch2-EDA.ipynb

Large diffs are not rendered by default.

103 changes: 58 additions & 45 deletions book/chapters/GAN/Ch4-pix2pix.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -138,24 +138,24 @@
},
"outputs": [],
"source": [
"class VictorianDataset(Dataset):\r\n",
" def __init__(self, root, color_transforms_=None, gray_transforms_=None):\r\n",
"\r\n",
" self.color_transforms = transforms.Compose(color_transforms_)\r\n",
" self.gray_transforms = transforms.Compose(gray_transforms_)\r\n",
" self.gray_files = sorted(glob.glob(os.path.join(root, 'gray') + \"/*.*\"))\r\n",
" self.color_files = sorted(glob.glob(os.path.join(root, 'resized') + \"/*.*\"))\r\n",
" \r\n",
" def __getitem__(self, index):\r\n",
" gray_img = Image.open(self.gray_files[index % len(self.gray_files)]).convert(\"RGB\")\r\n",
" color_img = Image.open(self.color_files[index % len(self.color_files)]).convert(\"RGB\")\r\n",
" \r\n",
" gray_img = self.gray_transforms(gray_img)\r\n",
" color_img = self.color_transforms(color_img)\r\n",
"\r\n",
" return {\"A\": gray_img, \"B\": color_img}\r\n",
"\r\n",
" def __len__(self):\r\n",
"class VictorianDataset(Dataset):\n",
" def __init__(self, root, color_transforms_=None, gray_transforms_=None):\n",
"\n",
" self.color_transforms = transforms.Compose(color_transforms_)\n",
" self.gray_transforms = transforms.Compose(gray_transforms_)\n",
" self.gray_files = sorted(glob.glob(os.path.join(root, 'gray') + \"/*.*\"))\n",
" self.color_files = sorted(glob.glob(os.path.join(root, 'resized') + \"/*.*\"))\n",
" \n",
" def __getitem__(self, index):\n",
" gray_img = Image.open(self.gray_files[index % len(self.gray_files)]).convert(\"RGB\")\n",
" color_img = Image.open(self.color_files[index % len(self.color_files)]).convert(\"RGB\")\n",
" \n",
" gray_img = self.gray_transforms(gray_img)\n",
" color_img = self.color_transforms(color_img)\n",
"\n",
" return {\"A\": gray_img, \"B\": color_img}\n",
"\n",
" def __len__(self):\n",
" return len(self.gray_files)"
]
},
Expand Down Expand Up @@ -674,6 +674,19 @@
"Discriminator().apply(weights_init_normal)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"생성자와 분별자 작동원리를 시각화 한 그림 4-1를 보시면, 생성자에 의해 생성된 이미지는 아웃풋으로 인풋 이미지와 쌍으로 이루어져 분별자에 의해 얼마나 비슷한 지 판단하게 됩니다. 또한 인풋 이미지와 타겟 이미지도 동시에 입력이 되어 분별자에 의해 비교되게 됩니다. 이 두 쌍을 비교한 결과 값을 분별자 값(Discriminator weights)인데, 이 과정을 거치면서 업데이트 되게 됩니다. \n",
"\n",
"분별자 값이 갱신되면, 생성자 값(Generator weights)도 아래의 과정을 통해 갱신되면서 새로운 이미지를 생성하게 됩니다. 모델 학습은 이러한 과정을 계속 반복하게 됩니다. \n",
"\n",
"![](https://github.com/elibooklover/Tutorial-Book/blob/master/book/pics/GAN-ch4img01.jpg?raw=true)\n",
"![](https://github.com/elibooklover/Tutorial-Book/blob/master/book/pics/GAN-ch4img02.jpg?raw=true)\n",
"- 그림 4-1 생성자와 분별자 작동원리 시각화 (출처: https://neurohive.io/en/popular-networks/pix2pix-image-to-image-translation/)"
]
},
{
"cell_type": "markdown",
"metadata": {
Expand Down Expand Up @@ -761,32 +774,32 @@
},
"outputs": [],
"source": [
"def sample_images(epoch, loader, mode):\r\n",
" imgs = next(iter(loader))\r\n",
" gray = Variable(imgs[\"A\"].type(Tensor))\r\n",
" color = Variable(imgs[\"B\"].type(Tensor))\r\n",
" output = generator(gray) \r\n",
" \r\n",
" gray_img = torchvision.utils.make_grid(gray.data, nrow=6) \r\n",
" color_img = torchvision.utils.make_grid(color.data, nrow=6) \r\n",
" output_img = torchvision.utils.make_grid(output.data, nrow=6)\r\n",
"\r\n",
" rows = 3\r\n",
" cols = 1\r\n",
"\r\n",
" ax1 = fig.add_subplot(rows, cols, 1)\r\n",
" ax1.imshow(reNormalize(gray_img.cpu(), gray_mean, gray_std)) \r\n",
" ax1.set_title('gray')\r\n",
"\r\n",
" ax2 = fig.add_subplot(rows, cols, 2)\r\n",
" ax2.imshow(reNormalize(color_img.cpu(), color_mean, color_std))\r\n",
" ax2.set_title('color') \r\n",
"\r\n",
" ax3 = fig.add_subplot(rows, cols, 3)\r\n",
" ax3.imshow(reNormalize(output_img.cpu(), color_mean, color_std))\r\n",
" ax3.set_title('output') \r\n",
"\r\n",
" plt.show()\r\n",
"def sample_images(epoch, loader, mode):\n",
" imgs = next(iter(loader))\n",
" gray = Variable(imgs[\"A\"].type(Tensor))\n",
" color = Variable(imgs[\"B\"].type(Tensor))\n",
" output = generator(gray) \n",
" \n",
" gray_img = torchvision.utils.make_grid(gray.data, nrow=6) \n",
" color_img = torchvision.utils.make_grid(color.data, nrow=6) \n",
" output_img = torchvision.utils.make_grid(output.data, nrow=6)\n",
"\n",
" rows = 3\n",
" cols = 1\n",
"\n",
" ax1 = fig.add_subplot(rows, cols, 1)\n",
" ax1.imshow(reNormalize(gray_img.cpu(), gray_mean, gray_std)) \n",
" ax1.set_title('gray')\n",
"\n",
" ax2 = fig.add_subplot(rows, cols, 2)\n",
" ax2.imshow(reNormalize(color_img.cpu(), color_mean, color_std))\n",
" ax2.set_title('color') \n",
"\n",
" ax3 = fig.add_subplot(rows, cols, 3)\n",
" ax3.imshow(reNormalize(output_img.cpu(), color_mean, color_std))\n",
" ax3.set_title('output') \n",
"\n",
" plt.show()\n",
" fig.savefig(\"images/%s/%s/epoch_%s.png\" % (dataset_name, mode, epoch), pad_inches=0)"
]
},
Expand Down Expand Up @@ -1213,7 +1226,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.5"
"version": "3.9.1"
}
},
"nbformat": 4,
Expand Down
99 changes: 99 additions & 0 deletions book/chapters/NLP/Ch1-Introduction.ipynb
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "Ch1-Introduction.ipynb",
"provenance": [],
"collapsed_sections": []
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "Ptu_FuqCTYYq"
},
"source": [
"# 1. Introduction"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ka9ab3KpThBS"
},
"source": [
"[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/Pseudo-Lab/Tutorial-Book/blob/master/book/chapters/NLP/Ch1-Introduction.ipynb)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "fdKdT30qmy0r"
},
"source": [
""
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "kgxQtUyNTnkX"
},
"source": [
"## 1.1 문제 생성 작업 (Question Generation Task)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "XVq5RWbSNAY3"
},
"source": [
"문제 생성 작업에 대한 분류는 학자에 따라 다양하게 나눠집니다. 우선 이번 챕터에서는 Kurdi et al.의 \"A Systematic Review of Automatic Question Generation for Educational Purposes\" 연구 기반으로 설명을 하도록 하겠습니다. 문제 생성 과정에 있어서 크게 이해 단계와 생성 과정이 있습니다. 인풋 데이터인 문장을 받아, 컴퓨터가 이해하는 과정을 이해 관계라고 봅니다. 이러한 이해 과정을 거친 후 인풋 데이터를 바탕으로 문제 생성을 하는 과정을 생성 과정이라고 합니다. \n",
"\n",
"이해 단계에서는 구문론 기반 (syntax-based)과 의미론 기반 (semantic-based) 접근법이 있습니다.\n",
"\n",
"구문론 기반 접근법은 텍스트의 구문론 트리(syntax tree)와 같은 인풋을 입력하여 문제를 생성합니다. 예를 들어, 구문론 기반 모델은 문장 내의 단어 의미와 상관없이, 품사 (Part of Speech) 태깅을 통해, 문장 내의 구문 특징을 추출하여, 품사 간의 관계를 파악하여 문제 생성을 결정하게 됩니다.\n",
"\n",
"의미론 기반 전근법은 문장 속에 의미 관계를 파악하여 문제를 생성합니다. 구문론적 접근 방법을 뛰어 넘어, 인풋 데이터를 한층 깊게 이해 할 필요가 있는데, 단순히 품사의 의미를 추출하기 보다는, 품사 간의 의미를 유추 할 수 있어야 합니다. 예를 들어, bank의 의미는 은행 일수도 있고, 제방 일수도 있습니다. 이는 문단 안에서 해당 단어의 관계에 의해 의미가 특정됩니다.\n",
"\n",
"생성 과정에 있어서 템플릿 (template), 규칙 (rule), 그리고 통계적인 방법 (statistical methods)이 있습니다. \n",
"\n",
"템플릿 기반 (template-based)의 경우, 문제 구조의 템플릿을 정해 놓고, 텍스트의 의미 또는 구문론적인 접근법을 통해 특징을 추출하여 문제를 생성합니다. 규칙 접근법은 문장 안에 품사들의 주석(annotations) 정보를 이용하여, 문제를 생성합니다. 예를 들어, where, which, when과 같은 wh의문사 문제를 생성하는 작업이라면, 해당 자리에 wh가 들어가는 품사 주석의 정보를 받아 wh의문사 문제를 생성하게 됩니다. 마지막으로, 통계적 접근 방법은 시퀀스-투-시퀀스(sequence-to-sequence)가 대표적입니다. 데이터셋을 학습시켜 동시에 일어날 수 있는 가능성을 사용하여, 문제를 생성하게 됩니다. \n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "V7yydlpETxFe"
},
"source": [
"## 1.2 BERT\n",
"\n",
"[BERT](https://github.com/google-research/bert) (Bidirectional Encoder Representations from Transformers)는 2019년 10월 25일 구글 리서치 팀에 의해 공개된 자연어처리 사전 훈련 모델입니다. BERT 모델은 100여개가 넘는 언어 학습을 지원하며, `BERT-Base`, `BERT-Large`, `BERT-Base, Multilingual`, 그리고 `BERT-Base, Chinese` 모델이 있습니다. 각각의 모델 뒤에 `Cased`와 `Uncased`가 붙혀져 있는데, `Uncased`의 경우 대소문자 구분을 하지 않는 모델입니다.\n",
"\n",
"BERT를 이용하여 특정 과제를 수행할 수 있는데요, 이를 위해서는 세부적인 과제를 수행하도록 파인튜닝(fine-tuning) 작업이 필요합니다. BERT은 사전 학습된 언어모델로서 파인튜닝을 통해, 원하는 작업을 수행할 수 있습니다. 사전 학습된 언어모델을 이용하여 다운스트림 작업(down-stream tasks)을 수행할 수 있는 방법에는 `feature-based`와 파인튜닝(`fine-tuning`) 방식이 있습니다. `feature-based` 접근법에는 Word2Vec, GloVe, ELMo와 같은 방식이 있으며, 파인튜닝(`fine-tuning`) 방식에는 대표적으로 GPT 모델이 있습니다.\n",
"\n",
"BERT가 발표 되었을 당시, GPT-2와 비교를 많이 했는데요, 두 모델 모두 파인튜닝(`fine-tuning`) 방식을 사용하지만, GPT-2는 단방향(unidirectional) 언어 모델인 반면, BERT는 양방향(bidirectional) 언어 모델로서 차이가 있었습니다. 향후 GPT를 개발한 OpenAI에서는 BERT처럼 양방향 언어 모델인 GPT-3를 내놓게 됩니다.\n",
"\n",
"양방향 언어 모델의 장점은 `fill-in-the-blanks`와 같이 앞뒤 문맥에 맞게 빈칸에 알맞은 단어를 추측하는 작업에 아주 높은 성능을 보여주고 있습니다.\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "qZQYcfHKTzTq"
},
"source": [
"## 1.3 GPT-2 (미정)"
]
}
]
}

0 comments on commit f07cc47

Please sign in to comment.