今TensorFlow1.*で書かれたプログラムをTensorFlow2.*で動作できるように変えています。
その段階で躓いてしまったので、教えていただきたいです。
自分は今、前回の質問でTensorFlowのFlagsをお力をお借りして解決することができました。
しかし、その後にもバージョンの問題で色々なエラーが出てきました。
どこが原因なのかがわかりません。
実行後の内容がこちらです。
Network setup: Traceback (most recent call last): File "hdrcnn_predict5.py", line 77, in <module> net = network.model(x) File "/Users/****/hdrcnn/hdrcnn-master/network.py", line 16, in model net_in = tl.layers.InputLayer(x_in, name='input_layer') File "/Users/****/Library/Python/3.7/lib/python/site-packages/tensorlayer/layers/deprecated.py", line 178, in InputLayer raise NonExistingLayerError("InputLayer(x, name='a') --> Input(name='a')(x)" + __log__) tensorlayer.layers.deprecated.NonExistingLayerError: InputLayer(x, name='a') --> Input(name='a')(x) Hint: 1) downgrade TF and TL from version 2.x to 1.x. 2) check the documentation of TF and TL version 2.x
プログラムです。
python
1# -*- coding: utf-8 -*- 2 3import os, sys 4import tensorflow.compat.v1 as tf 5tf.disable_v2_behavior() 6import tensorlayer as tl 7import numpy as np 8import network, img_io 9 10eps = 1e-5 11 12def print_(str, color='', bold=False): 13 if color == 'w': 14 sys.stdout.write('\033[93m') 15 elif color == "e": 16 sys.stdout.write('\033[91m') 17 elif color == "m": 18 sys.stdout.write('\033[95m') 19 20 if bold: 21 sys.stdout.write('\033[1m') 22 23 sys.stdout.write(str) 24 sys.stdout.write('\033[0m') 25 sys.stdout.flush() 26 27 28#設定、TensorFlow引数を使用 29FLAGS = tf.flags.FLAGS 30tf.flags.DEFINE_integer("width", "1024", "Reconstruction image width") 31tf.flags.DEFINE_integer("height", "768", "Reconstruction image height") 32tf.flags.DEFINE_string("im_dir", "data", "Path to image directory or an individual image") 33tf.flags.DEFINE_string("out_dir", "out", "Path to output directory") 34tf.flags.DEFINE_string("params", "hdrcnn_params.npz", "Path to trained CNN weights") 35 36tf.flags.DEFINE_float("scaling", "1.0", "Pre-scaling, which is followed by clipping, in order to remove compression artifacts close to highlights") 37tf.flags.DEFINE_float("gamma", "1.0", "Gamma/exponential curve applied before, and inverted after, prediction. This can be used to control the boost of reconstructed pixels.") 38 39#32の倍数に丸めて、オートエンコーダのプーリングとアップサンプリングを行う 40#入力画像と同じサイズになります 41sx = int(np.maximum(32, np.round(FLAGS.width/32.0)*32)) 42sy = int(np.maximum(32, np.round(FLAGS.height/32.0)*32)) 43if sx != FLAGS.width or sy != FLAGS.height: 44 print_("Warning: ", 'w', True) 45 print_("prediction size has been changed from %dx%d pixels to %dx%d\n"%(FLAGS.width, FLAGS.height, sx, sy), 'w') 46 print_("ピクセル、オートエンコーダのプーリングとアップサンプリングに準拠します。\n\n", 'w') 47 48#情報 49print_("\n\n\t-------------------------------------------------------------------\n", 'm') 50print_("\t ディープCNNを使用した単一露光からのHDR画像再構成\n\n", 'm') 51print_("\t 予測設定\n", 'm') 52print_("\t -------------------\n", 'm') 53print_("\t 入力画像のディレクトリ/ファイル:%s\n" % FLAGS.im_dir, 'm') 54print_("\t 出力ディレクトリ:%s\n" % FLAGS.out_dir, 'm') 55print_("\t CNN重み:%s\n" % FLAGS.params, 'm') 56print_("\t 予測解像度: %dx%d ピクセル\n" % (sx, sy), 'm') 57if FLAGS.scaling > 1.0: 58 print_("\t Pre-scaling: %0.4f\n" % FLAGS.scaling, 'm') 59if FLAGS.gamma > 1.0 + eps or FLAGS.gamma < 1.0 - eps: 60 print_("\t Gamma: %0.4f\n" % FLAGS.gamma, 'm') 61print_("\t-------------------------------------------------------------------\n\n\n", 'm') 62 63# シングルフレーム 64frames = [FLAGS.im_dir] 65 66# ディレクトリが指定されている場合は、パス内のすべてのファイルの名前を取得します 67if os.path.isdir(FLAGS.im_dir): 68 frames = [os.path.join(FLAGS.im_dir, name) 69 for name in sorted(os.listdir(FLAGS.im_dir)) 70 if os.path.isfile(os.path.join(FLAGS.im_dir, name))] 71 72#画像入力用のプレースホルダー 73x = tf.placeholder(tf.float32, shape=[1, sy, sx, 3]) 74 75#HDR再構成オートエンコーダモデル 76print_("Network setup:\n") 77net = network.model(x) 78 79#CNN予測(これには入力画像xとのブレンドも含まれます) 80y = network.get_final(net, x) 81 82#推論を実行するためのTensorFlowセッション 83sess = tf.InteractiveSession() 84 85#トレーニング済みのCNNウェイトをロードする 86print_("\nLoading trained parameters from '%s'..."%FLAGS.params) 87load_params = tl.files.load_npz(name=FLAGS.params) 88tl.files.assign_params(sess, load_params, net) 89print_("\tdone\n") 90 91if not os.path.exists(FLAGS.out_dir): 92 os.makedirs(FLAGS.out_dir) 93 94print_("\nStarting prediction...\n\n") 95k = 0 96for i in range(len(frames)): 97 print("Frame %d: '%s'"%(i,frames[i])) 98 99 try: 100 #フレームの読み込み 101 print_("\tReading...") 102 x_buffer = img_io.readLDR(frames[i], (sy,sx), True, FLAGS.scaling) 103 print_("\tdone") 104 105 print_("\t(Saturation: %0.2f%%)\n" % (100.0*(x_buffer>=1).sum()/x_buffer.size), 'm') 106 107 # 実行予測。 108 # ガンマ値は、再構成されたハイライトの強度を高める/減らすことを可能にするために使用されます。 109 # y = f(x)が再構成されたものであれば、ガンマ値 gは、y = f(x^(1/g))^gに従ってこれを変更します。 110 print_("\tInference...") 111 feed_dict = {x: np.power(np.maximum(x_buffer, 0.0), 1.0/FLAGS.gamma)} 112 y_predict = sess.run([y], feed_dict=feed_dict) 113 y_predict = np.power(np.maximum(y_predict, 0.0), FLAGS.gamma) 114 print_("\tdone\n") 115 116 # ガンマ補正出力 117 y_gamma = np.power(np.maximum(y_predict, 0.0), 0.5) 118 119 # ディスクへの書き込み 120 print_("\tWriting...") 121 k += 1; 122 img_io.writeLDR(x_buffer, '%s/%06d_in.png' % (FLAGS.out_dir, k), -3) 123 img_io.writeLDR(y_gamma, '%s/%06d_out.png' % (FLAGS.out_dir, k), -3) 124 img_io.writeEXR(y_predict, '%s/%06d_out.exr' % (FLAGS.out_dir, k)) 125 print_("\tdone\n") 126 127 except img_io.IOException as e: 128 print_("\n\t\tWarning! ", 'w', True) 129 print_("%s\n"%e, 'w') 130 except Exception as e: 131 print_("\n\t\tError: ", 'e', True) 132 print_("%s\n"%e, 'e') 133 134print_("Done!\n") 135 136sess.close()
ここの質問に今書かれてるエラーは、
https://teratail.com/questions/354796
の「質問への追記・修正」に私が書いた修正を加えたものですけど、その修正は間違ってる(エラーが消えない)わけだから、その修正をしてないオリジナルのコードをTF 2.*対応だけして他はそのままで動かした状態のエラーをここの質問には書いてください
上記は、
https://teratail.com/questions/354796
の「質問への追記・修正」に質問者さんが2021/08/18 17:40に書いたエラーのことです
コードもそのエラーが出た状態で、下記をやる前の状態から再スタートして、この質問で聞き直してください
net_in = tl.layers.InputLayer(x_in, name='input_layer')
↓ 変更
net_in = tl.layers.Input(name='input_layer')(x_in)
下記だけやって、他の修正は無かったことにする、ということです
import tensorflow as tf
↓ 変更
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
わかりました。
network.pyも
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
した状態で、
net_in = tl.layers.InputLayer(x_in, name='input_layer')
↓ 変更
net_in = tl.layers.Input(name='input_layer')(x_in)
に直して実行すれば良いのでしょうか?
また手伝って頂ければ幸いです。
あと、オリジナルのコードのURLを質問に書かないと、質問読んだ人は「network.py」って何? ってなりますよ
> network.pyも
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
した状態で、
そうです
> net_in = tl.layers.InputLayer(x_in, name='input_layer')
↓ 変更
net_in = tl.layers.Input(name='input_layer')(x_in)
に直して実行
違います
オリジナルに戻すのだから、下記の通り
net_in = tl.layers.Input(tf.shape(x_in), name='input_layer')(x_in)
↓ オリジナルに戻す
net_in = tl.layers.InputLayer(x_in, name='input_layer')
そうすれば下記のエラーが出るはずなので、ここの質問を編集してそれを記載してください
Traceback (most recent call last):
File "hdrcnn_predict4.py", line 77, in <module>
net = network.model(x)
File "/Users/****/hdrcnn/hdrcnn-master/network.py", line 50, in model
net_in = tl.layers.InputLayer(x_in, name='input_layer')
File "/Users/****/Library/Python/3.7/lib/python/site-packages/tensorlayer/layers/deprecated.py", line 178, in InputLayer
raise NonExistingLayerError("InputLayer(x, name='a') --> Input(name='a')(x)" + __log__)
tensorlayer.layers.deprecated.NonExistingLayerError: InputLayer(x, name='a') --> Input(name='a')(x)
Hint: 1) downgrade TF and TL from version 2.x to 1.x. 2) check the documentation of TF and TL version 2.x
元に戻したのですが、
自分の中では
> net_in = tl.layers.InputLayer(x_in, name='input_layer')
↓ 変更
net_in = tl.layers.Input(name='input_layer')(x_in)
この時点での修正は正しかったと思うのですが、なぜ戻したのですか?
自分の中では他にも対応してない関数が残っていると考えれました。
> net_in = tl.layers.InputLayer(x_in, name='input_layer')
↓ 変更
net_in = tl.layers.Input(name='input_layer')(x_in)
をやっても、その行で
File "/Users/****/hdrcnn/hdrcnn-master/network.py", line 50, in model
net_in = tl.layers.Input(name='input_layer')(x_in)
TypeError: Input() missing 1 required positional argument: 'shape'
というエラーが出ますから、その修正は不完全なのです
質問者さんがその修正は正しいと思うのなら、それを採用して、その修正を行った状態で実行した場合のエラーを質問に書いてももちろん構いませんが、その場合は、修正した「network.py」も質問に書いてください
そうしないと、他の人には状況が分からないです
Network setup:
Traceback (most recent call last):
File "hdrcnn_predict4.py", line 77, in <module>
net = network.model(x)
File "/Users/****/hdrcnn/hdrcnn-master/network.py", line 50, in model
net_in = tl.layers.Input(tf.shape(x_in), name='input_layer')(x_in)
File "/Users/****/Library/Python/3.7/lib/python/site-packages/tensorlayer/layers/inputs.py", line 83, in Input
input_layer = _InputLayer(shape, dtype=dtype, name=name)
で、shapeが関係してるところがでてるからですか?
> TypeError: Input() missing 1 required positional argument: 'shape'
とのことなので、Input() には「shape」の指定が必要です
その「shape」として「tf.shape(x_in)」を書いてもダメなのは、
https://teratail.com/questions/354796
の「質問への追記・修正」に質問者さんが2021/08/19 16:22に書いたエラーから明らかなので、「tf.shape(x_in)」を追加する修正は不採用でお願いします
あなたの回答
tips
プレビュー