본문 바로가기

IT To do and To was

22년 4월 12일_AutoEncoder, GAN, Reuters

728x90
반응형

화요일[비가 온대여]

1. 금일 텐서플로 수업 내용 공유

2. 정보처리기사 필기 공부 

 

1. 수업내용 공유

 

º AutoEncoder

(有에서 有를 창조) 

from tensorflow.keras.datasets import mnist
from tensorflow.keras import models, layers
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
(X_train, _), (X_test, _) = mnist.load_data()
X_train = X_train.reshape(X_train.shape[0], 28, 28, 1).astype(float) / 255 
X_test = X_test.reshape(X_test.shape[0], 28, 28, 1).astype(float) / 255 
(X_train, _), (X_test, _) = mnist.load_data()
X_train = X_train.reshape(X_train.shape[0], 28, 28, 1).astype(float) / 255 
X_test = X_test.reshape(X_test.shape[0], 28, 28, 1).astype(float) / 255 
autoencoder = models.Sequential()
#인코더
autoencoder.add(layers.Conv2D(16, kernel_size=3, padding='same', input_shape=(28, 28, 1),
                             activation='relu'))
autoencoder.add(layers.MaxPooling2D(pool_size=2))
autoencoder.add(layers.Conv2D(18, kernel_size=3, padding='same', activation='relu'))
autoencoder.add(layers.MaxPooling2D(pool_size=2))
autoencoder.add(layers.Conv2D(18, kernel_size=3, strides=2, padding='same', activation='relu'))

#디코더
autoencoder.add(layers.Conv2D(8, kernel_size=3, padding='same', activation='relu'))
autoencoder.add(layers.UpSampling2D())
autoencoder.add(layers.Conv2D(8, kernel_size=3, padding='same', activation='relu'))
autoencoder.add(layers.UpSampling2D())
autoencoder.add(layers.Conv2D(16, kernel_size=3, activation='relu'))
autoencoder.add(layers.UpSampling2D())
autoencoder.add(layers.Conv2D(1, kernel_size=3, padding='same', activation='relu'))
autoencoder.summary()
autoencoder.compile(loss='binary_crossentropy', optimizer='adam')
autoencoder.fit(X_train, X_train, epochs=50, batch_size=128, validation_data=(X_test, X_test))
random_test = np.random.randint(X_test.shape[0], size=5)
ae_imgs = autoencoder.predict(X_test)
plt.figure(figsize=(7, 2))
for i, image_idx in enumerate(random_test):
    ax = plt.subplot(2, 7, i + 1) 
    plt.imshow(X_test[image_idx].reshape(28, 28))  #테스트할 이미지를 먼저 그대로 보여줍니다.
    ax.axis('off')
    ax = plt.subplot(2, 7, 7 + i +1)
    plt.imshow(ae_imgs[image_idx].reshape(28, 28))  #오토인코딩 결과를 다음열에 출력합니다.
    ax.axis('off')


plt.show()

º GAN

(無에서 有를 창조)

from tensorflow.keras.datasets import mnist
from tensorflow.keras import models, layers
from tensorflow.keras.layers import Dense, LeakyReLU
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
import os
if not os.path.exists('gan_images'):
    os.makedirs('gan_images')
    
np.random.seed(3)
tf.random.set_seed(3)
#생성자 모델
generator = models.Sequential()
generator.add(Dense(7*7*128, input_dim=100, activation=layers.LeakyReLU(0.2))) # 7by7 에 채널이 128개
generator.add(layers.BatchNormalization()) #학습의 효율을 높이기 위해 스케일링을 줄임
generator.add(layers.Reshape((7,7,128))) 

#1차원은 백터 2차원은 매트릭스 3차원이상은 tensor이라고 부름
generator.add(layers.UpSampling2D()) #차원계산이 중요함  픽셀하나를 동일한 픽셀 4개로 만듦 총면적이 4배로 커짐
generator.add(layers.Conv2D(64, kernel_size=5, padding='same'))
generator.add(layers.BatchNormalization())
generator.add(layers.Activation(LeakyReLU(0.2)))
generator.add(layers.UpSampling2D()) 
generator.add(layers.Conv2D(1, kernel_size=5, padding='same', activation='tanh')) #가짜그림 한 장을 만듦
generator.summary()
#판별자 모델
discriminator = models.Sequential()
discriminator.add(layers.Conv2D(64, kernel_size=5, strides=2, input_shape=(28,28,1)
                               , padding='same')) #커널을 2픽셀씩 가게하는 의미
