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},
# 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'])