Beispiel #1
0
# 학습 데이터 개수를 300개로 제한 -> overfitting 만들기 위해서
X_train = X_train[:300]
Y_train = Y_train[:300]
X_test = X_test[:300]  # 실험 시간 줄이기 위해서
Y_test = Y_test[:300]

epochs = 200  # 1 에포크: 모든 학습 데이터가 1번씩 학습된 경우
mini_batch_size = 100  # 1번 forward에 보낼 데이터 샘플 개수
train_size = X_train.shape[0]
iter_per_epoch = int(max(train_size / mini_batch_size, 1))
# 학습하면서 학습/테스트 데이터의 정확도를 각 에포크마다 기록
train_accuracies = []
test_accuracies = []

optimizer = Sgd(learning_rate=0.01)  # optimizer

for epoch in range(epochs):
    for i in range(iter_per_epoch):
        x_batch = X_train[(i * mini_batch_size):((i + 1) * mini_batch_size)]
        y_batch = Y_train[(i * mini_batch_size):((i + 1) * mini_batch_size)]
        gradients = neural_net.gradient(x_batch, y_batch)
        optimizer.update(neural_net.params, gradients)

    train_acc = neural_net.accuracy(X_train, Y_train)
    train_accuracies.append(train_acc)
    test_acc = neural_net.accuracy(X_test, Y_test)
    test_accuracies.append(test_acc)
    print(f'epoch #{epoch}: train={train_acc}, test={test_acc}')

x = np.arange(epochs)
Beispiel #2
0
# 각 실험 조건 별로 테스트할 신경망을 생성
neural_nets = dict()
train_losses = dict()
for key, type in weight_init_types.items():
    neural_nets[key] = MultiLayerNet(input_size=784,
                                     hidden_size_list=[100, 100, 100, 100],
                                     output_size=10,
                                     weight_init_std=type)
    train_losses[key] = []  # 빈 리스트 생성 - 실험(학습)하면서 손실값들을 저장

# MNIST train/test 데이터 로드
(X_train, Y_train), (X_test, Y_test) = load_mnist(one_hot_label=True)

iterations = 2_000  # 학습 회수
batch_size = 128  # 1번 학습에 사용할 샘플 개수(미니 배치)
optimizer = Sgd(learning_rate=0.01)  # 파라미터 최적화 알고리즘
# optimizer를 변경하면 테스트
optimizer = Adam()

np.random.seed(109)
for i in range(iterations):  # 2,000번 반복하면서
    # 미니 배치 샘플 랜덤 추출
    mask = np.random.choice(X_train.shape[0], batch_size)
    X_batch = X_train[mask]
    Y_batch = Y_train[mask]

    for key, net in neural_nets.items():  # 테스트 신경망 종류마다 반복
        # gradient 계산
        gradients = net.gradient(X_batch, Y_batch)
        # 파라미터(W, b) 업데이트
        optimizer.update(net.params, gradients)
Beispiel #3
0
from ch05.ex10_twolayer import TwoLayerNetwork
from ch06.ex02_sgd import Sgd
from ch06.ex04_adagrad import AdaGrad
from ch06.ex05_adam import Adam
from ch06.ex06_RMSProp import RMSProp
from ch06.ex07_nesterov import Nesterov
from ch06.ex03_momentum import Momentum
from dataset.mnist import load_mnist

if __name__ == '__main__':
    # MNIST(손글씨 이미지) 데이터 로드
    (X_train, Y_train), (X_test, Y_test) = load_mnist(one_hot_label=True)

    # 최적화 알고리즘을 구현한 클래스의 인스턴스들을 dict에 저장
    optimizers = dict()
    optimizers['sgd'] = Sgd()
    optimizers['momentum'] = Momentum()
    optimizers['adagrad'] = AdaGrad()
    optimizers['adam'] = Adam()
    optimizers['rmsprop'] = RMSProp()
    optimizers['nesterov'] = Nesterov()

    # 은닉층 1개, 출력층 1개로 이루어진 신경망을 optimizer 개수만큼 생성
    # 각 신경망에서 손실들을 저장할 dict를 생성
    neural_nets = dict()
    train_losses = dict()
    for key in optimizers:
        neural_nets[key] = TwoLayerNetwork(input_size=784,
                                           hidden_size=32,
                                           output_size=10)
        train_losses[key] = []  # loss들의 이력(history)를 저장