discriminator.add(layers.Activation(layers.LeakyReLU(0.2)))
discriminator.add(layers.Dropout(0.3))
discriminator.add(layers.Conv2D(128, kernel_size=5, strides=2, padding='same'))
discriminator.add(layers.Activation(layers.LeakyReLU(0.2)))
discriminator.add(layers.Flatten())
discriminator.add(layers.Dense(1, activation='sigmoid')) #진짜냐 가짜냐
discriminator.summary()
discriminator.compile(loss='binary_crossentropy', optimizer='adam')
discriminator.trainable = False # 위조지폐와 경찰 그림과 같이노이즈로 만든 그림을 날렸을 때 오차를 리턴할 경우 학습을할 때 생성자 학습할 때는 기본 학습을 막아버리는 것
#가중치와 바이어스 갱신 x
ginput = layers.Input(shape=(100,))
dis_output = discriminator(generator(ginput))
gan = models.Model(ginput, dis_output)
gan.compile(loss='binary_crossentropy', optimizer='adam')
gan.summary()
def gan_train(epoch, batch_size, saving_interval):
    (X_train, _), (_, _) = mnist.load_data() # 변수를 받지 않기 위해 _ 로 비움
    X_train = X_train.reshape(X_train.shape[0], 28, 28, 1).astype(float) 
    # 가로 28, 세로 28 픽셀이고 흑백이므로 1을 설정
    # 28, 28, 1 채널로 reshape
    
    X_train = (X_train - 127.5) / 127.5
    # 0~255 사이의 픽셀의 grayscale 값이 -1~1 로 변한다
    # 활성화 함수가 tanh (픽셀값을 -1~1)이므로 해당 값으로 맞춰줘야 한다.
    
    true = np.ones((batch_size, 1))
    fake = np.zeros((batch_size, 1))
    
    for i in range(epoch):
        idx = np.random.randint(0, X_train.shape[0], batch_size)
        # idx = o부터 X_train 길이에서 batch_size 만큼 랜덤하게 가져온 숫자
        imgs = X_train[idx]
        
        d_loss_real = discriminator.train_on_batch(imgs, true)
        # train_on_batch(x, y) 함수는 입력 값(x)과 레이블(y)을 받아서 딱 한 번 학습을 실시해 모델을 업데이트
        # 역전파도 이루어진다
        # 진짜를 판단하는데 생기는 손실
        
        noise = np.random.normal(0, 1, (batch_size, 100)) # 0~1 사이에서 batch_size만큼 100개
        
        gen_imgs = generator.predict(noise)
        
        d_loss_fake = discriminator.train_on_batch(gen_imgs, fake)
        # 가짜를 판단하는데 생기는 손실
        
        d_loss = 0.5 * np.add(d_loss_real, d_loss_fake)
        g_loss = gan.train_on_batch(noise, true)
        # generator는 혼자서 진위여부를 판단할 수 없기 때문에 gan network 를 통째로 사용
        
        print('epoch:%d' % i, ' d_loss:%.4f' % d_loss, ' g_loss:%.4f' % g_loss)
            
        if i % saving_interval == 0:
              #r, c = 5, 5
              noise = np.random.normal(0, 1, (25, 100))
              gen_imgs = generator.predict(noise)

              # Rescale images 0 - 1
              gen_imgs = 0.5 * gen_imgs + 0.5

              fig, axs = plt.subplots(5, 5)
              count = 0
              for j in range(5):
                  for k in range(5):
                      axs[j, k].imshow(gen_imgs[count, :, :, 0], cmap='gray')
                      axs[j, k].axis('off')
                      count += 1
              fig.savefig("gan_images/gan_mnist_%d.png" % i)

º Reuters

