return - みる会図書館


検索対象: TensorFlowはじめました 2
20件見つかりました。

1. TensorFlowはじめました 2

biases_vatue=@ . 0, biases—shape=[32] , strides=[l, 1 , 1 padding='VALID') tf. nn . reIu(conv2) conv2 conv2d( 'conv3' input_Iayer=conv2, weights—shape= [ 5 , 5 , 32 , CHANNELS] , weight—stddev=1e—3, biases—shape=[CHANNELS] , biases vatue=@. @, st ri des= [ 1 , 1 , 1 , 1 ] , padding='VALID') tf. nn . retu(conv3) conv3 conv3 return conv3 共通する処理は、 modet ー base. py にまとめています ( リスト 2.2 ) 。 リスト 2.2 : srcnn/model/model_base. py # coding: UTF-8 from future from future_ from future import absotute_import import division import print_function import tensorflow as tf def variable_on_cpu(name, shape, initializer, trainabIe=True) : wi th tf. devi ce ( ' / cpu : @ ' ) : tf. get_variable(name, shape, initializer=initiatizer, var trainable=trainabte) return var def _get—weights(shape, stddev=l. の : variabte—on—cpu( var shape, 'weights' tf. truncated—normal_initiatizer(stddev=stddev) ) return var def —get—biases(shape, value=@. の : 24 第 2 章 CNN で超解像

2. TensorFlowはじめました 2

