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

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

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

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python

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

Q&A

解決済

2回答

1022閲覧

keras 入れ子になっていない括弧について

RinT_hinabita39

総合スコア28

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python

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

0グッド

0クリップ

投稿2018/12/12 19:21

####質問

keras初心者です。
以下のサンプルコードのように、括弧が入れ子になっておらず、隣接しているものはどういう意味ですか?

keras

1hoge = Flatten()(Embedding(input_dim, output_dim)(img_class)) 2

FlattenとEmbeddingは関数、classはデータセット中の画像のクラスを格納した変数だと捉えてください。
Flattenの中に括弧が入れ子になっているのならまだわかるのですが、
ここではFlattenは引数なしで、その括弧に隣接して新たな括弧が登場しています。
また、その括弧の中でもEmbedding関数の引数が指定し終わった後に、新たな括弧が登場しています。

該当する関数のドキュメントを読んでも、このような使い方に関する記載はなく、
また、特定の関数のみではなく、複数の関数においてこのような使われ方が見られるので、
恐らくは普遍的な文法?のようなものだと推測しているのですが、
調べ方が悪いのかなかなか見つかりません。お願いします。

####参考
kerasのドキュメントのリンクを貼っておきます。
Embedding https://keras.io/ja/layers/embeddings/
Flatten https://keras.io/ja/layers/core/

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

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

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

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

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

guest

回答2

0

ベストアンサー

読みづらいので複数行でインデントして書くとこんな感じです。

python

1Flatten()( 2 Embedding(input_dim, output_dim)(img_class) 3)

このコードのFlattenやEmbeddingは、呼び出す(callする)と呼び出し可能オブジェクト(callable)を返します。

こういう性質のオブジェクトのわかりやすい例としては、lambda式なんかがありますね。

python

1(lambda x:x+1) (1) # => 2

(lambda x:x+1)で関数オブジェクトを生成し(この場合外側のカッコは構文上必要)、(1)は呼び出しのカッコと引数でして、生成した関数を呼び出しています。

クラスを使って自分で定義するなら、__call__を書けばできます。意外と簡単です。

python

1class MyLambda: 2 def __init__(self, f): 3 self.f = f 4 def __call__(self, *args, **kwargs): 5 print("MyLambda!") 6 return self.f(*args, **kwargs) 7 8print(MyLambda(lambda x:x+1)(1)) 9""" => 10MyLambda! 112 12"""

投稿2018/12/12 19:50

hayataka2049

総合スコア30933

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

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

RinT_hinabita39

2018/12/12 20:17

結局のところ、直前の関数に引数として与えられているようなものと考えて差し支えないのでしょうか?
hayataka2049

2018/12/12 20:25

>結局のところ keras用語でFunctional API というものですので、これで調べてみて納得の行く解説を探してください
RinT_hinabita39

2018/12/13 20:38

Functional APIについていろんなページを見てみたら何となくわかった気になれました。ありがとうございました!
guest

0

keras触ったことないので一般的なPython文法として回答します。的外れでしたらすみません。
FlattenEmbedding関数を返す関数であれば、提示のような記載をします。
以下、単純なサンプルコードです。

Python

1def Flatten(): 2 def flatten(a): 3 return a 4 return flatten 5 6def Embedding(input_dim,output_dim): 7 def embedding(img_class): 8 return input_dim + output_dim + img_class 9 return embedding 10 11input_dim,output_dim,img_class = 1,2,3 12hoge = Flatten()(Embedding(input_dim, output_dim)(img_class)) 13print(hoge) # 6

なお、この仕組みに正式な名称はついていないと思いますが、いわゆるクロージャではこの仕組みをよく利用します。
【Python】クロージャ(関数閉方)とは

投稿2018/12/12 19:44

can110

総合スコア38262

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

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

can110

2018/12/12 19:57

コメントありがとうございます。 なるほど。呼び出し可能オブジェクトというものなのですね。 勉強になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問