import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow.keras.datasets import reuters
from tensorflow.keras import models, layers
from tensorflow.keras.preprocessing import sequence
from tensorflow.keras import utils
seed = 0
np.random.seed(seed)
tf.random.set_seed(3)
(X_train, y_train), (X_test, y_test) = reuters.load_data(num_words=1000, test_split=0.2)

category = np.max(y_train) + 1
print('category: ', category)
print('train set :', len(X_train))
print('test set : ', len(X_test))
X_train = sequence.pad_sequences(X_train, maxlen=100)
X_test = sequence.pad_sequences(X_test, maxlen=100)
y_train = utils.to_categorical(y_train) #원핫인코딩으로 바꾸겠다
y_test = utils.to_categorical(y_test)
model = models.Sequential()
model.add(layers.Embedding(1000, 100))
model.add(layers.LSTM(100, activation='tanh'))
model.add(layers.Dense(46, activation='softmax'))
model.summary()
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
history = model.fit(X_train, y_train, batch_size = 100, epochs=20,
                   validation_data=(X_test, y_test))
print('Test Accuracy : %4.f' %(model.evaluate(X_test, y_test)[1]))
y_vloss = history.history['val_loss']
y_loss = history.history['loss']
x_len = np.arange(len(y_loss))
plt.plot(x_len, y_vloss, marker='.', c="red", label='Testset_loss')
plt.plot(x_len, y_loss, marker='.', c="blue", label='Trainset_loss')
plt.legend(loc='upper right')
plt.grid()
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()

º IMDB

import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow.keras.datasets import imdb
from tensorflow.keras import models, layers
from tensorflow.keras.preprocessing import sequence
from tensorflow.keras import utils
seed = 0
np.random.seed(seed)
tf.random.set_seed(3)
(X_train, y_train), (X_test, y_test) = imdb.load_data(num_words=5000)
X_train = sequence.pad_sequences(X_train, maxlen=100)
X_test = sequence.pad_sequences(X_test, maxlen=100)
model = models.Sequential()
model.add(layers.Embedding(5000, 100))
model.add(layers.Dropout(0.5))
model.add(layers.Conv1D(64, 5, padding = 'valid', activation='relu', strides=1))
model.add(layers.MaxPooling1D(pool_size=4))
model.add(layers.LSTM(55))
model.add(layers.Dense(1))
model.add(layers.Activation('sigmoid'))
model.summary()
model.compile(loss='binary_crossentropy', optimizer = 'adam', metrics =['accuracy'])
history = model.fit(X_train, y_train, batch_size=100, epochs=5,
                   validation_data=(X_test, y_test))
print('Test Accuracy : %4.f' %(model.evaluate(X_test, y_test)[1]))
y_vloss = history.history['val_loss']
y_loss = history.history['loss']
x_len = np.arange(len(y_loss))
plt.plot(x_len, y_vloss, marker='.', c="red", label='Testset_loss')
plt.plot(x_len, y_loss, marker='.', c="blue", label='Trainset_loss')
plt.legend(loc='upper right')
plt.grid()
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()

 

2. 정보처리기사 필기 공부 

 

º 수식표기법 

Infix - > prefix 연산자를 해당괄호 앞으로 옮김
Infix - > Postfix 연산자를 해당괄호 뒤로 옮김
Postfix -> Infix 인버한 피연산자 두개와 오른쪽의 연산자를 괄호로 묶고 연산자를 피 연산자 가운데로 옮김
Prefix -> Infix 인접한 피연산자 두개와 왼쪽의 연산자를 괄호로 묶고
연산자를 해당 피연산자 사이로 이동시킴

 

Sort

삽입정렬, 쉘정렬, 선택정렬, 버블정렬

 

쉘정렬 _ 매개변수(h)의 값으로 서브파일을 구성 | O(n^1.5), O(n^n)

선택정렬 _ 모든 것에 최솟값을 찾아 앞으로 두고, n-1개를 다시 찾음

버블정렬_ 인접한 두개의 레코드 키 값을 비교