result [@ for i in range(h_num)] for j in range(v_num) for row in range(v_num) : for C01 in range(h_num) : block sess. run(logits, feed_dict={ image—ptacehotder: blocks[row] [ C01 ] result[row] [ C01 ] btock[@] return result プロックの再構成 リスト 2.11 の関数 __reconstruct は、 変換可能な形にします。 リスト 2.1 1 : s ℃ nn/eval.py def —reconstruct(blocks) : ー process で処理したプロックを連結して、画像に V num h num resutt ten(blocks) ten(btocks[@]) None for row in range(v_num) : horizontal None for C01 in range(h_num) : if horizontal is None: np . hstack((horizontal, horizontat etse: blocks[row] [ C01 ] horizontal btocks[row] [col] ) ) if resutt is None: horizontal result etse: resutt np . vstack((result, return result horizontat) ) 36 第 2 章 CNN で超解像

3. TensorFlowはじめました 2

return result—file, padded-file 畳み込み層を通るときに失われるピクセル分、出力サイズは小さくなります。出力プロック が小さくなる分、画像の左端と上端のピクセルが失われます。 関数 --calc-padding を変更して、付加するパディングを 1 プロック ( スライド幅 ) 分加算 します ( リスト 3.7 ) 。 さらにリスト 3.6 の関数ーー srcnn を、パディングを取り除く前に、パディングの量を再計算 するように変更します。 リスト 3.7 : srcnn/eval.py catc—padding(image, stride) : def strideCINDEX_VERTICAL] \ padding—vertical image . height % stride[INDEX—VERTICAL] stride[INDEX_HORIZONTAL] \ image. width % stride[INDEX_HORIZONTAL] padding—horizontal # パディングを追加 padding—vertical + = stride[lNDEX—VERTICAL] padding—horizontat + = stride[INDEX—HORIZONTAL] padding padding[INDEX padding[INDEX paddingC 工 NDEX PADDING_LEFT] PADDING_TOP] padding—horizontal / / 2 padding—vertical / / 2 PADDING_RIGHT] padding[INDEX_PADDING_BOTTOM] return padding padding—horizontat \ padding[INDEX_PADDING_LEFT] padding—vertical \ padding[INDEX_PADD 工 NG—TOP] 図 3.11 は、表 32 の条件で学習した場合の誤差の変化です。 表 3.2 : 学習条件 条件 画像の倍率 (scale) 学習率 (learning-rate ) ニバッチサイズ (batch_size) ステップ数 (max_step) チャンネル数 (CHANNELS) 値 2x 0. 開 1 128 1 開Ⅱ ) 1 ( グレースケール ) 52 第 3 章超解像奮闘記

4. TensorFlowはじめました 2

リスト 2.8 : srcnn/eval.py def —pad(image, pad) : if pad [INDEX_PADDING_LEFT] and pad [INDEX_PADDING_TOP] return image w n ew h image . width image . height S 1 w + pad [INDEX_PADDING_LEFT] + pad [INDEX—PADDING_R 工 GHT] , + pad [INDEX_PADDING_TOP] + pad [ 工 NDEX_PADDING_BOTTOM] (pad[INDEX_PADDING_LEFT] , pad[INDEX_PADDING_TOP] ) new—size, color=@xffffff) —image. paste(image, 1 mage lmage . new('RGB' プロックに分割 return new_image 2 次元配列に格納する際、 NumPy の Array 形式に変換します。また、 255 で除算すること サイズとスライド幅は同じ値になります。 stride は、プロックのスライド幅です。プロック同士が重複なく処理する場合、プロック 納します。 リスト 2.9 の関数 __extract_blocks は、画像をプロック 3 に分割したあと 2 次元配列に格 V num image . height / / stride[INDEX—VERTICAL] def extract_blocks(image, stride) : リスト 2.9 : srcnn/eval.py で、ピクセルの値域を @ー 255 から @ . @-I. @ に整えます。 [@ for i in range(h—num)] for j in range(v—num) btocks # blocks [v—num] [h—num] h—num = image . width / / stride[INDEX—HOR 工 ZONTAL] shape (MODEL. INPUT_SIZE, MODEL. INPUT_SIZE, 34 第 2 章 CNN で超解像

5. TensorFlowはじめました 2

var variable_on_cpu('biases' shape, tf. constant_initializer(value)) return var def conv2d(name, input_layer, weights—shape, weight—stddev, biases_shape, biases value, strides=(), 1 , 1 , 1 ) , padding='VALID'): with tf. variabte_scope(name) as scope: —get—weights(weights—shape, stddev=weight—stddev) weights conv = tf. nn. conv2d(input_Iayer, weights, strides, padding=padding) if biases_shape is not None: —get—biases(biases—shape, value=biases—value) biases CO n V tf. nn . bias_add(conv, biases) 図 2.3 ConvolutionaI NeuraI Network return conv 33X33X1 ( 0 nv 1 9X9X64 ReLU conv2 1XIX32 ReLU conv3 5X5X1 21X21X1 ReLU 図 2.3 は、モデルを図示したものです。 うにするには、モデルに低解像度の画像を入力すると、高解像度の画像を出力するように「学 モデルを定義しただけでは、期待するとおりの機能 ( 超解像 ) は果たしません。目的に適うよ 学習 のものでも超解像を実現できます。 は、深層化の傾向を深めている昨今から見れば小さいモデルですが、正しく使えば、この規模 3 層の畳み込み層 (ConvolutionaI Layer) で構成される CNN (ConvoIutionaI NeuraI Network) いるモデルです。 これは論文「 lmage Super-Resolution Using Deep Convolutional Networksl 」で紹介されて 習」させる必要があります。 学習は、次の手順で行います。 第 2 章 CNN で超解像 25

6. TensorFlowはじめました 2

ノイズとなっています。 では、なぜ 1 . @ を超える値が出力されているのでしようか 数に注目します。 ReLU こで、畳み込み層の活性化関 現在のネットワークでは、すべての畳み込み層で活性化関数に ReLU (Rectified Linear Unit) def inference(lr—images) : リスト 3.9 : srcnn/modeI/mode1915. py を使用しています ( リスト 3.9 ) 。 # 省略 conv3 conv3 conv2d( 'conv3' input—Iayer=conv2, weights—shape=[5, 5 , 32 , weight—stddev=1e-3, biases—shape=[CHANNELS] , st ri des= [ 1 , 1 , 1 , 1 ] , padding='VALID') tf. nn . retu(conv3) CHANNELS] , biases_value=@ . @, return conv3 図 3.14 は、 ReLU の値域を示すグラフです。 図 3.14 Rectified Linear Unit の原因になっています。 @ 以上の値をそのまま通すため、 1 . @ を超える値でもそのまま最終層の出力になり、ノイズ 第 3 章超解像奮闘記 55

7. TensorFlowはじめました 2

weights—shape=[5, 5 , 64 , 32 ] , weight—stddev=le-l, biases—shape=[32] , biases—vatue=@ . @, st ri des= [ 1 , 1 , 1 , 1 ] , padding='VALID') tf. nn . reIu(conv2) conv2d( 'conv3' input_Iayer=conv2, weights—shape=[5, 5 , 32 , weight—stddev=1e—3, biases—shape=[CHANNELS] , st ri des= [ 1 , 1 , 1 , 1 ] , padding='VAL 工 D') tf. nn . sigmoid(conv3) 1 ( グレースケール ) conv3 conv3 conv2 図 42 は、表 4.1 の条件で学習した場合の誤差の変化です。 return conv3 CHANNELS] , biases value=@ . @, 表 4.1 : 学習条件 条件 画像の倍率 (scale) 学習率 (learning-rate) ニバッチサイズ (batch_size) ステップ数 (max_step) チャンネル数 (CHANNELS) 図 4.2 誤差の変化 (smoothing=O. 9) 000 5 ℃ 00e -3 0.018 0.0150 0.02C0 0025 つ 00 三 ) ン 値 0. 開 1 128 300 , 開 0 1 CC :. 150. 28 し 250. ⅸ 第 4 章 3 〔 00 ス . さまざまなモデル 61

