DNN(딥 러닝) 라이브러리 : chainer와 TensorFlow의 비교 (2) ~CNN편~
17427 단어 TensorFlowChainer
소개
마지막 기사에서는 multi layer perceptron (MLP) 샘플 코드를 실행하려고했습니다. 이번은 컨벌루션 신경망(CNN)입니다.
샘플 코드
데이터 세트 네트워크 구조
데이터 세트는 이전과 마찬가지로 MNIST의 필기 문자 데이터 세트를 사용합니다 ($ 28\times 28 $의 이미지).
CNN의 설명과 네트워크 구조에 대해 다음 그림을 만들어 보았습니다.
컨벌루션 레이어
컨벌루션 필터 크기는 $5\times 5$이며, 제로 패딩을 하고 있으므로 출력 화상은 입력 화상과 같은 사이즈가 됩니다. 이 패딩의 조작, 지금 일어나는 무엇을 위해하고있는 것 (해도 좋은지)을 설명할 수 없었습니다.
데이터 세트 네트워크 구조
데이터 세트는 이전과 마찬가지로 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입니다. 아직 시도하지 않지만, TITAN 4 장 찌르기의 서버 여러 대의 환경을 사용할 수 있게 되었기 때문에 꼭 시험해보고 싶습니다.
Reference
이 문제에 관하여(DNN(딥 러닝) 라이브러리 : chainer와 TensorFlow의 비교 (2) ~CNN편~), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ymfj/items/30c83abc70a97c6e2e10텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)