퀵 정렬_ 키를 기준으로 작은 값은 왼쪽에 큰 값은 오른쪽에 서브파일로 분해 | O(nlong2n), O(n^2)

힙 정렬_전이진 트리를 이용한 정렬 방식 | O(nlog2n)

2-way 합병 정렬_ 두 개의 커들을 한쌍으로 하여 각 쌍에 대하여 순서를 정함 | O(nlog2n)

기수정렬_ Queue를 이용 버킷의 순서대로 레코드를 꺼내여 정렬 |O(dn)

 

데이터 저장소{논리데이터 저장소 : 데이터, 데이터간의 연관성, 제약조건을 식별 조직화, 물리데이터저장소: 물리적 특성을 고려하여 하드웨어직인 저장장치에 저장}

 

데이터베이스 

-통합데이터 : 중복 x

-저장된데이터

-운영데이터 : 반드시 필요한 자료

-공용데이터 : 공통으로 소유하고 있는 자료

 

DBMS 

-정의기능  : 구조에 대한 정의, 이요방식, 제약조건 명시

-조작기능  : 데이터검색, 갱신, 삽입, 삭제 등 사용자와 DB사이의 수단을 제공

-제어기능  : 무결성유지, 보안, 권한, 병행제어

 

데이터베이스 MS발전 배경은 종속성과 중복성을 배제함에 있다.

 

스키마 

외부 : 데이터 베이스의 논리적 구조를 정의

개념 : 전체적인 논리구조, 개체관계와 제약조건을 나타내고, 데이터베이스의 접근 권한 , 보안 및 무결성

내부 : 물리적 저장장치에서 본 데이터 베이스 구조로서, 실제로 DB에 저장될 레코드 형식을 정의하고 저장데이터 항목의 표현 방법, 내부레코드의 물리적 순서등을 나타낸다.

 

트랜젝션

데이터 입출력을 소프트웨어에 구현하기위해sql코드로 삽입,or 객체와 데이터 연결 = 데이터 접속이라고도 함

 

SQL을 통한 논리적 기능 수행하기위한 한 단위, 모두 수행되어야할 일련의 연산

 

관계대수 : RDB에서 원하는 정보와 그 정보를 검색하기위해 어떻게 유도하는가를 기술

관계해석 : RDB에서 사용하는 방법으로 원하는 정보를 정의할 때 계산수식을 사용

 

데이터정의어 : schma, Domain, Table, Viwe, Index를 정의 변경 삭제

데이터 조작어 : 질의어를 통해 실제 DB조작

데이터 제어어 : 데이터의 보안, 무결성, 회복, 병행 수행 제어등을 정의하는데 병행

 

transation: 일련의 연산 작업의 논리적 단위

트렌젝션을 제어하기위해 사용하는 명령어 _ TCL

-commit : 변경내용을 dB에 반영하는 명령어

-rollback : 비정상적으로 종료되었을 경우 트랜젝션 명령을 종료시키고, 이전 시점으로 되돌리는 명령어

-cheakpoint(savepoint_ : rollback시점을 정의 

 

깊이 우선탐색(DFS)

정점에서 자식노드방향으로 운행하면서 현제노드와 자식노드가 있을 때 자식노드를 먼저 탐색하는기법

 

절차형 SQL

효율이 떨어지지만 연속작업을 할때 적합

SQL은 DBMS에 직접실행되기에 입력패킷, 출력패킷이 적은편

블록구조 -> 기능별 모듈화가가능

 

프로시저 : 특정기능을 수행하는 트랜젝션언어로 호출을 통해 미리작성한 SQL문을 수행

트리거 : DBS에서 이벤트가 발생할 때 같이 관련작업이 자동수행

사용자 정의함수 프로시저와 유사하게 SQL을 사용하여 일련의 작업을 녀속적으로 처리, 종료시 return을 사용하여 처리결과를 단일값으로 반환

 

 

 

//yesterday wished to today list

. 좋은 인상 남기기 😒

. 말 실수하지 않기 👎

. 긍정적으로 생각하기 

 

tomorrow wish list

. 긍정적으로 생각하기

. 좋게 생각하기

. 한번더 생각하고 말하기

728x90
반응형