:: 데이터베이스를 관리하거나 자료를 관리하기 위한GUI관리툴은 내장되어 있지 않고 오로지 명령어로만 동작
따라서 MySQL 프론트엔드 데스크톱 소프트웨어나 웹 애플리케이션을 사용해야 함
MySQL과 같은 관계형 데이터베이스의 중요한 특징은 스프레드시트와 마찬가지로 데이터를 표의 형태로 표현해준다.
MySQL의 구조
- 표(table)에 저장됨 -> 표가 늘어남 -> 정리정돈(디렉토리)의 필요성 증대
- 스키마? 서로 연관된 표들을 서로 그룹핑할 때 사용하는 일종의 폴더.
- 스키마들이 모인 것 = 데이터베이스 서버(database server)
데이터베이스 서버> 데이터베이스(스키마)> 표(table)
효용
1. 보안 (자체적 보안 체계를 가지고 있어 안전한 보관 가능)
2. 권한 (다양한 사용자들이 관리할 수 있음 + 차등적 권한을 줄 수 있음)
SQL
(Structed Query Language)
:: 데이터를 관리하기 위한 쿼리 언어
:: 데이터베이스 종류와 상관 없이 모든 데이터베이스는 SQL을 통해서만 관리가 가능함
:: 기본적으로는 ANSI 표준이며 데이터베이스 회사별로 조금씩 차이가 있음
그리고 다양한 MySQL 명령들
(※ 주의 : 공부한 것을 까먹지 않도록 간단하게 적어놓은 것이므로 설명 등이 매우 부실함)
1. 데이터베이스 생성
CREATE DATABASE 데이터베이스명;
2. 데이터베이스 목록보기
SHOW databases;
3. 데이터베이스 선택
USE 데이터베이스명;
4. 테이블 생성
CREATE TABLE 테이블명(
-> 필드1 데이터타입 NULL수용여부(사용하지 않으면 기본적으로 NULL),
-> 필드2 데이터타입 NOT NULL,
...
-> PRIMARY KEY(필드1)); // PRIMARY KEY 부여
예를 들어
CREATE TABLE opentutorials(
-> id INT(11) NOT NULL AUTO_INCREMENT,
-> title VARCHAR(30) NOT NULL,
-> description TEXT NULL,
-> created DATETIME NOT NULL,
-> profile VARCHAR(100) NULL,
-> PRIMARY KEY(id));
3. 테이블 목록보기
SHOW tables;
4. 테이블 구조 확인
DESC 테이블명;
5. 특정 칼럼에 키 부여
ALTER TABLE 테이블명 ADD PRIMARY KEY(필드명);
6. 데이터 입력
INSERT INTO //모든 필드에 데이터 추가
-> 테이블명
-> VALUES(데이터1, 데이터2, 데이터3,,,);
예를 들어
INSERT INTO
->opentutorials
->VALUES("SQL","SQL is....",NOW(),'kkami','developer');
INSERT INTO 테이블명(필드1, 필드2) VALUES(데이터1,데이터2);
예를 들어
INSERT INTO opentutorials(title,description,created,author,profile)
->VALUES("SQL","SQL is....",NOW(),'kkami','developer');
7. 데이터 조회
SELECT * FROM 테이블명; // 전체 필드 데이터 검색
SELECT 필드명1, 필드명2 FROM 테이블명; // 특정 필드 데이터 검색
SELECT 필드명1, 필드명2 FROM 테이블명 WHERE 조건식; // 조건에 맞는 레코드 검색 명령
SELECT 필드명1, 필드명2 FROM 테이블명 WHERE 검색필드 LIKE 조건식 // 특정 문자열이 포함된 레코드 검색 명령
SELECT 필드명1, 필드명2 FROM 테이블명 ORDER BY 필드명; // 레코드 정렬 명령 -오름차순
SELECT 필드명1, 필드명2 FROM 테이블명 ORDER BY 필드명 DESC; // 레코드 정렬 명령 -내림차순
SELECT 필드명1, 필드명2 FROM 테이블명 ORDER BY 필드명 LIMIT 숫자;// 오름차순으로 해당 숫자만큼만 출력
SELECT * FROM 테이블명 LEFT JOIN 붙일 테이블명 ON 조건; // 테이블 합치기
ex) SELECT * FROM topic LEFT JOIN author ON topic.author_id = author.id;
8. 데이터 수정
UPDATE 테이블명 SET 필드명='바꾸고자 하는 값' WHERE 조건;
예를 들어
UPDATE opentutorials SET id=3 WHERE id=1;
결과(오차 값)가 더 작은 첫 번째 추정이 정답일 가능성이 높다고 판단한 것으로, 앞서 오차제곱합의 판단과 일치하다.
미니배치 학습
딥러닝은 훈련 데이터를 이용해 학습하면서, 훈련 데이터에 대한 손실함수의 값을 구하고 그 값을최소로하는 매개변수(가중치, 편향)를 찾아내는 것이다. 이를 위해서는 모든 훈련 데이터를 대상으로 손실함수 값을 구해야 한다. 보통 딥러닝은 미니배치(Mini-batch) 학습을 하기때문에 미니배치 크기만큼의 데이터에 대한 각각의 손실함수를 구해 평균을 내어'평균 손실 함수'를 계산한다.
(N은 미니배치 크기, tnk는 n번째 데이터의 k차원째의 값)
이는 데이터 하나에 대한 손실 함수를 단순히 N개의 데이터로 확장한 것이고, 마지막에 N으로 나누어 정규화하고 있다.
N으로 나눔으로써'평균 손실 함수'를 구하는 것이다.
빅데이터 수준이 되면 훈련 데이터가 수천만개도 넘는 거대한 값이 된다.
이런 경우 데이터 일부를 추려 전체의 '근사치'로 이용할 수 있다.
신경망 학습에서도 훈련 데이터로부터 일부만 골라 학습을 수행한다. 이 일부를미니배치라고 한다.
미니배치 학습을 하는 코드를 구현해보자.
import sys, os
sys.path.append(os.pardir) # 부모 디렉터리의 파일을 가져올 수 있도록 설정
import numpy as np
import matplotlib.pyplot as plt
from dataset.mnist import load_mnist
from two_layer_net import TwoLayerNet
# 데이터 읽기
(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, one_hot_label=True)
print(x_train.shape) #(60000,784)
print(t_train.shape) #(600000,10)
(load_mnist는 MNIST 데이터셋을 읽어오는 함수. 이 함수는 훈련 데이터와 시험 데이터를 읽음.
호출할 때 원-핫 인코딩으로 호출)
MNIST 데이터를 읽은 결과, 훈련 데이터는 60,000개고, 입력 데이터는 784(28x28)열인 이미지 데이터임을 알 수 있다.