質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

2439閲覧

tensorflowを用いたアフィン変換

jaxaman

総合スコア11

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/07/26 05:36

tensorflowでsess.run()をする前に(マップを)作る段階で
アフィン変換する関数を作りたいです

その時、変換先の座標がテンソルになっていて配列の[]←の中に入れると以下のエラーが出ます。

*** IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices

エラーには配列番号にはintegerのみを入れてくださいとあるのはわかりますが
テンソルをintに変える方法もありません。

コードは以下のようになっています。

python

1def shift_x_y(coords,H,W,B,image): 2 x_shift = tf.reshape(coords[:,:,:,0],[-1,H,W,B]) 3 y_shift = tf.reshape(coords[:,:,:,1],[-1,H,W,B]) 4 mag = tf.reshape(coords[:,:,:,2],[-1,H,W,B]) 5 6 for h in range(H): 7 for w in range(W): 8 x_ = x_shift[:,h,w,:] #<tf.Tensor 'strided_slice_4:0' shape=(?, 5) dtype=float32> 9 y_ = y_shift[:,h,w,:] #<tf.Tensor 'strided_slice_5:0' shape=(?, 5) dtype=float32> 10 mag_ = mag[:,h,w,:] #<tf.Tensor 'strided_slice_6:0' shape=(?, 5) dtype=float32> 11 12 new = np.ones((30,30))*255 13 for i in range(H): 14 for j in range(W): 15 new_x = mag_*i + x_ #<tf.Tensor 'add:0' shape=(?, 5) dtype=float32> 16 new_y = mag_*j + y_ #<tf.Tensor 'add_1:0' shape=(?, 5) dtype=float32> 17 #pdb.set_trace() 18 for k in range(B): 19 #new[tf.transpose(new_x)[k]][tf.transpose(new_y)[k]] = tf.cond(tf.transpose(new_x)[k]>W,lambda:) 20 """ 21 if tf.transpose(new_x)[k] > W: 22 pass 23 elif tf.transpose(newy)[k] > H: 24 pass 25 else: 26 new[tf.transpose(new_x)[k]][tf.transpose(new_y)[k]] = image[h][w][k][i][j] 27 """ 28 try: 29 new[tf.transpose(new_x)[k]][tf.transpose(new_y)[k]] = image[h][w][k][i][j] 30 print("success {0}".format(k)) 31 except: 32 pass 33 pdb.set_trace() 34 35 36 return 0

何か良い方法ないでしょうか
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

tf.castを使うと型変換できます。
エラーになるtensorに対し、tf.cast(変換したいtensor,変換したい型)でintegerにするといいかと思います

投稿2019/07/27 06:59

R.Shigemori

総合スコア3376

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jaxaman

2019/07/27 07:14

回答ありがとうございます。 x = tf.cast(tf.transpose(new_x)[k],tf.int32) y = tf.cast(tf.transpose(new_y)[k],tf.int32)と変換してみましたが、 new[x][y] *** TypeError: Only integers, slices (`:`), ellipsis (`...`), tf.newaxis (`None`) and scalar tf.int32/tf.int64 tensors are valid indices, got <tf.Tensor 'Cast:0' shape=(?,) dtype=int32> となってしまいます。 tensorではないintにしなければならないようです。(例えばnumpyだとか) 現在、tfp.bijectors.Affineというapiを発見しました。これを用いるとaffine変換できそうですが、使い方がわからなくて困っています。
R.Shigemori

2019/07/27 09:44

インデックスが不正というなので、tf.castはkに適用するべきかと思います。 なお、アフィン変換するのであれば、opencvモジュールを使ったほうが簡単かと思います。 私自身は経験がないのですが、以下に使用例などの解説を見つけたので、参考にしてはいかがでしょうか? https://qiita.com/koshian2/items/c133e2e10c261b8646bf
jaxaman

2019/07/27 12:01

コメントありがとうございます。 インデックスの不正に関しましてはnew[x][y]の段階で出てくるエラーであり、[k]に関しても私がfor k in range(B):で作っているものになりますので、問題はないかと思われます。 opencvのも試してみましたが、アフィン変換の行列をnumpyで与えなくてはならないので、あきらめました。
R.Shigemori

2019/07/27 12:54

エラーの出現箇所がわかっているのであれば、該当のインデックスの型を確認すれば、対策が見えてくるはずです。問題ないと思っていても、現実に不正と認識させている以上、手間がかかってもひとつずつチェックして問題を特定するしかなさそうですね。 opencvを試して課題が見えているのであれば、対策できそうな気もします。質問によるとsess.runの前にアフィン変換するということなので、numpyのarrayで処理しておいて、runするときに引数で与えるというアプローチもありそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問