weight_init_types = {'std 0.01': 0.01, 'Xavier': 'sigmoid', 'He': 'relu'}

neural_nets = dict()
train_loses = dict()
for key, value in weight_init_types.items():
    neural_nets[key] = MultiLayerNet(input_size=784,
                                     hidden_size_list=[100, 100, 100, 100],
                                     output_size=10,
                                     weight_init_std=value)
    train_loses[key] = []  # 실험하면서 손실값 저장

# 2. MNIST train, test 데이터 로드
(X_train, Y_train), (X_test, Y_test) = load_mnist(one_hot_label=True)
iterators = 2_000
batch_size = 128  # 1번 학습에 사용할 샘플 갯수(미니배치)
optimizer = Sgd(learning_rate=0.01)  # 파라미터 최적화를 할 알고리즘
# optimizer = Adam()     # 파라미터 최적화를 할 알고리즘
# optimizer 변경해가면서 테스트

# 3. 2,000번 반복하면서
np.random.seed(109)
for i in range(iterators):
    # 미니 배치 샘플 랜덤 추출
    batch_mask = np.random.choice(X_train.shape[0], batch_size)
    X_batch = X_train[batch_mask]
    Y_batch = Y_train[batch_mask]
    # 테스트 할 신경망 종류마다 반복
    for key, value in neural_nets.items():
        # gradient 계산
        gradient = value.gradient(X_batch, Y_batch)
        # 파라미터(W, b) 업데이트
(X_train, Y_train), (X_test, Y_test) = load_mnist(one_hot_label=True)
# 학습 시간을 줄이기 위해서 학습 데이터의 개수를 줄임.
X_train = X_train[:1000]  # 데이터 1000개만 사용
Y_train = Y_train[:1000]

train_size = X_train.shape[0]
batch_size = 128
learning_rate = 0.01
iterations = 200

train_accuracies = []  # 배치 정규화를 사용하지 않는 신경망의 정확도를 기록
bn_train_accuracies = []  # 배치 정규화를 사용하는 신경망의 정확도를 기록

# optimizer = Sgd(learning_rate)
# 파라미터 최적화 알고리즘이 SGD가 아닌 경우에는 신경망 개수만큼 optimizer를 생성.
optimizer = Sgd(learning_rate)
bn_optimizer = Sgd(learning_rate)

# 학습하면서 정확도의 변화를 기록
for i in range(iterations):
    # 미니 배치를 랜덤하게 선택(0~999 숫자들 중 128개를 랜덤하게 선택)
    mask = np.random.choice(train_size, batch_size)
    x_batch = X_train[mask]
    y_batch = Y_train[mask]

    # 배치 정규화를 사용하지 않는 신경망에서 gradient를 계산.
    gradients = neural_net.gradient(x_batch, y_batch)
    # 파라미터 업데이트(갱신) - W(가중치), b(편향)을 업데이트
    optimizer.update(neural_net.params, gradients)
    # 업데이트된 파라미터들을 사용해서 배치 데이터의 정확도 계산
    acc = neural_net.accuracy(x_batch, y_batch)
Beispiel #6
0
from ch05.ex10_twolayer import TwoLayerNetwork
from ch06.ex02_sgd import Sgd
from ch06.ex04_adagrad import AdaGrad
from ch06.ex05_adam import Adam
from ch06.ex06_rmsprop import RMSProp
from ch06.ex07_nesterov import Nesterov
from ch06.ex3_momentum import Momentum
from dataset.mnist import load_mnist

if __name__ == '__main__':
    # MNIST(손글씨 이미지) 데이터 로드
    (X_train, Y_train), (X_test, Y_test) = load_mnist(one_hot_label=True)

    # 최적화 알고리즘을 구현한 클래스의 인스턴스들을 dict에 저장
    optimizers = dict()
    optimizers['SGD'] = Sgd()
    optimizers['Momentum'] = Momentum()
    optimizers['AdaGrad'] = AdaGrad()
    optimizers['Adam'] = Adam()
    optimizers['RMSProp'] = RMSProp()
    optimizers['Nesterov'] = Nesterov()

    # 은닉층 1개, 출력층 1개로 이루어진 신경망을 optimizers 개수만큼 생성
    # 각 신경망에서 손실들을 저장할 dict를 생성
    neural_nets = dict()
    train_losses = dict()
    for key in optimizers:
        neural_nets[key] = TwoLayerNetwork(input_size=784,
                                           hidden_size=32,
                                           output_size=10)
        train_losses[key] = []  # loss들의 이력(history)를 저장하게 됨.