8. TensorFlowはじめました 2

図 : プロック単位に処理できるように大きさを調整 リスト 2.7 の関数 __calc_padding は、プロックのスライド幅 (stride) に対して必要な パディングを計算します。 リスト 2.7 : srcnn/eval.py INDEX_PADDING_LEFT = 0 INDEX PADDING TOP INDEX PADDING RIGHT = 2 INDEX PADDING BOTTOM 3 INDEX VERTICAL INDEX HORIZONTAL 1 def __calc—padding(image, stride) : padding—vertical stride[INDEX_VERTICAL] \ image. height % stride[INDEX_VERT 工 CAL] stride[INDEX_HORIZONTAL] \ image. width % stride[INDEX_HORIZONTAL] padding—horizontal padding padding[INDEX_PADDING_LEFT] padding[INDEX_PADDING_TOP] padding[INDEX_PADDING_RIGHT] padding—horizontal / / 2 padding—verticat / / 2 padding—horizontal \ padding[INDEX_PADDING_LEFT] padding—verticat \ padding[INDEX_PADDING_TOP] padding[INDEX_PADDING_BOTTOM] return padding リスト 2.8 の関数ーー pad は、画像にパディングを付加します。パディングを付加したサイズの 画像を作成して、中央にオリジナルの画像を貼り付けます。 第 2 章 CNN で超解像 33

9. TensorFlowはじめました 2

tr_images ground_truths for i in range(batch—size) : tf. random—crop( cropped—image image, (input—size, input—size, channels)) tf. image. resize_images( ground—truth cropped_image, (output—size' output—size)) tf. image. resize_images( resized image cropped—image' (input—size / / scale' input—size / / scate) , method=tf. image. ResizeMeth0d. BICUBIC) tf. image. resize_images( tr—image resized image, (input—size, input—size) , method=tf. image. ResizeMethod . BICUBIC) ground—truths. append(ground—truth) tr—images ・ append(lr—image) tf. stack(lr—images, axis=@) lr_images tf. stack(ground—truths, axis=@) ground_truths return tr_images / 255 , ground—truths / 255 ランダムで切り出した 33px の画像 (cropped-image) を縮小して高解像度の画像 「 ground-truth 」とします。また、 cropped-image を縮小してから、もう一度拡大する ことで、画像を低解像度の画像「 tr-image 」を作成しています。 48 第 3 章超解像奮闘記

10. TensorFlowはじめました 2

variable on—cpu( movnng_mean mOV1 ng_mean' params_shape, initializer=tf. constant—initiatizer(@ . @, tf. f10at32 ) , trainabte=Fatse) variable on—cpu( movnng_varnance movnng_varnance' params_shape, tf. f10at32) , initializer=tf. constant_initiatizer(l . 0, trainabIe=Fatse) tf. summary. histogram(mean . op. name, mean) tf. summary. histogram(variance . op. name, variance) extra_ops . append(moving_averages . assign_moving_average( moving—mean, mean, @ . 9 ) ) extra_ops . append(moving_averages. assign_moving_average( moving_variance, varnance, @ . 9 ) ) etse: tf. get—variable( mean , params—shape, tf. f10at32 , mOV7 ng_mean initiatizer=tf. constant_initializer(@ . 0, tf. f10at32) , trainabIe=FaIse) variance = tf. get—variabte( , params—shape, tf. f10at32, movnng_varnance' initializer=tf. constant_initializer(). @, tf. f10at32) , trainable=FaIse) bn = tf. nn . batch_normalization( nnput, mean, variance, beta, gamma, bn . set—shape(input. get—shape()) return bn 71 第 4 章 さまざまなモデル