2018年風TensorFlowã§ã®å¦ç¿å¦çã®è¨è¿°æ¹æ³
TensorFlowãç»å ´ãã¦æ©ããã¨ã§3å¹´è¿ãçµã¨ãã¨ãã¦ãã¾ãã Deep Learningèªä½ããã¼ã ã«ãªã£ã¦ããã ã¨ããã以ä¸ã®ææ¥ãçµã£ã¦ããããã§ã人工ç¥è½ãã¼ã ã以å¤ã¨ç¶ãã¦ãããªãã¨ããã®ãæ£ç´ãªææ³ã§ãã
Theanoãtorchãchainerã«é ããã¨ã£ã¦ç«ã¡ä¸ãã£ãTensorFlowã§ããããã¯ããã®ãã¡ã¯ãã¥ã¼ããªã¢ã«ã³ã¼ãã§ãããã®ãããªãããã¾ã§ãã¨ã¦ãã§ã¯ããã¾ãããç°¡åã«èª°ãã使ããã¨ãããããªç¶æ ã§ã¯ããã¾ããã§ããã 1å¹´ã»ã©åãããããããKeras ã®åãè¾¼ã¿ã Dataset API ã®å®è£ ãMonitoredTrainingSession ã®ãããªãªãã㪠Session ãªãã¸ã§ã¯ãã®å°å ¥ãªã©ã§ãå°ãåã£ããã¨ãããå ´åã§ãããªãç°¡åã«æ¸ããããã«ãªã£ã¦ãã¾ããã
ä¸æ¹ã§å ¬å¼ã®ãã¥ã¼ããªã¢ã«ã§ã¯ããã¼ã¿ã»ããã®èªã¿è¾¼ã¿ã¯ãããã®ã®APIã使ç¨ããã®ãåºæ¬ã§ãã¢ãã«ã®æ§ç¯ãå¦ç¿å¦çãKerasã®APIã®ã¿ã Eager Execution ã ãã§è§£æ±ºã§ãããããªã·ã³ãã«ãªå®è£ ãå¤ããå®è·µçã«ã¯ã©ãæ¸ãã¨ãããæã«æãå±ãããããªãã®ããã¤ãã¤ãæ´ã¿ã¥ããã¨ãããããã¾ãã
ã©ã®ãããªæ¹æ³ãç¾ç¶ã§ã®ãã¹ããã©ã¯ãã£ã¹ãªã®ããããã«ããç¶æ³ã§ãããèªåç¨ã®ã¡ã¢ãå ¼ãã¦ãä»åã¯èªåãã©ã®ãããªèãã§ãã©ã®ããã« TensorFlow ã®å¦ç¿å¦çãè¨è¿°ãã¦ããããæãã¦ã¿ããã¨ã«ãã¾ãã
å¦ç¿å¦çã®å®è£ æ¹é
ä»åã®ã½ã¼ã¹ã³ã¼ãã¯ä»¥ä¸ã«ã¢ãããã¦ãã¾ãã
TensorFlow ã§ã®å¦ç¿å¦çã大ã¾ãã«åããã¨ããã¼ã¿ã®èªã¿è¾¼ã¿ãã¢ãã«ã¨å¦ç¿å¦çã®å®ç¾©ãå¦ç¿ç°å¢ã®å®ç¾©ããã³å¦ç¿ã®å®è¡ã®3ã¤ã«åãããã¨ãã§ãã¾ãã
ä¸ã¤ãã¤ã©ã®ãããªè¦ä»¶ãããã°è¯ãããããèãã¦ã¿ã¾ãã
ã¾ããããã¼ã¿ã®èªã¿è¾¼ã¿ãã§å¿ è¦ã«ãªãã®ã¯ãæ§ã ãªå½¢å¼ã§ä¿åããã¦ãããã¼ã¿ã»ããããé©åãªå½¢ã«åå¦çããªãããããåä½ã§èªã¿åºãã¨ããã®ãããããã®è¦ä»¶ã«ãªããã¨æãã¾ãã
ãã¼ã¿ã»ããã®èªã¿è¾¼ã¿ãåå¦çèªä½ã¯ãããããã tfrecord å½¢å¼ã«å¤æ´ããéã«å®è¡ãããããã¡ã¤ã«ãDBã¸ã®æ¸ãè¾¼ã¿å 容ãã®ãã®ãäºåã«å¦çããæ¹æ³ãããã¾ãããä»åã¯ãã®ãããªå¦çãã¾ã¨ãã¦å¦ç¿æã«å®è¡ããå ´åãæ³å®ãã¾ãã
ãã®æã«æ´»èºããã®ã tf.data.DataSet APIã§ããæ§ã ãªå½¢å¼ããã®èªã¿è¾¼ã¿ãã¹ããªã¼ã å¦çã«ããåå¦çãããããµã¤ãºã®æå®ããã¼ã¿ã»ããã®ç¹°ãè¿ããªã©ããã¼ã¿ã®èªã¿è¾¼ã¿æã«çºçããæ§ã ãªå¦çãã·ã¼ã ã¬ã¹ã«å®è¡ããäºãã§ãã¾ãã
次ã«ããã¢ãã«ã¨å¦ç¿å¦çã®å®ç¾©ãã§ã¯ãã¢ãã«ã°ã©ãã®å®ç¾©ããã³ããã¹ã¨å¦ç¿å¦çã®å®ç¾©ãè¡ãã¾ãã
ã¢ãã«ã°ã©ãã®å®ç¾©ã¯ãCNNãRNNãªã©å®éã«çµããã¨ã«ãªãã¾ããåºæ¬çã«ã¯ Keras ã® Layers API ã使ç¨ãããã¨ã§ã»ã¼ã»ã¼å¯¾å¿ã§ãã¾ãããå¿ è¦ã«å¿ã㦠tf.Variable ã tf.nn API ãå©ç¨ãã¦èªèº«ã§ã¹ã¯ã©ããã§è¨ç®ã°ã©ããçµãã§ããå¿ è¦ãããã¾ãã
ãã¹ã¨å¦ç¿å¦çã®å®ç¾©ã¯ããã¹ã®è¨ç®ã®å®ç¾©ã¨ tf.train.Optimizer ãå©ç¨ããå¾é å¦ç¿ã®å®ç¾©ãè¡ããå¿ è¦ãããã¾ãã ãã®ãããã¯ããã¥ã¼ã©ã«ãããç³»ã®ãã¬ã¼ã ã¯ã¼ã¯ã§ã¯ã¯ãªãã£ã«ã«ãªé¨åã§ãããã®ã§ãç°¡åã«å®è£ ã§ããããã«ãªã£ã¦ãããå¤ãã£ãã¬ã¤ã¤ã¼å®ç¾©ã§ãããªãéãããã¾ã§é£ããé¨åã§ã¯ãªããªã£ã¦ãã¾ãã
æå¾ã«ããå¦ç¿ç°å¢ã®å®ç¾©ããã³å®è¡ãã§ããããã¡ãã以ä¸ã«ã·ã³ãã«ã«ä½¿ãã¾ãããããæ¸ãã¦ãããããå¦ç¿å¦çãã¨ã£ã¤ããããéå§ã§ãããã®éµã«ãªãã®ã§ã¯ãªãã§ãããããå¿ è¦ãªã®ã¯ãå¦ç¿ã®å®è¡ã ãã§ãªããå¦ç¿æã®ãµããªã¼ã®è¨é²ãã¢ãã«ã®å®æçãªä¿åãå®æçãªå¦ç¿ãã°ã®åºåãªã©å¦ç¿å¦çã«ç´ã¥ãç´°ããå®è£ ãå¿ è¦ã«ãªãã¾ãã
ãããã®å®è£ ã«ã¯ãMonitoredTrainingSession 㨠tf.train.SessionRunHook ãæ´»ç¨ãããã¨ã§ããããããå®ç¾ãããã¨ãã§ãã¾ãã
Dataset API ãå©ç¨ãããã¤ãã©ã¤ã³ã®æ§ç¯
ä¸ã§ãããããã«ããã¼ã¿ã®èªã¿è¾¼ã¿ãã¤ãã©ã¤ã³ã«å¿ è¦ãªè¦ç´ ã¯ä»¥ä¸ã®ããã«ãªãã¾ãã
- ãã¡ã¤ã«ãªã©ããã®ãã¼ã¿ã®èªã¿è¾¼ã¿
- ãã¼ã¿ã®åå¦ç
- ãããããã³ãã¼ã¿ã®ç¹°ãè¿ããªã©å¦ç¿ä¸å¿ è¦ãªå¦ç
å ·ä½çã«ã©ã®ããã« TensorFlow ã® Dataset API ã§å®ç¾ããããä¸åãã¤è¦ã¦ã¿ã¾ãããã
ãã¡ã¤ã«ããã®ãã¼ã¿ã®èªã¿è¾¼ã¿
ã¾ãããã¡ã¤ã«ããã®ãã¼ã¿ã®èªã¿è¾¼ã¿ã¯ä¸è¨ã®ããã«ãªãã¾ãã
image_dataset = tf.data.FixedLengthRecordDataset(str(image_path), record_bytes=28*28, header_bytes=16) label_dataset = tf.data.FixedLengthRecordDataset(str(label_path), record_bytes=1, header_bytes=8) dataset = tf.data.Dataset.zip((image_dataset, label_dataset))
ä¸è¨ã¯ãã¼ã«ã«ã«ä¿åãã MNIST ã®ãã¼ã¿ã»ãããèªã¿è¾¼ãã§ããç®æã«ãªãã¾ãã MNISTã®ãã¼ã¿ã¯ã¤ã¡ã¼ã¸ãã¼ã¿ã¨ã©ãã«ãã¼ã¿ããã©ãã©ã®ãã¡ã¤ã«ã§ç®¡çãããããããã«ãã¤ããªå½¢å¼ã§ä¸å®ã®ãã¤ãåä½ã§ãã¼ã¿ãä¿åããã¦ãã¾ãã
ãã®ãããªãã¼ã¿ãèªã¿è¾¼ãéã«å½¹ã«ç«ã¤ã®ã tf.data.FixedLengthRecordDataset ã¯ã©ã¹ã§ãããã®ã¯ã©ã¹ã¯ã¾ãã«ä¸å®ã®ãã¤ãåä½ã§ä¿åããã¦ãããã¼ã¿ãåãåã£ã¦é çªã«èªã¿åºããã¨ãã§ãã¾ãã
ã¾ããMNISTã§ã¯ç»åã¨ã©ãã«ãå¥ã ã®ãã¡ã¤ã«ã«åããã¦ããããå®éã®å¦çãè¡ãåã«çµåãã¦ããå¿ è¦ãããã¾ããtf.data.Dataset.zip ã¡ã½ããã¯ãpython ã®çµã¿è¾¼ã¿é¢æ°ã§ãã zip ã®ããã«ãè¤æ°ã®ãã¼ã¿ã»ããã®åºåãã¿ãã«å½¢å¼ã§ã¾ã¨ãã¦åºåã§ãã Dataset ãªãã¸ã§ã¯ããè¿ãã¦ããã¾ãã
ãã¼ã¿ã®åå¦ç
ãã¼ã¿ã®åå¦çã§å¿ è¦ãªãã®ã¯ã主ã«ãã£ã«ã¿ãªã³ã°ã¨å¦ç¿ã§ä½¿ç¨ããå½¢å¼ã¸ã®å¤æï¼Data Augmentation å«ãï¼ã§ãã 以ä¸ã¯ãDataset ã® filter ã¡ã½ããããã³ map ã¡ã½ãããå©ç¨ãã¦ããããå®ç¾ãã¦ããä¾ã§ãã å¼ã³åºãèªä½ã¯ãããããå®éã®å¦çãè¡ãé¢æ°ã渡ãã ãã§å®ç¾ã§ãã¾ãã
dataset = (dataset .filter(converter.filter) .map(converter.convert, num_parallel_calls=threads))
å®éã®å¦çã¯ãä¸è¨ã®ããã« Dataset ã®åºåãå¼æ°ã«åãã¦ãfilter ã®å ´å bool å¤ããmap ã®å ´åã¯å¤æãããã¼ã¿ãåºåããå¿ è¦ãããã¾ãã Dataset ã®åºåã¯ãä»åã®å ´å㯠zip ã§2ã¤ã® Dataset ãã¾ã¨ãã¦ãã¾ãã®ã§ãå¦çãè¡ãé¢æ°ã®å¼æ°ã¯2ã¤ã«ãªã£ã¦ãã¾ãã ã¾ããtf.data.FixedLengthRecordDataset ã§èªã¿è¾¼ãã§ããããããããã®ãã¼ã¿ã¯ãã¤ããªå½¢å¼ã«ãªã£ã¦ããã tf.decode_raw ã¡ã½ããã§äºåã«å¤æãã¦ãã¾ãã
åå¦çã®å®éã®å¦çã¯ã tf.py_func ã¡ã½ããã§ç python ã®é¢æ°ãå¼ã³åºãããã«ãã¦ãã¾ããä»åã®å®è£ ã§ã¯ãå¿ è¦ãªå¦çã§ã¯ãªãã§ããããã®ããã«ãã¦ããã¨å¦çããããã§ãæè»ã«çµã¿æ¿ãããã¨ãå¯è½ã«ãªãã¾ãï¼ãã ãCPUãã¯ã¼ãå¿ è¦ã«ãªã£ã¦ãã¾ããï¼ã
tf.py_func ã¡ã½ããã¯ãå¦çãããé¢æ°ãTensorFlow ãªãã¸ã§ã¯ãã¨åºåããåãæå®ãã¦ãå¦çãè¡ã£ãé¢æ°ã®åºåãæ»ãå¤ã¨ãã¦åãåãã¾ãã æ»ãå¤ã¯ shape ãæå®ããã¦ããªãã®ã§ããã¨ãã¨ã®å¦çã®ããã« set_shape ã§è¨å®ãã¦ããå¿ è¦ãããã¾ãã ã¾ããtf.py_func å ã®å¦çã®çµã¿æ¹ã«ãã£ã¦ã¯ãå ¥åãã¼ã¿ãè¤æ°ã«åå²ãã¦åºåãããããªå¦çãå®ç¾ãããã¨ãã§ãã¾ãã
def _filter(self, images, labels): return True def filter(self, images, labels): predicts = tf.py_func( self._filter, [images, labels], [tf.bool])[0] return predicts def _convert(self, images, labels): images = images.reshape((28, 28, 1)) images = images.astype(np.float32) labels = labels.astype(np.uint8) labels = labels.reshape((1, )) return images, labels def convert(self, images, labels): images = tf.decode_raw(images, tf.uint8) labels = tf.decode_raw(labels, tf.uint8) images, labels = tf.py_func( self._convert, [images, labels], [tf.float32, tf.uint8]) images.set_shape((28, 28, 1)) labels.set_shape((1, )) return images, labels
ãããããã³ãã¼ã¿ã®ç¹°ãè¿ã
ãããåããã³ãã¼ã¿ã®ç¹°ãè¿ãã¯ã shuffleãrepeatãbatch(padded_batch)ã®3ã¤ã®ã¡ã½ããã§å®ç¾ãã¾ãã
shuffle ã¡ã½ããã¯ãæåéãæå®ãããã¡ã¤ã«ããé çªã«èªã¿åºãããã¼ã¿ã buffer_size åã¡ã¢ãªã«è²¯ãã¦ããã®ä¸ã§ã©ã³ãã ã« batch_size åã®ãã¼ã¿ãè¿ããããªæåã«ãªãã¾ãã
ä¸è¿°ã®ããã«ãã®ã¡ã½ããã¯ãã¡ã¢ãªã«ãã¼ã¿ããã¼ããããã¨ã«ãªãã®ã§ãï¼GPUã§å¦ç¿ãã¦ããã°GPUã®ï¼ã¡ã¢ãªãå¿ è¦ã«ãªãã¾ãã buffer_size ã®å¤ã大ãããã°å¤§ããã»ã©ãåºæ¬çã«ã¯ã©ã³ãã ã®è³ªã¯ãããªãã¾ãï¼ãã¡ã¤ã«ã®åã®æ¹ã®ãã¼ã¿ã¨å¾ãã®æ¹ã®ãã¼ã¿ãæ··ããããããªãã¾ãï¼ããã¹ã®å¤ãªã©ã® metric ããããæ¯ã«åã£ã¦ãã¾ã£ã¦ãããªãã°ãbuffer_size ã®å¤ãå¢ãããã¨ãæ¤è¨ãã¦ã¿ãã¹ãã§ãã
repeat ã¡ã½ããã¯ããããããã®ã¾ã¾ã§ãã¼ã¿ãç¹°ãè¿ãèªã¿åºãã¦ããã¾ããå¼æ°ã«åæ°ãæå®ããå ´åãã®åæ°åãä½ãæå®ããªãå ´åã¨ã³ãã¬ã¹ã§ãã¼ã¿ãèªã¿åºãç¶ãã¦ããã¾ãã
batch ã¡ã½ããã¯ãæå®ãã batch_size åã®å¤ãåã¹ãããã§èªã¿åºãã¦ããã¾ããpadded_batch ã¡ã½ããã¯ããããåä½ã§ãã¼ã¿ã®ä¸æããæ´å½¢ãã¦ããã¾ããpadding ããå¤ãå¼æ°ã§æå®ãããã¨ãã§ãã¾ãã
if is_training: dataset = dataset.shuffle(buffer_size=buffer_size).repeat() dataset = dataset.padded_batch(batch_size, dataset.output_shapes)
ã¢ãã«ã¨å¦ç¿å¦çã®å®ç¾©
ã¢ãã«ã¨å¦ç¿å¦çã®å®ç¾©ã¯ãKeras ã® Layers API ããããã®ã® Optimizer ããã³ãã¹ã®å®ç¾©ç¨ã«ã tf.nn API ãä¸é¨ã®æ°å¤è¨ç®ç¨ã®ã¡ã½ããã使ç¨ãããã¨ã§ã»ã¼åé¡ãªãå®è£ ãããã¨ãã§ãã¾ãã
èªåã®ã¢ãã«ã¯ã©ã¹ã®å®è£ ã¯ãKeras ã® Layers ã«æºãã¦åºæ¬çã« build 㨠call ã§æ§æããããããããã©ã¡ã¼ã¿ã¼ãã¬ã¤ã¤ã¼ã®å®ç¾©ã¨è¨ç®ã°ã©ãã®æ§ç¯ãæ å½ãã¾ããå¥éã¢ãã«ã«é¢é£ãã¦ããã¡ã½ããã¨ãã¦ãloss è¨ç®ç¨ã®ã¡ã½ããã¨å¦ç¿å¦çï¼æé©åå¦çï¼ãæ§ç¯ããã¡ã½ãããäºæ¸¬ãå®è¡ããã¡ã½ãããã¤ã³ã¹ã¿ã³ã¹ã«å«ãã¦ãã¾ãã
def call(self, inputs, is_train=True): outputs = tf.reshape(inputs, (-1, 28*28)) / 255.0 outputs = self.dense1(outputs) if is_train: outputs = tf.nn.dropout(outputs, 0.2) outputs = self.dense2(outputs) return outputs def loss(self, logits, labels): labels = tf.reshape(tf.cast(labels, tf.int32), (-1, )) loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=labels) loss = tf.reduce_mean(loss) return loss def optimize(self, loss, clipped_value=1.0): grads = self.optimizer.compute_gradients(loss, self.variables) clipped_grads = [(tf.clip_by_value(g, -clipped_value, clipped_value), v) for g, v in grads] train_op = self.optimizer.apply_gradients(clipped_grads) return train_op def predict(self, logits): _, indices = tf.nn.top_k(logits, 1, sorted=False) return indices
callã¡ã½ããã§ã©ãã¾ã§æ å½ãããããã¤å¤ãè¿ãããlossãoptimizeãpredictã¡ã½ããã®å¼æ°ã«ä½ãåããã¯ã¢ãã«ã«ãã£ã¦å¤ãã£ã¦ãã¾ãæ§æãã¨ã£ã¦ãã¾ããã大ã¾ããªé¢æ°ã®å¼ã³åºãé ã¯ãã©ã®ãããªã¢ãã«ãæ§ç¯ããéãããããã¼ã¹ã«è¡ããã¨ãã§ãã¾ãã ä¾ãã°ãGANã®å®è£ ã§ã¯ãcall ã¡ã½ãã㧠descriminator ã® logits å ç»ååã³çæç»åã«å¯¾ãã¦è¨ç®ãã¦è¿ããloss 㧠generator ããã³ descriminator ã®ãã¹ãè¨ç®ãoptimize ã§ããããã®å¾é è¨ç®ã tf.control_dependencies ã tf.group ãªã©ã§é¢é£ä»ãã¦è¿ãã°è¯ãã¨ããå®è£ ã«ãªãã¾ãã
ããã§ä¸»ã«æ³¨æããç¹ã¯ããã¹ã®è¨ç®å¨ãã¨æé©åè¨ç®å¦çã§ãã
ãã¹ã®è¨ç®ã§ã¯ã cross_entropy ã®è¨ç®ãªã©ã§ log ã«æ¸¡ãå¤ãå²ãå¤ã 0 ã«ãªããåºåã¨ã㦠-inf ã NaN ãè¿ãå¯è½æ§ãååã«ããã¾ããkeras ã® categorical_cross_entropy ã®å®è£ ãªã©ã§ã¯ãlog ã®è¨ç®ã§ -inf ãè¿ããªãããã«å é¨çã«å¾®å°ãªå¤ï¼epsilonå¤ï¼ã使ã£ã¦èª¿æ´ãã¦ããã¦ãã¾ãããçã®TensorFlow ã¯ããã¾ã§è¦ªåã§ã¯ãªãã®ã§ããã®è¾ºããäºé²ããããã«å¿ è¦ãããã°ãã¹é¢æ°ãèªåå®è£ ããå¿ è¦æ§ãããã¾ãã
ã¾ããæé©åå¦çããkeras ã® Oprimizer ã®ããã«å¾é ççºãé²ãããã«å¾é ã clipping ããã®ãä¸è¬çã§ãï¼å¦ç¿çã®èª¿æ´ããã¼ã¿ã®åå¦çã§ã©ãã«ãã§ããå ´åã¯ããã§ãåé¡ãªãã§ãï¼ã clipping ã ãã§ã¯å¾é æ¶å¤±ã«å¯¾å¿ã§ãã¾ãããããã¨ç»åèªèã«ããã¦ã¯ Residual Block ãªã©ã®ãã¯ããã¯ã§å¤§å¹ ã«ãã®ãªã¹ã¯ãæ¸ãããã¨ãã§ãã¾ãã
å¦ç¿ç°å¢ã®å®ç¾©åã³å®è¡
å¦ç¿ã®å®è¡å¦çã§å¿ è¦ã«ãªãå¦çã¯ç´°ãããæ§ã ã§ãããªãã¨ãªãã«å¿ è¦ãªãã®ãæ´ãåºãã¨ããã å¦ç¿ãããããã ããªã®ã«è²ã ã¨å¿ è¦ã«ãªã£ã¦ãã¾ãã
- ãã¼ã¿ã®åå¾
- ã¢ãã«ã®å®ç¾©
- ãµããªã¼ã®ä¿å
- ã¢ãã«ã®ä¿å
- å¦ç¿ã®ç£è¦
- å¦ç¿å¦çã®å®è¡
ãã®ãã¡ä¸ã®2ã¤ã¯ãä¸è¨ã®2é ç®ã§å®è£ ããé¢æ°ãå¼ã³åºãã ãã§å®è¡ã§ããããã«ãã¦ãããã¨ããã¹ãã§ãããããªã£ã¦ããªãå ´åã¯ã該å½é¨åã®ã¯ã©ã¹æ§é ãé¢æ°å®ç¾©ãè¦ç´ãã¦ã¿ãã»ããè¯ãã§ãããã
ãµããªã¼ã®ä¿åã¯ãsession ã¨ã㦠MonitoredTrainingSession ã使ç¨ãã¦ããã°ãtf.summary ã®å API ã使ç¨ãã¦ç£è¦ããããªãã¸ã§ã¯ããè¨å®ãã¦ããã ãã§åæã« summary_dir ã«æå®ãããã£ã¬ã¯ããªã«ãµããªã¼ãä¿åãã¦ããã¾ãã ä¿åããééã save_summaries_steps ããã㯠save_summaries_secs ã§æå®ãããã¨ãå¯è½ã§ãã
ã¢ãã«ã®ä¿åã¯ãtf.train.Scaffold 㧠tf.train.Saver ãã©ãããããã¨ã«ãããåãã MonitoredTrainingSession ã«æ¸¡ããã¨ã§å®ç¾ã§ããããã«ãªãã¾ãã tf.train.Saver ã®åæåãã©ã¡ã¼ã¿ã¼ã§ãæ大ããã¤ã®ãã§ãã¯ãã¤ã³ããæ®ãã(max_to_keep)ã¨ãä½æéã«ä¸åã®ãã§ãã¯ãã¤ã³ããæ®ãã(keep_checkpoint_every_n_hours)ãæå®ã§ãã¾ãã ã¾ããMonitoredTrainingSession ã®ãã©ã¡ã¼ã¿ã¼ã¨ãã¦ãsave_checkpoint_secs ããã㯠save_checkpoint_steps ã§ãã§ãã¯ãã¤ã³ããä¿åããééããcheckpoint_dir ã§ãã§ãã¯ãã¤ã³ããä¿åãããã£ã¬ã¯ããªãæå®ãããã¨ãã§ãã¾ãã
scaffold = tf.train.Scaffold( saver=tf.train.Saver( max_to_keep=checkpoints_to_keep, keep_checkpoint_every_n_hours=keep_checkpoint_every_n_hours))
å¦ç¿ã®ç£è¦ã¯ãtf.train.SessionRunHook ã®æ´¾çãªãã¸ã§ã¯ãã®ãªã¹ãããMonitoredTrainingSession ã«ããããã¨ã«ããå®ç¾ã§ãã¾ãã å®æçã«æå®ãããªãã¸ã§ã¯ãã®å¤ããã°ã¨ãã¦åºåãã¦ããã tf.train.LoggingTensorHookã æå®ãããªãã¸ã§ã¯ãã®å¤ã NaN ã«ãªã£ãéã«ã¨ã©ã¼ãçºçããã¦ããã tf.train.NanTensorHookã global_step ãæå®ã®å¤ä»¥ä¸ã«ãªã£ãæã«ã session.shoud_stop ã¡ã½ããã True ã«ãã¦ããã tf.train.StopAtStepHookã ãªã©ããã¾ãã¾ãª Hook ãç¨æããã¦ãã¾ããHook èªä½ã¯èªä½ãããã¾ã§é£ããããã¾ããã®ã§ãå¿ è¦ã«å¿ãã¦ä½ããã¨ãå¯è½ã§ãã
hooks.append(tf.train.LoggingTensorHook(metrics, every_n_iter=100)) hooks.append(tf.train.NanTensorHook(loss)) if max_steps: hooks.append(tf.train.StopAtStepHook(last_step=max_steps)
ããã¾ã§ããã°å¦ç¿ã®å®è¡ã¯é常ã«ç°¡åã§ãä¸è¨ã®ããã«ã²ããã session.run ãå®è¡ããã ãã§ãã¿ã¾ãã
with session: while not session.should_stop(): session.run([train_op])
ä»ã«ããtf.ConfigProto 㧠GPU ã®å®è¡è¨å®ãè¡ã£ãããtf.train.ClusterSpec ããã³ tf.train.Server ã使ç¨ããè¤æ°ãµã¼ãã¼ã§ã®åæ£å¦ç¿ãè¨å®ãããã¨ãã§ãã¾ãã
çµããã«
è¿å¹´ã® TensorFlow ã¯ããã¬ã¼ã ã¯ã¼ã¯ã«ãããªãã«è¶³ãçªã£è¾¼ãã°ãå¦ç¿æã«ãããããã¨ã¯ä¸éãã§ããããã«ãªã£ã¦ãã¦ãã¾ããããã§ãå¦ç¿ã³ã¹ãã¯ååã«ããã®ã§ããã以åã®æéãããã¦ç解ãã¦ãçµå±ããããããªãã¨ããç¶æ ã«æ¯ã¹ãã°å¤©ã¨å°ã»ã©ã®å·®ãããã®ã¯è¦ã¦ã®ã¨ããã§ãã
TensorFlow 2.0 ã§ã¯ãã®è¾ºããæ´çããã¦ãããããããããã使ãããããªããã¨ãæå¾ ãã¾ãã
åè
- ãTensorflowãTFRecordãã¡ã¤ã«ã§shuffle_batchããã¨ãã®åã調æ»
- è¤éãªåå¦çãç°¡åã«ï¼TensorFlowã®Dataset APIã®ä½¿ãæ¹
- Neural Networkã§ã®å¤±æçµé¨ãã¢ã³ããã¿ã¼ã³ãèªã
- ãã£ã¼ãã©ã¼ãã³ã° ResNet ã®ããã
- ãã¥ã¼ã©ã«ãããã¯ã¼ã¯ãè¨ç·´ããã®ã¯ãªãé£ããã®ã
- Distributed TensorFlow