Beispiel #7
0
                                    use_batchnorm=True)
neural_net = MultiLayerNetExtend(input_size=784,
                                 hidden_size_list=[100, 100, 100, 100, 100],
                                 output_size=10,
                                 weight_init_std=0.1,
                                 use_batchnorm=False)

(X_train, Y_train), (X_test, Y_test) = load_mnist(one_hot_label=True)
# 학습 시간을 줄이기 위해서 학습 데이터의 개수 줄이기
X_train = X_train[:1000]
Y_train = Y_train[:1000]

iterator = 200
batch_size = 128
learning_rate = 0.01
neural_optimizer = Sgd()
bn_neural_optimizer = Sgd()
neural_acc_list = []
bn_neural_acc_list = []

for i in range(iterator):
    mask = np.random.choice(X_train.shape[0], batch_size)
    X_batch = X_train[mask]
    Y_batch = Y_train[mask]
    for network in (neural_net, bn_neural_net):
        gradient = network.gradient(X_batch, Y_batch)
        if network == neural_net:
            neural_optimizer.update(network.params, gradient)
            neural_acc = neural_net.accuracy(X_batch, Y_batch)
            neural_acc_list.append(neural_acc)
        else:
Beispiel #8
0
# 미니 배치를 20번 학습시키면서, 두 신경망에서 정확도(accuracy)를 기록
# -> 그래프
(X_train, Y_train), (X_test, Y_test) = load_mnist(one_hot_label=True)
# 학습 시간을 줄이기 위해 학습 데이터의 개수를 줄임.
X_train = X_train[:1000]
Y_train = Y_train[:1000]

train_size = X_train.shape[0]
batch_size = 128
learning_rate = 0.1
iterations = 20

train_accuracies = []  # 배치 정규화를 사용하지 않는 신경망의 정확도를 기록
bn_train_accuracies = []  # 배치 정규화를 사용하는 신경망의 정확도를 기록

optimizer = Sgd(learning_rate)
bn_optimizer = Sgd(learning_rate)

# 학습하면서 정확도의 변화를 기록
np.random.seed(110)

for i in range(iterations):
    # 미니 배치를 랜덤하게 선택(0~999 숫자들 중 128개를 랜덤하게 선택)
    mask = np.random.choice(train_size, batch_size)
    x_batch = X_train[mask]
    y_batch = Y_train[mask]

    # 각 신경망에서 gradient를 계산
    gradients = neural_net.gradient(x_batch, y_batch)
    # 파라미터 업데이터(갱신) - W(가중치), b(편향)을 업데이트
    optimizer.update(neural_net.params, gradients)
Beispiel #9
0
from ch06.ex05_ADAM import Adam
from ch06.ex06_rmsprop import RMSProp
from ch06.ex07_nesterov import Nesterov
from dataset.mnist import load_mnist



if __name__ == '__main__':
    #MNIST(손글씨 이미지) 데이터 로드
    (X_train, Y_train), (X_test, Y_test) = load_mnist(one_hot_label= True)
    # train_size = X_train.shape[0]     # 60000만개를 모두 트레인 시킬 것은 아니라 넣어주지 않음
    # X_train.shape = (60000, 784)

    #최적화 알고리즘을 구현한 클래스의 인스턴스들을 dict에 저장
    optimizers = dict()
    optimizers['SGD'] = Sgd() # key값으로 알고리즘 이름을 준다 ex. ['SGD']  = 그리고 다른 파일에서 만든 알고리즘을 import 해준다
    optimizers['Momentum'] = Momentum()
    optimizers['Adagrad'] = AdaGrad()
    optimizers['ADAM'] = Adam()
    optimizers['RMS'] = RMSProp()
    optimizers['Nesterov'] = Nesterov()


    # 은직층 1개, 출력층 1개로 이루어진 신경망을 optimizer 개수만큼 생성
    # 각 신경망에서 손실들을 저장할 dict를 생성
    train_losses = dict()
    neural_nets = dict()
    for key in optimizers:
        neural_nets[key] = TwolayerNetwork(input_size = 784,
                                          hidden_size = 32,
                                          output_size= 10)