Example #1
0
import matplotlib.pyplot as plt
from dataset.mnist import load_mnist
from ch07.simple_convnet import SimpleConvNet
from common.trainer import Trainer

# 读入数据
(x_train, t_train), (x_test, t_test) = load_mnist(flatten=False)

# 处理花费时间较长的情况下减少数据 
#x_train, t_train = x_train[:5000], t_train[:5000]
#x_test, t_test = x_test[:1000], t_test[:1000]

max_epochs = 20

network = SimpleConvNet(input_dim=(1,28,28), 
                        conv_param = {'filter_num': 30, 'filter_size': 5, 'pad': 0, 'stride': 1},
                        hidden_size=100, output_size=10, weight_init_std=0.01)
                        
trainer = Trainer(network, x_train, t_train, x_test, t_test,
                  epochs=max_epochs, mini_batch_size=100,
                  optimizer='Adam', optimizer_param={'lr': 0.001},
                  evaluate_sample_num_per_epoch=1000)
trainer.train()

# 保存参数
network.save_params("params.pkl")
print("Saved Network Parameters!")

# 绘制图形
markers = {'train': 'o', 'test': 's'}
x = np.arange(max_epochs)
                    ncols)  # ceil = ceiling # 올림한 숫자 # floor() - 소숫점 버려버리기
    # num_filters = 30일 때, ncol = 8면, nrow = 4 => 컬럼 갯수가 있으면 row는 계산하면 된다
    for i in range(num_filters):  #필터 개수만큼 반복
        # subplot 설정
        plt.subplot(nrows, ncols, (i + 1), xticks=[], yticks=[])
        # subplot에 이미지 그리기
        plt.imshow(filters[i, 0], cmap='gray')
        # 5 * 5 행렬이 추출된다
        # 4차원 행렬 [ [3차원], [3차원] ... ] 에서, i번째
        # -> [3차원] 리스트 한개를 꺼내서 ->
        # [i,0]은 이 3차원 리스트에서 0번째 판한개를 꺼내주는 것
    plt.show()


if __name__ == '__main__':
    cnn = SimpleConvNet()
    # 학습시키기 전 파라미터 - 임의의 값들로 최기화된 필터
    before_filters = cnn.params['W1']
    print(before_filters.shape
          )  # (30, 1, 5, 5) # (filter_num, n_channel, filter size 5 * 5)
    # 학습 전 파라미터를 그래프로 출력
    show_filters(before_filters, num_filters=30, ncols=8)

    # 학습 끝난 후 파라미터
    # after_params = cnn.load_params('cnn_params.pkl')
    # after_filters = after_params['W1'] # load_params 에 리턴값이 없어서 에러가 났다

    # pickle 파일에 저장된 파라미터를 cnn의 필드로 로드
    cnn.load_params('cnn_params.pkl')
    after_filters = cnn.params['W1']
    # 학습 끝난 후 갱신(업데이트)된 파라미터를 그래프로 출력
"""
SimpleConvNet (간단한 CNN)을 활용한 MNIST 손글씨 이미지 데이터 분류
"""
import numpy
from matplotlib import pyplot as plt

from ch07.simple_convnet import SimpleConvNet
from common.trainer import Trainer
from dataset.mnist import load_mnist

# 데이터 로드
(X_train, Y_train), (X_test, Y_test) = load_mnist(flatten=False)

# 테스트 시간을 줄이기 위해서 데이터 사이즈를 줄임.
# X_train, Y_train = X_train[:5000], Y_train[:5000]
# X_test, Y_test = X_test[:1000], Y_test[:1000]

# CNN 생성
cnn = SimpleConvNet()

# 테스트 도우미 클래스
trainer = Trainer(network=cnn,
                  x_train=X_train,
                  t_train=Y_train,
                  x_test=X_test,
                  t_test=Y_test,
                  epochs=20,
                  mini_batch_size=100,
                  optimizer='Adam',
                  optimizer_param={'lr': 0.01},
Example #4
0
# coding: utf-8
import numpy as np
from ch07.simple_convnet import SimpleConvNet

network = SimpleConvNet(input_dim=(1, 10, 10),
                        conv_param={
                            'filter_num': 10,
                            'filter_size': 3,
                            'pad': 0,
                            'stride': 1
                        },
                        hidden_size=10,
                        output_size=10,
                        weight_init_std=0.01)

X = np.random.rand(100).reshape((1, 1, 10, 10))
T = np.array([1]).reshape((1, 1))

grad_num = network.numerical_gradient(X, T)
grad = network.gradient(X, T)

for key, val in grad_num.items():
    print(key, np.abs(grad_num[key] - grad[key]).mean())
from ch07.simple_convnet import SimpleConvNet


def filter_show(filters, nx=8, margin=3, scale=10):
    """
    c.f. https://gist.github.com/aidiary/07d530d5e08011832b12#file-draw_weight-py
    """
    FN, C, FH, FW = filters.shape
    ny = int(np.ceil(FN / nx))

    fig = plt.figure()
    fig.subplots_adjust(left=0,
                        right=1,
                        bottom=0,
                        top=1,
                        hspace=0.05,
                        wspace=0.05)

    for i in range(FN):
        ax = fig.add_subplot(ny, nx, i + 1, xticks=[], yticks=[])
        ax.imshow(filters[i, 0], cmap=plt.cm.gray_r, interpolation='nearest')
    plt.show()


network = SimpleConvNet()
# ランダム初期化後の重み
filter_show(network.params['W1'])

# 学習後の重み
network.load_params("params.pkl")
filter_show(network.params['W1'])