scope - みる会図書館


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

1. TensorFlowはじめました 2

print(var2. name) scopel/varl:@ scope2—I/scope2—2/var2:@ スコープ内で宣言した変数は、変数名の前にスコープ名が付加されます。入れ子のスコープ の場合、区切り文字 ( / ) で連結されます。 tf. Variable と tf. get_variable 変数は tf. Variable に加えて tf. get_variabte でも宣言できます リスト 1.9 を見てみましよう。 tf. va ri a ble は、同じスコープ、同じ名前で何度でも変数を としています。 ただ変数を宣言するだけの tf. variabte に対し tf. get_variable は、変数の共有を目的 with tf. variable_scope('scopel') : リスト 1 .9 : tf. VariabIe による変数の宣言 ( 利用 ) 宣言できます。 varl 1 varl 2 tf. Variab1e(name="varI" tf. Variab1e(name="varI" initial_value=l . @) initiat_vatue=l . @) print(varl_l . name) print(varI_2. name) scopel/varl:@ scopel/varl_l:@ 一方、 tf. get_variabte は、もし同じ名前の変数が宣言されていた場合工ラーになります。 リスト 1 . 1 0 : tf. get_variable による変数の宣言 ( 利用 ) with tf. variabte_scope('scopel') : tf. get—variable( var1 1 shape=[] , ' va r 1 ' initializer=tf. constant_initializer(l .@)) tf. get—variable( var1 2 shape=[] , ' va r 1 ' initializer=tf. constant_initiatizer(l .@)) 第 1 章 TensorFlow の基礎 15

2. TensorFlowはじめました 2

VaIueError: VariabIe scopel/varl already exists, disallowed . reuse=True in VarScope? OriginaIIy defined at: FiIe " く stdin>" Iine 2 , in く module> Did you mean tO set 変数を宣言した状態で、既にある変数を利用するには、 スコープ宣言で reuse=True を指定 します。 リスト 1 .1 1 : 一度宣言した変数を取得 with tf. variable_scope('scopel') : tf. get—variable( varl shape=[] , 'varl initiatizer=tf. constant_initializer(l . @)) tf. assign(varl, ー 1 . の varl with tf. Session() as sess: sess . run(tf. globat—variabtes_initializer()) varl_result = sess . run(varl) print('varl , 。 varl_result) with tf. variabte_scope('scopel' var2 = tf. get—variable( shape=[] , ' va r 1 ' initializer=tf. constant_initializer(l . @)) var2 result sess. run(var2) print('var2 % var2—resuIt) reuse=True) : ー 1 .000000 varl var2 scopel/varl は、一度目も二度目も、初期値として 1.0 を指定しています。しかし、二度目 の get-variabte で取得した scopel/var の値は、一度目に宣言した後に代入した値 -1.0 と なっています プレースホルダー プレースホルダー (placeholder) はデータが格納される予定地です。データは未定のままグ ラフを構築し、具体的な値は実行するときに与えます。 プレースホルダーを利用するケースとして、ファイルから読み込んだデータをグラフに与え て処理する場合が考えられます。 16 第 1 章 TensorFlow の基礎

3. TensorFlowはじめました 2

リスト 1.7 のコードでは、 2 つのセッション内で同じオペレーション「 mut op います。 リスト 17 : 異なるセッションの変数 # 1 つ目のセッション with tf. Session() as sess: [ 36 , 36 ] 9 # 2 つ目のセッション出力 [ 36 , 36 ] 9 # 1 つ目のセッション出力 print(sess . run([mul—op, mul-op])) print(sess . run(mul—op)) sess . run(tf. global—variabtes—initializer()) with tf. Session() as sess: # 2 つ目のセッション print(sess . run([mul—op, mul—op])) print(sess . run(mul—op)) sess . run(tf. globat—variabtes-initializer()) 」を実行して mut-op は、処理の過程で変数を更新します。しかし、セッション間で変数の値は引き継が れていません。それぞれのセッションで変数が独立していることがわかります。 変数スコープ 変数を宣言する際に、スコープを指定できます。スコープは Python の with 構文に続けて tf. variable-scope で宣言します ( リスト 1.8 ) 。 リスト 1 .8 . スコープの宣言 with tf. variabte—scope('scopel') : tf. VariabIe(name="var1" varl with tf. variabIe—scope('scope2-1') : with tf. variable—scope( 'scope2-2') : var2 = tf. Variab1e(name="var2" initial_vatue=l . 0) initial_vatue=l . @) print(varl. name) 14 第 1 章 TensorFlow の基礎

4. TensorFlowはじめました 2

第 3 章 ) を それを知るには、モデルを構成 超解像奮闘記 本章では、失敗の原因を探り、どのようにすれば期待通りに動作するのか。その方法を探り 第 2 章で作成したモデルは、期待した動作をしませんでした。 入力すると、 21px の画像を出力します。 第 2 章のモデルは、 3 層の畳み込み層で構成される CNN です。 33px の画像 (tr_image 畳み込み処理とバディング ます。 図 3.1 CNN の入出力 33X33 21X21 CNN そもそもなぜ、入力と出力の大きさが異なるのでしようか している「畳み込み層」の処理に踏み込む必要があります。 畳み込み層 with tf. variable_scope(name) as scope: strides=(), 1 , 1 , 1 ) , padding='VALID'): biases_shape, biases_value, weights—shape, weight—stdde\/' def conv2d(name, input—layer, リスト 3.1 : srcnn/model/model—base. py 畳み込み層は、 model ー base. p の関数 conv2d で定義しています ( リスト 3. I) 。 第 3 章超解像奮闘記 padding=padding) conv tf. nn. conv2d(input—Iayer, weights, strides, weights —get—weights(weights—shape, stddev=weight—stddev) 41

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

