복습하기 위해 학부 수업 내용을 필기한 내용입니다.
이해를 제대로 하지 못하고 정리한 경우 틀린 내용이 있을 수 있습니다.
그러한 부분에 대해서는 알려주시면 정말 감사하겠습니다.
▶10.3 생성 적대 신경
10.3.2 생성 적대 신경망의 프로그래밍
MNIST를 가지고 GAN을 구현하는 코드
import numpy as np
from tensorflow.keras.datasets import mnist
from tensorflow.keras.layers import Input,Activation,Dense,Flatten,Reshape,Conv2D,Conv2DTranspose,Dropout,BatchNormalization,UpSampling2D
from tensorflow.keras.models import Model
from tensorflow.keras import backend as K
from tensorflow.keras.losses import mse
import matplotlib.pyplot as plt
(x_train,y_train),(x_test,y_test)=mnist.load_data()
x_train = (x_train.astype('float32')/255.0)*2.0-1.0 # [-1,1] 구간
x_test = (x_test.astype('float32')/255.0)*2.0-1.0
x_train = np.reshape(x_train, (len(x_train), 28, 28, 1))
x_test = np.reshape(x_test, (len(x_test), 28, 28, 1))
batch_siz=64
epochs=5000
dropout_rate=0.4
batch_norm=0.9
zdim=100 # 잠복 공간의 차원
discriminator_input=Input(shape=(28, 28, 1)) # 분별망 D 설계
x=Conv2D(64,(5,5),activation='relu',padding='same',strides=(2,2))(discriminator_input)
x=Dropout(dropout_rate)(x)
x=Conv2D(64,(5,5),activation='relu',padding='same',strides=(2,2))(x)
x=Dropout(dropout_rate)(x)
x=Conv2D(128,(5,5),activation='relu',padding='same',strides=(2,2))(x)
x=Dropout(dropout_rate)(x)
x=Conv2D(128,(5,5),activation='relu',padding='same',strides=(1,1))(x)
x=Dropout(dropout_rate)(x)
x=Flatten()(x)
discriminator_output=Dense(1,activation='sigmoid')(x)
discriminator=Model(discriminator_input,discriminator_output)
generator_input=Input(shape=(zdim,)) # 생성망 G 설계
x=Dense(3136)(generator_input)
x=BatchNormalization(momentum=batch_norm)(x)
x=Activation('relu')(x)
x=Reshape((7,7,64))(x)
x=UpSampling2D()(x)
x=Conv2D(128,(5,5),padding='same')(x)
x=BatchNormalization(momentum=batch_norm)(x)
x=Activation('relu')(x)
x=UpSampling2D()(x)
x=Conv2D(64,(5,5),padding='same')(x)
x=BatchNormalization(momentum=batch_norm)(x)
x=Activation('relu')(x)
x=Conv2D(64,(5,5),padding='same')(x)
x=BatchNormalization(momentum=batch_norm)(x)
x=Activation('relu')(x)
x=Conv2D(1,(5,5),activation='tanh',padding='same')(x)
generator_output=x
generator=Model(generator_input,generator_output)
discriminator.compile(optimizer='Adam',loss='binary_crossentropy',metrics=['accuracy'])
discriminator.trainable=False
gan_input=Input(shape=(zdim,))
gan_output=discriminator(generator(gan_input))
gan=Model(gan_input,gan_output)
gan.compile(optimizer='Adam',loss='binary_crossentropy',metrics=['accuracy'])
def train_discriminator(x_train):
c=np.random.randint(0,x_train.shape[0],batch_siz)
real=x_train[c]
discriminator.train_on_batch(real,np.ones((batch_siz,1)))
p=np.random.normal(0,1,(batch_siz,zdim))
fake=generator.predict(p)
discriminator.train_on_batch(fake,np.zeros((batch_siz,1)))
def train_generator():
p=np.random.normal(0,1,(batch_siz,zdim))
gan.train_on_batch(p,np.ones((batch_siz,1)))
for i in range(epochs+1): # 학습을 수행
train_discriminator(x_train)
train_generator()
if(i%100==0): # 학습 도중 100세대마다 중간 상황 출력
plt.figure(figsize=(20, 4))
plt.suptitle('epoch '+str(i))
for k in range(20):
plt.subplot(2,10,k+1)
img=generator.predict(np.random.normal(0,1,(1,zdim)))
plt.imshow(img[0].reshape(28,28),cmap='gray')
plt.xticks([]); plt.yticks([])
plt.show()
imgs=generator.predict(np.random.normal(0,1,(50,zdim)))
plt.figure(figsize=(20,10)) # 학습을 마친 후 50개 샘플을 생성하여 출력
for i in range(50):
plt.subplot(5,10,i+1)
plt.imshow(imgs[i].reshape(28,28),cmap='gray')
plt.xticks([]); plt.yticks([])
▶10.4 응용 시나리오 : 인공지능 패션 디자인
생성 모델을 활용하는 디자인 비즈니스
- 디자이너의 임무는 꾸준히 새로운 디자인을 생성해 수익을 최대화한다.
- 아이디어가 고갈되었을 때 생성 모델이 도움이 된다.
- 생성 모델로 디자인을 생성한 다음 쓸만한 것을 골라낸다.
- 디자이너가 없는 비즈니스도 가능하다.
- 고객이 생성 모델을 조작해 고유한 디자인을 설계한다.
- 자동으로 생산 라인에 전달되어 생산이 이루어지고 자동 배송 시스템으로 넘어간다.
- 세상에 단 하나뿐인 사용자 맞춤형 패션 제품이다.
10.4.1 fashion MNIST 데이터로 생성 적대 신경망 학습
fashion MNIST로 GAN을 학습하는 코드
import numpy as np
from tensorflow.keras.datasets import fashion_mnist
from tensorflow.keras.layers import Input,Activation,Dense,Flatten,Reshape,Conv2D,Conv2DTranspose,Dropout,BatchNormalization,UpSampling2D,LeakyReLU
from tensorflow.keras.models import Model
from tensorflow.keras import backend as K
from tensorflow.keras.losses import mse
import matplotlib.pyplot as plt
(x_train,y_train),(x_test,y_test)=fashion_mnist.load_data()
x_train=x_train[np.isin(y_train,[9])] # 9번 부류는 ankle boot
x_train = (x_train.astype('float32')/255.0)*2.0-1.0 # [-1,1] 구간
x_test = (x_test.astype('float32')/255.0)*2.0-1.0
x_train = np.reshape(x_train, (len(x_train), 28, 28, 1))
x_test = np.reshape(x_test, (len(x_test), 28, 28, 1))
batch_siz=64
epochs=5000
dropout_rate=0.4
batch_norm=0.9
zdim=100 # 잠복 공간의 차원
discriminator_input=Input(shape=(28, 28, 1)) # 분별망 D 설계
x=Conv2D(64,(5,5),activation='relu',padding='same',strides=(2,2))(discriminator_input)
x=Dropout(dropout_rate)(x)
x=Conv2D(64,(5,5),activation='relu',padding='same',strides=(2,2))(x)
x=Dropout(dropout_rate)(x)
x=Conv2D(128,(5,5),activation='relu',padding='same',strides=(2,2))(x)
x=Dropout(dropout_rate)(x)
x=Conv2D(128,(5,5),activation='relu',padding='same',strides=(1,1))(x)
x=Dropout(dropout_rate)(x)
x=Flatten()(x)
discriminator_output=Dense(1,activation='sigmoid')(x)
discriminator=Model(discriminator_input,discriminator_output)
generator_input=Input(shape=(zdim,)) # 생성망 G 설계
x=Dense(3136)(generator_input)
x=BatchNormalization(momentum=batch_norm)(x)
x=Activation('relu')(x)
x=Reshape((7,7,64))(x)
x=UpSampling2D()(x)
x=Conv2D(128,(5,5),padding='same')(x)
x=BatchNormalization(momentum=batch_norm)(x)
x=Activation('relu')(x)
x=UpSampling2D()(x)
x=Conv2D(64,(5,5),padding='same')(x)
x=BatchNormalization(momentum=batch_norm)(x)
x=Activation('relu')(x)
x=Conv2D(64,(5,5),padding='same')(x)
x=BatchNormalization(momentum=batch_norm)(x)
x=Activation('relu')(x)
x=Conv2D(1,(5,5),activation='tanh',padding='same')(x)
generator_output=x
generator=Model(generator_input,generator_output)
discriminator.compile(optimizer='Adam',loss='binary_crossentropy',metrics=['accuracy'])
discriminator.trainable=False
gan_input=Input(shape=(zdim,))
gan_output=discriminator(generator(gan_input))
gan=Model(gan_input,gan_output)
gan.compile(optimizer='Adam',loss='binary_crossentropy',metrics=['accuracy'])
def train_discriminator(x_train):
c=np.random.randint(0,x_train.shape[0],batch_siz)
real=x_train[c]
discriminator.train_on_batch(real,np.ones((batch_siz,1)))
p=np.random.normal(0,1,(batch_siz,zdim))
fake=generator.predict(p)
discriminator.train_on_batch(fake,np.zeros((batch_siz,1)))
def train_generator():
p=np.random.normal(0,1,(batch_siz,zdim))
gan.train_on_batch(p,np.ones((batch_siz,1)))
for i in range(epochs+1): # 학습을 수행
train_discriminator(x_train)
train_generator()
if(i%100==0): # 학습 도중 100세대마다 중간 상황 출력
plt.figure(figsize=(20, 4))
plt.suptitle('epoch '+str(i))
for k in range(20):
plt.subplot(2,10,k+1)
img=generator.predict(np.random.normal(0,1,(1,zdim)))
plt.imshow(img[0].reshape(28,28),cmap='gray')
plt.xticks([]); plt.yticks([])
plt.show()
imgs=generator.predict(np.random.normal(0,1,(50,zdim)))
plt.figure(figsize=(20,10)) # 학습을 마친 후 50개 샘플을 생성하여 출력
for i in range(50):
plt.subplot(5,10,i+1)
plt.imshow(imgs[i].reshape(28,28),cmap='gray')
plt.xticks([]); plt.yticks([])
16~94줄 코드는 첫 번째 코드의 15~93줄과 동일하다.
10.4.2 생성된 패턴의 품질 평가
대체적인 품질 평가
- 위 코드는 그럴싸한 샘플을 생성해 준다.
체계적인 평가 방법 1 : 유사한 진짜 샘플과 비교하기
# 훈련 집합 x_train에서 img와 가장 가까운 영상을 찾아주는 함수
def most_similar(img,x_train):
vmin=1.0e10
for i in range(len(x_train)):
dist=np.mean(np.abs(img-x_train[i]))
if dist<vmin:
imin,vmin=i,dist
return x_train[imin]
# 50개의 영상에 대해 가장 가까운 영상을 찾아 보여줌
plt.figure(figsize=(20,10))
for k in range(50):
plt.subplot(5,10,k+1)
plt.imshow(most_similar(imgs[k],x_train).reshape(28,28),cmap='gray')
plt.xticks([]); plt.yticks([])
plt.show()
체계적인 평가 방법 2 : 사람을 대상으로 생성 모델 평가
- 진짜와 가짜를 반씩 섞은 후 사람에게 진위 구별하게 하는 실험
- 50% 정확률이라면 사람을 완벽하게 속인 셈이다.
- 아래 그림은 여러 모델에 대한 정확률(점수)이다.
▶10.5 생성 모델의 발전과 인공지능 창작
영상과 문학, 음악에서 큰 발전을 이루었다.
- 인공지능이 창작한 그림으로 전시회 열림
- 시범적으로 시나 소설을 쓰는 인공지능 탄생
- 인공지능이 작곡한 곡을 웹을 통해 사람들이 감상
10.5.1 생성 적대 신경망의 발전
10.5.2 순서열 생성 모델의 발전
텍스트와 음악 생성에 적용
- 기사 작성
- 텍스트 생성에 사용되는 seq2seq 모델
- 주의(attention) 기능 없는 단점
-2017년에 주의 기능에 집중하는 트랜스포머 모델이 발표되었다.
- 구글의 BERT
- OpenAI 재단의 GPT-3
'컴퓨터공학 > 인공지능' 카테고리의 다른 글
[인공지능] 10장. 생성 모델(Generative Model) 2 (0) | 2023.06.05 |
---|---|
[인공지능] 10장. 생성 모델(Generative Model) 1 (0) | 2023.06.04 |
[인공지능] 9장. 강화 학습(Reinforcement Learning) 3 (0) | 2023.06.04 |
[인공지능] 9장. 강화 학습(Reinforcement Learning) 2 (0) | 2023.05.30 |
[인공지능] 9장. 강화 학습(Reinforcement Learning) 1 (0) | 2023.05.30 |