DNN(딥 러닝) 라이브러리 : chainer와 TensorFlow의 비교 (2) ~CNN편~

17427 단어 TensorFlowChainer

소개



마지막 기사에서는 multi layer perceptron (MLP) 샘플 코드를 실행하려고했습니다. 이번은 컨벌루션 신경망(CNN)입니다.

샘플 코드



데이터 세트 네트워크 구조



데이터 세트는 이전과 마찬가지로 MNIST의 필기 문자 데이터 세트를 사용합니다 ($ 28\times 28 $의 이미지).

CNN의 설명과 네트워크 구조에 대해 다음 그림을 만들어 보았습니다.


컨벌루션 레이어



컨벌루션 필터 크기는 $5\times 5$이며, 제로 패딩을 하고 있으므로 출력 화상은 입력 화상과 같은 사이즈가 됩니다. 이 패딩의 조작, 지금 일어나는 무엇을 위해하고있는 것 (해도 좋은지)을 설명할 수 없었습니다.
  • 사이즈가 도중에 변하지 않기 때문에 차원의 계산이 간단해진다?
  • 이미지 가장자리 부분의 특징 량 추출이 가능합니까?

  • 그렇다고 생각합니까?

    풀링



    풀링 레이어는 맥스 풀링을 사용했습니다. 풀링함으로써, 물체(문자)의 위치 어긋남에 강한 특징량 추출을 실시할 수 있게 됩니다.

    네트워크 설명



    치아너



    chainer.py
    import chainer
    import chainer.functions as F
    import chainer.links as L
    
    class CNN(chainer.Chain):
        def __init__(self):
            super(MLP, self).__init__(
                                      conv1=L.Convolution2D(1, 32, 5, pad=2),
                                      conv2=L.Convolution2D(32, 64, 5, pad=2),
                                      l3=L.Linear(7 * 7 * 64, 1024),
                                      l4=L.Linear(1024, 10),
                                      )
    
        def __call__(self, x):
            h_conv1 = F.relu(self.conv1(x)) # xは[1,28,28]
            h_pool1 = F.max_pooling_2d(h_conv1, 2)
    
            h_conv2 = F.relu(self.conv2(h_pool1))
            h_pool2 = F.max_pooling_2d(h_conv2, 2)
    
            h_l3 = F.relu(self.l3(h_pool2))
    
            y = F.relu(self.l4(h_l3))
    
            return y
    

    tensorFLow



    tensorFlow.py
    import tensorFlow as tf
    
    # input
        x = tf.placeholder(tf.float32, [None, 784])                     
        x_image = tf.reshape(x, [-1, 28, 28, 1]) #フラットなベクトルを入力としているので2次元の画像に戻します
    
    # conv1
        w_conv1 = tf.Variable(tf.random_normal([5, 5, 1, 32], mean=0.0, stddev=0.05))
        b_conv1 = tf.Variable(tf.zeros([32]))            
    
        h_conv1 = tf.nn.relu(tf.nn.conv2d(x_image, w_conv1, strides=[1, 1, 1, 1], padding='SAME') + b_conv1)
    # pool1
        h_pool1 = tf.nn.max_pool(h_conv1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
    
    # conv2
        w_conv2 = tf.Variable(tf.random_normal([5, 5, 32, 64], mean=0.0, stddev=0.05))
        b_conv2 = tf.Variable(tf.zeros([64]))            
    
        h_conv2 = tf.nn.relu(tf.nn.conv2d(h_pool1, w_conv2, strides=[1, 1, 1, 1], padding='SAME') + b_conv2)
    # pool2
        h_pool2 = tf.nn.max_pool(h_conv2, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')            
        h_pool2_flat = tf.reshape(h_pool2, [-1, 7 * 7 * 64])
    
    # FC3
        W3 = tf.Variable(tf.random_normal([(28 / 2 / 2) ** 2 * 64, 1024], mean=0.0, stddev=0.05))
        b3 = tf.Variable(tf.zeros([1024]))
    
        h3 = tf.nn.relu(tf.matmul(h_pool2_flat, W3) + b3)        
    
    # FC4
        W4 = tf.Variable(tf.random_normal([1024, 10], mean=0.0, stddev=0.05))
        b4 = tf.Variable(tf.zeros([10]))            
    
        y = tf.nn.softmax(tf.matmul(h3, W4) + b4)
    
    # label
        y_ = tf.placeholder(tf.float32, [None, 10])
    
    

    본래는 컨벌루션층 등은 메소드화하면 좋다. 이번에는 슬라이드에 올리기 위해 작성했습니다.

    결론



    일반적으로 tensorFlow에 비해 chainer 쪽이 심플하게 쓸 수 있을까 하는 인상이군요. "레이어형"의 기술이기 때문입니까. 그러나 아직 내가 구현 한 네트워크 구조는 매우 단순하기 때문에 라이브러리의 차이를 아직 느낄 수있는 수준에는 없습니다. 「chainer는 RNN을 간단하게 걸린다」라고 하는 이야기를 들은 적이 있으므로 RNN도 시험해보고 싶은 곳입니다.

    그렇게 말해 두면서 그렇습니다만, 개인적으로는 tensorFlow를 사용해 갈까라고 생각하고 있습니다. 이유로는
  • tensorBoard 및 distributed tensorflow와 같은 확장
  • google이라는 것으로 발전성이 있을 것 같아?

  • 같은 곳입니다.
    tensorBoard는 시도했지만 매개 변수와 같은 시각화는 편리합니다. 그리고 간은 분산 처리를 간단하게 (?) 실시할 수 있는 distributed tensorflow입니다. 아직 시도하지 않지만, TITAN 4 장 찌르기의 서버 여러 대의 환경을 사용할 수 있게 되었기 때문에 꼭 시험해보고 싶습니다.

    좋은 웹페이지 즐겨찾기