アイドル顔識別のためのデータ収集 ãã³ãã³ãç¶ã㦠ãããªãã«éã¾ã£ã¦ããããããã使ã£ã¦å¥ã®ãã¨ãâ¦ã¨ãããã¨ã§DCGANã使ã£ãDeep Learningã«ããã¢ã¤ãã«ã®é¡ç»åã®ãçæãããã£ã¦ã¿ãã
ã¾ã ã ãã¶æªãã§ããã㧠ãã¾ããã¬ã¤ãããªããã©â¦ãé¡ç»åãå¤ãåéã§ãã¦ããã¢ã¤ãã«90人ã®é¡ç»åãããããã120件ãæ½åºããåè¨10800件ããã¨ã«å¦ç¿ããã¦çæããããã®ã
åé¡ã¿ã¹ã¯ã¨ã¯éæ¹åã®å¤æãè¤æ°ã®ã¢ãã«å®ç¾©ãªã©ããã£ã¦ãªããªãç解ãé£ããé¨åããã£ããã©ãä½ã£ã¦ã¿ãã¨ããã¾ã§é£ããã¯ãªããåºæ¥ä¸ãã£ã¦ããéç¨ãè¦ãã®ã楽ããã ã¨ã¦ãé¢ç½ãã
DCGANã¨ã¯
"Deep Convolutional Generative Adversarial Networks"ãç¥ãã¦DCGANããã¡ãã®è«æã§æåã«ãªã£ããã®ããªï¼
ãã¨ã¯å¿ç¨äºä¾ã¨ãã¦æ¥æ¬èªã®è¨äºã§ã¯ä»¥ä¸ã®ãã®ãã¨ã¦ã詳ããã®ã§ãããèªãã°ååããªãã¨ã
ä¸å¿ããããã¦æ¸ãã¦ããã¨ã
é¡èå¥ã®ãããªåé¡ã¿ã¹ã¯ã¯
- å ¥åã¯ç»å: 縦Ã横Ããã£ãã«æ°(RGBã«ã©ã¼ãªã3)ã§åãã¯ã»ã«ã®å¤
- åºåã¯<åé¡ã¯ã©ã¹æ°>次å ãã¯ãã«: æãé«ãå¤ãåºåãã¦ããã¯ã©ã¹ãæ¨å®çµæã¨ãªã
ã¨ãã£ãåé¡å¨ãä½ã£ã¦å¦ç¿ãããã ãã ããDCGANã§ã¯ãããã£ãåé¡å¨ã"Discriminator"ã¨ãã¦ä½¿ããããã¨å¥ã«"Generator"ã¨ããã¢ãã«ãæ§ç¯ã使ç¨ãããGeneratorã®å½¹å²ã¯
- å ¥åã¯ä¹±æ°: -1.0ã1.0 ã®å¤ãã¨ãn次å ã®ãã¯ãã«
- åºåã¯ç»å
ã¨ãããã®ã§ããããã®åºåãæçµçãªãæ©æ¢°å¦ç¿ã«ããç»åçæãã®ææç©ã¨ãªãã
åçã¨ãã¦ã¯ã
- Discriminatorã«ãGeneratorã«ãã£ã¦ä¹±æ°ãã¯ãã«ããçæãããç»åãã¨ãå¦ç¿ç¨ãã¼ã¿ç»å(çæããããç»åã®ãææ¬ã¨ãªããã®)ãã®ä¸¡æ¹ãé£ãããããããã®ç»åããGeneratorã«ãã£ã¦çæããããã®ã§ãããå¦ããã®å¤å®ãããã
- Discriminatorã¯æ£ããå¤å®ã§ããããå¦ç¿ãããGeneratorã¯Discriminatorã欺ãã¦èª¤å¤å®ãããç»åãçæããããå¦ç¿ãã
ãããç¹°ãè¿ãã¦ãäºãã«ç²¾åº¦ãä¸ãããã¨ã§ãã©ã³ãã å ¥åããå¦ç¿ãã¼ã¿ãã£ããã®ç»åãçæã§ããããã«ãªããã¨ãããã®ã
(http://qiita.com/mattya/items/e5bfe5e04b9d2f0bbd47 ããå¼ç¨)
è¨èã«ãã¦ã¿ãã¨ã¾ããªãã»ã©ãã¨ã¯æããã©ãããªä¸æãåæ¹ãå¦ç¿ã§ããã®ããã¨ããæãã§ã¯ããããã®ã¸ããBatch Normalizationãå
¥ãããLeaky ReLUã使ã£ãããã¦ä¸æãããããã«ãªã£ãããã¨ããã®ãä¸è¨ã®è«æã®ã話ã®ããã ã
TensorFlowã§ã®å®è£
å è¡ã®DCGANå®è£ ä¾ã¯æ¢ã«çµæ§ããã
- https://github.com/Newmu/dcgan_code (Theano)
- https://github.com/soumith/dcgan.torch (Torch)
- https://github.com/mattya/chainer-DCGAN (Chainer)
- https://github.com/carpedm20/DCGAN-tensorflow (TensorFlow)
TensorFlowã«ããå®è£ ãæ¢ã«ãã£ãã®ã§ããããåèã«ãã¤ã¤ãèªåã§æ¸ãã¦ã¿ãã
Generator
ä¹±æ°ãã¯ãã«ããç»åãçæããã¢ãã«ã¯ä¸å³ã®ããã«ãªãã
(arXiv:1511.06434ããå¼ç¨)
åé¡å¨ãªã©ã§ä½¿ã£ã¦ããç³ã¿è¾¼ã¿ã®éæ¹åã®æä½ã§ãæåã¯å°ããªå¤æ°ã®feature mapã«reshapeãã¦ããããå¾ã
ã«å°æ°ã®å¤§ããªãã®ã«ãã¦ããã"deconvolution"ã¨å¼ãã ãå¼ã°ãªãã£ããããªã®ããªãTensorFlowã§ã¯ãã®æä½ã¯tf.nn.conv2d_transpose
ã¨ããé¢æ°ã§å®ç¾ããããã ã
- Rename deconv2d to conv2d_transpose and expose publicly · tensorflow/tensorflow@b046aa3 · GitHub
- https://www.tensorflow.org/versions/r0.8/api_docs/python/nn.html#conv2d_transpose
å層éã®å¤æã§W(weights)ãæãã¦B(biases)ãå ãããã®Wã¨Bã®å¦ç¿ã«ããæçµçãªåºåç»åãå¤åããã¦ãããã¨ã«ãªãããã¨è«æã«ããéãReLUã«ãããåã«Batch Normalizationã¨ããå¦çããããããã¯TensorFlow 0.8.0ããtf.nn.batch_normalization
ãç»å ´ãã¦ããã®ããªï¼ããã«tf.nn.moments
ã§å¾ãmeanã¨varianceã渡ãã¦ãããã°è¯ãããã
ã¨ãããã¨ã§ãããªæãã®ã³ã¼ãã§ä½ã£ãã
def model(): depths = [1024, 512, 256, 128, 3] i_depth = depths[0:4] o_depth = depths[1:5] with tf.variable_scope('g'): inputs = tf.random_uniform([self.batch_size, self.z_dim], minval=-1.0, maxval=1.0) # reshape from inputs with tf.variable_scope('reshape'): w0 = tf.get_variable('weights', [self.z_dim, i_depth[0] * self.f_size * self.f_size], tf.float32, tf.truncated_normal_initializer(stddev=0.02)) b0 = tf.get_variable('biases', [i_depth[0]], tf.float32, tf.zeros_initializer) dc0 = tf.nn.bias_add(tf.reshape(tf.matmul(inputs, w0), [-1, self.f_size, self.f_size, i_depth[0]]), b0) mean0, variance0 = tf.nn.moments(dc0, [0, 1, 2]) bn0 = tf.nn.batch_normalization(dc0, mean0, variance0, None, None, 1e-5) out = tf.nn.relu(bn0) # deconvolution layers for i in range(4): with tf.variable_scope('conv%d' % (i + 1)): w = tf.get_variable('weights', [5, 5, o_depth[i], i_depth[i]], tf.float32, tf.truncated_normal_initializer(stddev=0.02)) b = tf.get_variable('biases', [o_depth[i]], tf.float32, tf.zeros_initializer) dc = tf.nn.conv2d_transpose(out, w, [self.batch_size, self.f_size * 2 ** (i + 1), self.f_size * 2 ** (i + 1), o_depth[i]], [1, 2, 2, 1]) out = tf.nn.bias_add(dc, b) if i < 3: mean, variance = tf.nn.moments(out, [0, 1, 2]) out = tf.nn.relu(tf.nn.batch_normalization(out, mean, variance, None, None, 1e-5)) return tf.nn.tanh(out)
å
¥åã¯ä¹±æ°ãªã®ã§tf.random_uniform
ã使ãã°æ¯åã©ã³ãã ãªå
¥åããä½ã£ã¦ããããéç³ã¿è¾¼ã¿ã¯channelæ°ãå¤ããã ããªã®ã§for loopã§ç¹°ãè¿ãã ãã§å®ç¾©ã§ãããæå¾ã®åºåã«ã¯Batch Normalizationããããã«tf.nn.tanh
㧠-1.0〜1.0 ã®ç¯å²ã®åºåã«ããã
Discriminator
ãã¡ãã¯ä»¥åã¾ã§ãã£ã¦ããåé¡å¨ã¨ã»ã¼åãã§ãç»åå
¥åããç³ã¿è¾¼ã¿ãç¹°ãè¿ãã¦å°ããªfeature mapã«è½ã¨ãè¾¼ãã§ãããæå¾ã¯å
¨çµåãããã©ãé ã層ã¯è¦ããªãããããåºåã¯ãæ¢åã®TensorFlowå®è£
ãªã©ã§ã¯1次å
ã«ãã¦sigmoidã®åºåã使ããã¨ã§ã0ã«è¿ãã 1ã«è¿ããããå¤å®ã«ãã¦ããããã ãã©ãèªåã¯sigmoidãéããªã2次å
ã®åºåã«ãã¦ãã0çªç®ã大ããªåºåã«ãªãã 1çªç®ã大ãããªãããã§åé¡ããããã«ãã(誤差é¢æ°ã«ã¤ãã¦ã¯å¾è¿°)ã
ã¾ãå層ã®åºåã«ã¯Leaky ReLUã使ãã¨ã®ãã¨ã§ãããã«è©²å½ããé¢æ°ã¯TensorFlowã«ã¯ç¡ãããã ã£ããã©ãtf.maximum(alpha * x, x)
ãããã«è©²å½ããã¨ãããã¨ã§ ããã使ã£ãã
ã¾ããDiscriminatorã¯ãå¦ç¿ç¨ãã¼ã¿ãã¨ãGeneratorã«ãã£ã¦çæããããã®ãã®2ã¤ã®å
¥åãéããã¨ã«ãªãã®ã§ããã¼ã2åç¹°ãè¿ããããã¨ã«ãªãããã©ããã¯åãã¢ãã«ã«å¯¾ãã¦å
¥åºåãè¡ããã¤ã¾ãåãå¤æ°ã使ãåãå¿
è¦ããããããããã¨ãã¯tf.variable_scope
ã§reuse=True
ãæå®ããã¨2åç®ä»¥éã§åãå¤æ°ãéè¤å®ç¾©ãããªãããã«ãªããããããã¡ãããååã®å¼ã³åºããå¦ãã使ãå´ãæèããå¿
è¦ããªãããPython3ã®nonlocalã使ã£ã¦ã¯ãã¼ã¸ã£çãªæãã§æ¸ãã¦ã¿ãã
ã¨ãããã¨ã§ãããªã³ã¼ãã
def __discriminator(self, depth1=64, depth2=128, depth3=256, depth4=512): reuse = False def model(inputs): nonlocal reuse depths = [3, depth1, depth2, depth3, depth4] i_depth = depths[0:4] o_depth = depths[1:5] with tf.variable_scope('d', reuse=reuse): outputs = inputs # convolution layer for i in range(4): with tf.variable_scope('conv%d' % i): w = tf.get_variable('weights', [5, 5, i_depth[i], o_depth[i]], tf.float32, tf.truncated_normal_initializer(stddev=0.02)) b = tf.get_variable('biases', [o_depth[i]], tf.float32, tf.zeros_initializer) c = tf.nn.bias_add(tf.nn.conv2d(outputs, w, [1, 2, 2, 1], padding='SAME'), b) mean, variance = tf.nn.moments(c, [0, 1, 2]) bn = tf.nn.batch_normalization(c, mean, variance, None, None, 1e-5) outputs = tf.maximum(0.2 * bn, bn) # reshepe and fully connect to 2 classes with tf.variable_scope('classify'): dim = 1 for d in outputs.get_shape()[1:].as_list(): dim *= d w = tf.get_variable('weights', [dim, 2], tf.float32, tf.truncated_normal_initializer(stddev=0.02)) b = tf.get_variable('biases', [2], tf.float32, tf.zeros_initializer) reuse = True return tf.nn.bias_add(tf.matmul(tf.reshape(outputs, [-1, dim]), w), b) return model
Input Images
Discriminatorã«ã¯[batch size, height, width, channel]
ã®å
¥åãä¸ããåæã§ä½ã£ã¦ãã¦ãå¦ç¿ç¨ã®ç»åãã¼ã¿ã¯ãã®å½¢ã®mini batchãä½ããã°è¯ãã以前から é¡ç»åãã¼ã¿ã¯TFRecordsã®ãã¡ã¤ã«å½¢å¼ã§ä½ã£ã¦ã㦠ãããèªã¿åã£ã¦Batchã«ããå¦çã¯æ¸ãã¦ããã®ã§ããããã»ã¼ãã®ã¾ã¾å©ç¨ã§ããã
def inputs(batch_size, f_size): files = [os.path.join(FLAGS.data_dir, f) for f in os.listdir(FLAGS.data_dir) if f.endswith('.tfrecords')] fqueue = tf.train.string_input_producer(files) reader = tf.TFRecordReader() _, value = reader.read(fqueue) features = tf.parse_single_example(value, features={'image_raw': tf.FixedLenFeature([], tf.string)}) image = tf.cast(tf.image.decode_jpeg(features['image_raw'], channels=3), tf.float32) image.set_shape([INPUT_IMAGE_SIZE, INPUT_IMAGE_SIZE, 3]) image = tf.image.random_flip_left_right(image) min_queue_examples = FLAGS.num_examples_per_epoch_for_train images = tf.train.shuffle_batch( [image], batch_size=batch_size, capacity=min_queue_examples + 3 * batch_size, min_after_dequeue=min_queue_examples) return tf.sub(tf.div(tf.image.resize_images(images, f_size * 2 ** 4, f_size * 2 ** 4), 127.5), 1.0)
å
ã
ã¯åé¡ã¿ã¹ã¯ã®æ師ãã¼ã¿ãªã®ã§label_id
ã¨ã»ããã«ãªã£ã¦ãããã¼ã¿ã»ããã ãã©ãããã§ã¯JPEGãã¤ããªé¨åã ãåãåºãã¦ä½¿ããã¨ã«ãªããdistortç³»ã®å¦çã¯ã¨ããããã»ã¼ç¡ãã§ãrandom_flip_left_right
(ã©ã³ãã å·¦å³å転)ã ãå
¥ãã¦ããããã¨åé¡ã¿ã¹ã¯ã§ã¯æå¾ã«tf.image.per_image_whitening
ãå
¥ãã¦ãããã©ããããããã¨å
ã®ç»åã«æ»ããªããªã£ã¦ãã¾ãã¨æã£ãã®ã§ åç´ã« 0〜255 ã®å¤ã -1.0〜1.0 ã®å¤ã«ãªãããå²ã£ã¦å¼ãã ãã«ãã¦ããã
Training
ã§ãGeneratorã¨Discriminatorãåºæ¥ãããã¨ã¯å¦ç¿ã®æç¶ããããããã«å¯¾ãã¦æå°åãã¹ã誤差(loss)ãå®ç¾©ãã¦ãOptimizerã«æ¸¡ããåè¿°ãããDiscriminatorã¯æ£ããå¤å®ã§ããããå¦ç¿ãããGeneratorã¯Discriminatorã欺ãã¦èª¤å¤å®ãããç»åãçæããããå¦ç¿ãããã¨ããã®ãã³ã¼ãã«è½ã¨ãè¾¼ãã
Discriminatorã«ããåé¡ãã0
ãªãç»åã¯Generatorã«ãããã®ã1
ãªãå¦ç¿ãã¼ã¿ã®ãã®ãã¨å¤å®ããé¢æ°D(x)
ã¨å®ç¾©ããGeneratorããçæããç»åãG()
ãå¦ç¿ãã¼ã¿ã®ç»åãI
ã¨ããã¨
- Generatorã¯ã
D(G())
ããã¹ã¦1
ã«ãªãã®ãçæ³ - Discriminatorã¯ã
D(G())
ããã¹ã¦0
ã«ãD(I)
ããã¹ã¦1
ã«ããã®ãçæ³
ãªã®ã§ããã®ã®ã£ãããlossã¨ãã¦å®ç¾©ãããã¨ã«ãªããDiscriminatorã®ãããªæä»çãªå¯ä¸ã®åé¡ã¯ã©ã¹ã決ããå ´åã®èª¤å·®ã«ã¯tf.nn.sparse_softmax_cross_entropy_with_logits
ã使ãã®ãè¯ããããã
ã¨ãããã¨ã§ãããªæãã®ã³ã¼ãã
def train(self, input_images): logits_from_g = self.d(self.g()) logits_from_i = self.d(input_images) tf.add_to_collection('g_losses', tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits_from_g, tf.ones([self.batch_size], dtype=tf.int64)))) tf.add_to_collection('d_losses', tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits_from_i, tf.ones([self.batch_size], dtype=tf.int64)))) tf.add_to_collection('d_losses', tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits_from_g, tf.zeros([self.batch_size], dtype=tf.int64)))) g_loss = tf.add_n(tf.get_collection('g_losses'), name='total_g_loss') d_loss = tf.add_n(tf.get_collection('d_losses'), name='total_d_loss') g_vars = [v for v in tf.trainable_variables() if v.name.startswith('g')] d_vars = [v for v in tf.trainable_variables() if v.name.startswith('d')] g_optimizer = tf.train.AdamOptimizer(learning_rate=0.0001, beta1=0.5).minimize(g_loss, var_list=g_vars) d_optimizer = tf.train.AdamOptimizer(learning_rate=0.0001, beta1=0.5).minimize(d_loss, var_list=d_vars) with tf.control_dependencies([g_optimizer, d_optimizer]): train_op = tf.no_op(name='train') return train_op, g_loss, d_loss
è«æã«ããã¨AdamOptimizer
ã®ãã©ã¡ã¼ã¿ã¯ããã©ã«ãå¤ã§ã¯ãªãlearning_rate
ã¯0.0002
ãbeta1
ã¯0.5
ã使ãã¨ã®ãã¨ã ã£ãããã©ãQiitaã§ã®å
è¡äºä¾ã§ã¯learning_rate
ã¯ããã«ååã®0.0001
ã¨ãã¦ã㦠å®é大ããããã¨æåã®æ®µéã§å¤±æãã¦ãã¾ããã¨ããã£ãã®ã§0.0001
ã«ãã¦ãããã
ãã¨å¹ããã©ããåãããªããã©ä¸å¿ãã¹ã¦ã®weights
ã« 分類タスク ã§ä½¿ã£ã¦ããWeight Decayãå
¥ãã¦ãããã
Generating Images
ãããã¦å¦ç¿ã®opsãå®ç¾©ã§ããããã¨ã¯ãããå®è¡ãã¦ç¹°ãè¿ãã¦ããã°å°ããã¤ãã©ã³ãã ãªåºåããããé¡ãããç»åãã«ãªã£ã¦ãããã¯ãã
ã§ããã®ææç©ã確ããããã®ã§ãã£ã±ãç»åãã¡ã¤ã«ã¨ãã¦æ¸ãåºãããããã§ãGeneratorããã®åºåãåå¾ãã¦å¤æããã¦ãscipy
ãpylab
ãªã©ã使ã£ã¦ç»åã¨ãã¦åºåã§ããã¿ããã ãã©ããã®ããããå®ã¯TensorFlowã ãã§åºæ¥ããã§ããã
Generatorããã®åºåã¯[batch size, height, width, channel]
ã®ã -1.0〜1.0 ã®å¤ãã¨ãTensorãªã®ã§ãã¾ãã¯ãããããã¹ã¦ 0〜255 ã®æ´æ°å¤ã«å¤æããã
ã§ããããbatch sizeã«splitãã¦ããã¨ããããã[height, width, channel]
ãªç»åãã¼ã¿ã«ãªãããã§ããããã¯tf.image.encode_png
ã¨ãã«ãããã°PNGã®ãã¤ããªãå¾ãããã
ãã£ãããªã®ã§è¤æ°åºåãããç»åãã¿ã¤ã«ç¶ã«ä¸¦ã¹ã¦1ã¤ã®ç»åã¨ãã¦åºåããããããããã£ã¦æã£ããtf.concat
ã§ç¸¦ã«ç¹ããã横ã«ç¹ããããäºåã«å
¥ãã¦ãããã¨ã§ãããå®ç¾ã§ããã
def generate_images(self, row=8, col=8): images = tf.cast(tf.mul(tf.add(self.g(), 1.0), 127.5), tf.uint8) images = [tf.squeeze(image, [0]) for image in tf.split(0, self.batch_size, images)] rows = [] for i in range(row): rows.append(tf.concat(1, images[col * i + 0:col * i + col])) image = tf.concat(0, rows) return tf.image.encode_png(image)
ããã§ãå¾ãããopsãevalãã¦å¾ããã¤ããªããã¡ã¤ã«ã«æ¸ãåºãã ãã§1ã¤ã®batchã§çæãããè¤æ°ã®ç»ååºåã並ã¹ããã®ãä¸çºã§å¾ããã¨ãã§ããã便å©〜ã
è¨ç®éãæ¸ãã(ï¼)
ä»åã¯64x64
ã§ãªã96x96
ã®ç»åãçæããããã¨ãã¦ãã¦(å¦ç¿ãã¼ã¿ã112x112
ã§åéãã¦ããã æè§ãªããããªãã«å¤§ããä½ãããï¼)ãå
ã®è«æã§ã¯å層ã®channelæ°ã 1024, 512, 256, 128 ã«ãªã£ã¦ãã¦(Qiitaã®è¨äºã§ã¯ãã¹ã¦ååã«ãã¦ãã)ããã®ãã©ã¡ã¼ã¿æ°ã§æå
ã®CPUãã·ã³ã§è¨ç®ããã(åã¯ã±ããªã®ã§GPUãã·ã³ã¨ãæã£ã¦ãªãâ¦)ã¨ã 1step ã« 50sec ã¨ãã¨ãã§ããªãæéãããã£ã¦ãã¾ã ã¡ãã£ã¨çµ¶æçã ãâ¦ã¨æã å°ãã§ãè¨ç®éãæ¸ããã 250, 150, 90, 54 ã¨ããæ°åã«å¤ãã(50sec -> 18sec)ãããã¦batch sizeã 128 ãããååã® 64 ã ã¨æµç³ã«ç¡çããã ã£ãã®ã§ 96 ã«(18sec -> 13sec)ãä¸å¿ãã®ãã©ã¡ã¼ã¿æ°ã§200stepã»ã©åãã¦ã¿ãã¨ãã ã¡ããã¨ã©ã³ãã åºåããé¡ã£ã½ããã®ã«å¤ãã£ã¦ãã£ã¦ããã®ã観測ã§ããã®ã§ ããã§ãã£ã¦ã¿ãã
å°ããã¤é¡ã£ã½ããã®ãç¾ãã¦ãã¦ããããããåæ§ããé¡ã« é®®æã«åãããã«ãªã£ã¦ããå¤åãã¿ã¦ã¨ãããã¨ã
ãããã¦ä¸¸2æ¥ä»¥ä¸ããã¦ã7000stepãããåããçµæ å¾ãã®ãåé ã®ç»åã«ãªãã¾ããã¾ã ã¡ããã¨ããé¡ã«ãªããªãã£ããããã®ã¯ãåã«å¦ç¿åæ°ã足ãã¦ããªãã®ã ãã©ã¡ã¼ã¿ã足ããªããã¦ãã以ä¸ãã¬ã¤ã«ãªããªãã®ããã¯ããã¡ãã£ã¨ç¶ãã¦ã¿ãªãã¨åãããªããã© å¤åã¾ã åæ°ã足ãã¦ããªãã ããªããããªãããªâ¦ ããã¡ãã£ã¨ç¶ãã¦ã¿ã¾ãã
ä»åã¯ãé¡ãã£ã¦ããã¨ã¦ãéå®çãªé åã§ã®çæã ãããããããã§å¤§ä¸å¤«ã ããã㨠ããªãåã§ãã©ã¡ã¼ã¿æ°ã決ãã¦ãã¾ã£ã¦ããã®ã§ æ¬å½ã¯ãã£ã¨çè«çã«é©åãªæ°ãå°ãåºãããã¨ããã ãã©â¦ã
ååã¾ã§ã®åé¡å¨ã ã¨sparsityã¨ããã®ãè¨æ¸¬ãã¦ããã®ã§ãããå
ã«åããã ãããªãã¨æã£ã¦ããã®ã ãã©ãä»åã®å ´åãã¹ã¦ã«Batch Normalizationãå
¥ã£ã¦ããã®ã§ãããæå³ãªãã¦ããªãã¨ãé£ããæ°ããããããããGPUã§ä½åº¦ãã¶ãåãã¦æ¢ã£ã¦ãããããªãã®ããªãã
ä»»æã®ç»åã®çæâ¦
DCGANã«ããçæãã§ããã¨ãä»åº¦ã¯å ¥åã®ä¹±æ°ãã¯ãã«ãæä½ãããã¨ã§ä»»æã®ç¹å¾´ããã¤ç»åãããç¨åº¦çã£ã¦çæã§ããããã«ãªããã¨ã®ãã¨ãªã®ã§ããã試ãã¦ã¿ããã¨æã£ããã© ã¾ã åºæ¥ã¦ããªãã®ã¨ é·ããªã£ã¦ãã¾ã£ãã®ã§ç¶ãã¯æ¬¡åã