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

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

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

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

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

Python

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

Q&A

1回答

1657閲覧

自作の活性化関数を作成し、利用したい

kane_study

総合スコア4

Keras

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

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

Python

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

0グッド

0クリップ

投稿2020/12/28 08:03

編集2020/12/28 17:04

自作の活性化関数を作成したい
参考記事を参考にし
defで関数を作り、
Activation()で活性化関数として扱いたかったのですが
xの位置がおかしいとなってます。
Activationを使う場合入力に使うxは外に出して、(x)とすると考えていたのですが
何故かエラーに・・・

python

1#活性化関数作成 2 def palametric_softpluse(x, alpha): 3 return tf.math.log(alpha + tf.math.exp(alpha*x))

python

1#モデル作成 2def define_model(): 3 4 5 inputs = Input(shape=(32, 32, 3)) 6 x = Conv2D(64, (3, 3), padding='SAME')(inputs) 7 x = Activation(palametric_softpluse(alpha=10))(x) 8 x = Conv2D(64, (3, 3), padding='SAME')(x) 9 x = Activation(palametric_softpluse(alpha=10))(x) 10 x = Dropout(0.25)(x) 11 x = MaxPooling2D()(x) 12 13 x = Conv2D(128, (3,3), padding='SAME')(x) 14 x = Activation(palametric_softpluse(alpha=10))(x) 15 x = Conv2D(128, (3,3), padding='SAME')(x) 16 x = Activation(palametric_softpluse(alpha=10))(x) 17 x = Dropout(0.25)(x) 18 x = MaxPooling2D()(x) 19 20 x = Conv2D(256, (3,3), padding='SAME')(x) 21 x = palametric_softpluse(alpha=10)(x) 22 x = Conv2D(256, (3,3), padding='SAME')(x) 23 x = Activation(palametric_softpluse(alpha=10))(x) 24 x = GlobalAveragePooling2D()(x) 25 x = Dense(1024)(x) 26 x = Activation(palametric_softpluse(alpha=10))(x) 27 x = Dropout(0.25)(x) 28 y = Dense(10, activation='softmax')(x) 29 30 model = Model(inputs, y) 31 32 # モデルのコンパイル。 33 model.compile(optimizer=tf.keras.optimizers.Adam(), 34 loss='categorical_crossentropy', 35 metrics=['accuracy']) 36 model.summary() 37 return model 38 39model = define_model()

エラー文

palametric_softpluse() missing 1 required positional argument: 'x'

参考記事
https://teratail.com/questions/272051


仮の解決方法
作成した活性化関数の引数alphaにデフォルト値(alpha=10)を与えましたが、理想は層毎に引数を与えたいです。

python

1#活性化関数作成 2 def palametric_softpluse(x, alpha= 10): 3 return tf.math.log(alpha + tf.math.exp(alpha*x)) 4 5#モデル作成 6def define_model(): 7 inputs = Input(shape=(32, 32, 3)) 8 x = Conv2D(64, (3, 3), padding='SAME')(inputs) 9 x = Activation(palametric_softpluse)(x) 10 x = Conv2D(64, (3, 3), padding='SAME')(x) 11 x = Activation(palametric_softpluse)(x) 12 x = Dropout(0.25)(x) 13 x = MaxPooling2D()(x) 14 15 16 x = Conv2D(128, (3,3), padding='SAME')(x) 17 x = Activation(palametric_softpluse)(x) 18 x = Conv2D(128, (3,3), padding='SAME')(x) 19 x = Activation(palametric_softpluse)(x) 20 x = Dropout(0.25)(x) 21 x = MaxPooling2D()(x) 22 23 x = Conv2D(256, (3,3), padding='SAME')(x) 24 x = palametric_softpluse(x) 25 x = Conv2D(256, (3,3), padding='SAME')(x) 26 x = Activation(palametric_softpluse)(x) 27 x = GlobalAveragePooling2D()(x) 28 x = Dense(1024)(x) 29 x = Activation(palametric_softpluse)(x) 30 x = Dropout(0.25)(x) 31 y = Dense(10, activation='softmax')(x) 32 33 model = Model(inputs, y) 34 35 # モデルのコンパイル。 36 model.compile(optimizer=tf.keras.optimizers.Adam(), 37 loss='categorical_crossentropy', 38 metrics=['accuracy']) 39 model.summary() 40 return model 41 42model = define_model()

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

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

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

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

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

guest

回答1

0

Keras やったこと無いので霊感での回答になるのですが、Activation クラスは引数に 1 引数の関数を取るようです。それを意図して palametric_softpluse(alpha=10) とやったと思うのですが、これは関数の部分適用と言い、Python そのものの機能では不可能です。Python では関数の呼び出しを書いた時点で評価が始まり、引数が足りないとエラーになるんですね(なので x がないよと怒られる)。これを回避するには二つ方法があります。

一つ目は make_palametric_softpluse(alpha) という関数を作り、関数を返すようにするのです。こんな感じに。

Python

1def make_palametric_softpluse(alpha=10): 2 return lambda x: tf.math.log(alpha + tf.math.exp(alpha*x))

こうすると alpha の値に特殊化された関数を色々作ることが出来ます。

もう一つは functools.partial を使う方法です。
functools --- 高階関数と呼び出し可能オブジェクトの操作 — Python 3.9.1 ドキュメント
やってることはだいたい一つ目といっしょなんでお好みでといった感じです。

投稿2021/01/06 01:08

A_kirisaki

総合スコア2853

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問