図 3.9 image 」 oader_svs. py の動作 33X33 cropped—image lr—image 33X33 1 1 x 1 1 0 → 0 CNN ground—truth 21X21 これまで見てきたように、超解像を実現するには周辺部の特徴を取り込む必要があります。 しかし、畳み込み層でパディングを設定してもプロックの境目にノイズが発生します。 そこで、学習時にパディングの領域を含めて読み込むように変更します。 conv2d で 0 パディングを追加するのでなく、失われるピクセル分、大きめに画像を読み込み ます ( 図 3.10 ) 。 図 3.10 変更後の動作 cropped—image 33X33 lr—image 33X33 ☆☆☆ CNN ground—truth 21X21 リスト 3.5 は、変更後のプログラムです。 リスト 3.5 : srcnn/image 」 oader_vvv. py def toad_image(file_list, input_size, output_size, scaIe=2, batch_size=l) : with tf. name_scope( 'image_loader vvv' ) : channels=l, 第 3 章超解像奮闘記 49

7. TensorFlowはじめました 2

図 3.8 超解像処理をした画像 第第 1 かなり良くなりましたが、一定間隔で黒い点が表示されているのが気になります。 どうやら 処理するプロックの境界にノイズが出ているようです。 tf. nn . conv2d が追加するパディングは「 0 パディング ( = 黒のピクセル ) 」です 周辺領域 の特徴を多く取り込むために追加したパディングが、学習結果に影響を与えたと考えられます。 画像の読み込み処理 こでもう一度、第 2 章で作成した学習時の画像の読み込み処理 ( リスト 3.4 ) を見てみま しよう。 リスト 3.4 : s ℃ nn/image 」 oader_svs. py def load_image(file_list, input_size, output_size, channels=l, scaIe=2, batch_size=l) : with tf. name_scope( 'image_loader—svs' ) : filename—queue = tf. train. string_input_producer(fite_list, shuffte=True) tf. WholeFiIeReader() reader. read(filename_queue) reader value tf. image. decode—jpeg(vatue, channels=channels) 1 mage 第 3 章超解像奮闘記 47

8. TensorFlowはじめました 2

1 . 学習データの読み込み 2 . 誤差関数の定義 3 . 最適化アルゴリズムの設定 4 . 学習の実行 # coding: UTF-8 リスト 2.3 : srcnn/image 」 oader_svs. py 像度の画像 (ground-truths) の組み合わせです。 戻り値は、 batch ー size で指定した数の学習に使う低解像度の画像 (tr-images) と、高解 ズ (input-size) 、モデルが出力する画像サイズ (output-size) を指定します。 引数に読み込む画像ファイルのリスト (jpeg-file-list) と、モデルへ入力する画像サイ リスト 2.3 の関数 load ー image は、画像の読み込み処理です。 学習データの読み込み from from from future future_ future_ import absolute_import import division import print—function import tensorflow as tf def load_image(file—list, input—size' output—size' channets=l' scaIe=2, batch—size=l) : with tf. name_scope( 'image—loader—svs' ) : 26 tf. train. string—input—producer(fite—list, filename_queue shuffte=True) reader = tf. Wh01eFiteReader() reader. read(filename—queue) value tf. image ・ decode—jpeg(value, channets=channets) nmage lr_images ground_truths for i in range(batch—size) : cropped—image = tf. random—crop( image, (input—size, input—size' channets)) tf. image . resize_images( ground—truth 第 2 章 CNN で超解像

9. TensorFlowはじめました 2

convl convl conv2 conv2 conv2 conv3 conv3 conv3 batch—norm('bnl' tf. nn. retu(convl) convl, conv2d( 'conv2' extra_ops, is_train) input_layer=convl, weights—shape=[5, 5 , 64 , 32 ] , weight—stddev=le-l, biases—shape=None, biases value=@ . @, strides=[l, 1 , 1 padding='VALID') batch norm('bn2' conv2, tf. nn . reIu(conv2) conv2d( 'conv3' extra_ops, is_train) input—tayer=conv2, weights—shape=C5, 5 , 32 , CHANNELS] , weight—stddev=1e—3, biases_shape=None, strides=[l, 1 , 1 , padding='VAL 工 D') batch_norm('bn3' conv3, tf. nn . sigmoid(conv3) biases_value=@ . @, 1 ] , extra_ops, is_train) return conv3 def batch_norm(name, input, extra_ops, is_train) : リスト 4.6 : srcnn/model/model 955_sigmoid bn_color. py Batch NormaIization の処理は、関数 batch ー norm で定義しています ( リスト 4.6 ) 。 with tf. variable_scope(name) : params shape [input ・ get-shape() [ ー 1 ] ] beta variabte on_cpu( 'beta ' params_shape, initializer=tf. constant_initializer(@ . @, variable on_cpu( gamma params shape, gamma initializer=tf. constant_initializer(l . @, tf. f10at32)) tf. f10at32)) -i f -i S ra-i n : mean, varnance tf. nn . moments(input, [@, 1 , 2 ] , name= 'moments ' ) 70 第 4 章 さまざまなモデル