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

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

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

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

Q&A

解決済

1回答

1878閲覧

kerasのSequentialモデル及びfunctional モデルの重みについて

hiro329

総合スコア19

Keras

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

0グッド

0クリップ

投稿2018/11/14 01:29

前提・実現したいこと

tensorflowのソース知識をもとに、kerasのコードに書き換えたときに思った不思議な点について教えていただければと思います。
テンソルの計算では、重みの最適化によって解が求まると理解しております。
tensorflowのサンプルなどでは、重みの初期化が行われ、一般的に標準偏差によって初期化されるものと理解しております。
そこで、kerasでもサンプルで同じようなことをしているのかなと思ったのですが、重みの初期化なしにコードが書かれています。
この場合、重みはどのように扱っていると考えいいものなのでしょうか。
初期値が0だと、どれだけ更新しても重みが0のままで学習が進まないと思うのですが、考え方自体間違っているのでしょうか。
どなたか教えていただけますでしょうか。
よろしくおねがいいたします。
とりあえず、Sequentialモデルのサンプルを貼り付けておきます。

■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

python keras ソースコード (x_train, y_train), (x_test, y_test) = mnist.load_data() x_train1, x_valid, y_train1, y_valid = train_test_split(x_train, y_train, test_size=0.175) x_train = x_train1 y_train = y_train1 x_train = x_train.reshape(x_train.shape[0], 28, 28, 1).astype('float32')/255 x_valid = x_valid.reshape(x_valid.shape[0], 28, 28, 1).astype('float32')/255 x_test = x_test.reshape(x_test.shape[0], 28, 28, 1).astype('float32')/255 # convert one-hot vector y_train = keras.utils.to_categorical(y_train, 10) y_valid = keras.utils.to_categorical(y_valid, 10) y_test = keras.utils.to_categorical(y_test, 10) # create model model = Sequential() model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1))) model.add(Conv2D(64, (3, 3), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(128, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(10, activation='softmax')) model.compile(loss='categorical_crossentropy', optimizer=RMSprop(), metrics=['accuracy']) print(model.summary())

試したこと

kerasの重みの扱いについての概念が知りたい。
また、追加でaddで
model.add(Conv2D(64, (3, 3), activation='relu'))
以上のように書いた場合、(64, (3, 3))は、3x3x64の3次元テンソルということを示しているのでしょうか。
基本的なことを質問してるかもしれませんが、まだ入門したててわかりません。
お願いします。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

kerasの重みの扱いについての概念が知りたい。

Keras のレイヤー系のクラスのコンストラクタでは kernel_initializerbias_initializerといった初期化方法を指定する引数があります。

例えば Conv1D を見てみると

kernel_initializer='glorot_uniform', bias_initializer='zeros'

となっていますので、何も指定しなかった場合、カーネルの重みは Xavier の初期化、バイアスは0で初期化されることがわかります。

デフォルトで用意されている初期化方法は こちら を見てください。

また、追加でaddで
model.add(Conv2D(64, (3, 3), activation='relu'))
以上のように書いた場合、(64, (3, 3))は、3x3x64の3次元テンソルということを示しているのでしょうか。

ある畳み込み層のカーネルの重みとしては、

入力チャンネル数 * 3 * 3 * 64 になりますね。

以下の入力チャンネル数x3x3 のカーネルが64枚あります。

イメージ説明

追記

Model.summary() で各レイヤーの出力を確認できます。

python

1from keras.models import Sequential 2from keras.layers import Conv2D, MaxPooling2D, Dropout, Flatten, Dense 3 4model = Sequential() 5model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1))) 6model.add(Conv2D(64, (3, 3), activation='relu')) 7model.add(MaxPooling2D(pool_size=(2, 2))) 8model.add(Dropout(0.25)) 9model.add(Flatten()) 10model.add(Dense(128, activation='relu')) 11model.add(Dropout(0.5)) 12model.add(Dense(10, activation='softmax')) 13model.summary()

python

1_________________________________________________________________ 2Layer (type) Output Shape Param # 3================================================================= 4conv2d_1 (Conv2D) (None, 26, 26, 32) 320 5_________________________________________________________________ 6conv2d_2 (Conv2D) (None, 24, 24, 64) 18496 7_________________________________________________________________ 8max_pooling2d_1 (MaxPooling2 (None, 12, 12, 64) 0 9_________________________________________________________________ 10dropout_1 (Dropout) (None, 12, 12, 64) 0 11_________________________________________________________________ 12flatten_1 (Flatten) (None, 9216) 0 13_________________________________________________________________ 14dense_1 (Dense) (None, 128) 1179776 15_________________________________________________________________ 16dropout_2 (Dropout) (None, 128) 0 17_________________________________________________________________ 18dense_2 (Dense) (None, 10) 1290 19================================================================= 20Total params: 1,199,882 21Trainable params: 1,199,882 22Non-trainable params: 0 23_________________________________________________________________

投稿2018/11/14 05:43

編集2018/11/14 08:58
tiitoi

総合スコア21956

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

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

hiro329

2018/11/14 08:15

すいません、回答いただきありがとうございます。 tensorflowでは理解していたつもりが、kerasを学び始めて、改めて「??」と思うところが出てきました。 model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1))) model.add(Conv2D(64, (3, 3), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(128, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(10, activation='softmax')) ですが、インプットとして28*28の入力に対してカーネルサイズ3*3で出力フィルタサイズが64とあるので、ここではpaddingしていないので、28*28より小さいサイズ、26*26(?)の32次元のサイズが出力されるということでしょうか。 その後、前の質問でもさせていただきましたが、 model.add(Conv2D(64, (3, 3), activation='relu')) で、この処理をしているわけですが、説明いただいた時点では、そんなもんかとおもいましたが、よくよく考えるとわからなくなってきました。 kerasのマニュアルに keras.layers.Conv2D(filters, kernel_size, ・・・・・) とあり、 filters: 整数で,出力空間の次元(つまり畳み込みにおける出力フィルタの数) とあります。 ここで、64,(3,3)となると入力、前段階からの入力が26*26*32となると、具体的な数値の整合性というか、次のmodel層に出力される形は具体的にどうなるのでしょうか。 なんか、うまく質問できていなうような気もしますが、もし質問の意味をくみ取ってくださいましたら、教えていただけるとありがたいです。 また、Dense層ですが、具体的な処理は何もしていないのでしょうか。 層を増やして、学習層を増やしているだけと理解していいものなのでしょうか。 ほかのソースもいろいろ見ましたが、Dense層をいくつも使っているプログラムを見ます。 Dense層で指定された、次元のたとえがDense(10)、Dense(64)とかで指定されている次元で連結させて学習させていると理解してもいいのでしょうか。 いろいろと、質問して申し訳ないのですが、回答いただけるとありがたいです。 よろしくお願いいたします
tiitoi

2018/11/14 09:02

> 次のmodel層に出力される形は具体的にどうなるのでしょうか。 モデルを作成したあと model.summary() で出力の形状を確認できるので、見てみてください。 > また、Dense層ですが、具体的な処理は何もしていないのでしょうか。 なにもしていないとはどういうことでしょうか。 各全結合層では f(Wx + b) を計算しています。活性化関数は通常、非線形関数を使用するので、Dense(200) 1つと Dense(100) 2つでは意味が違ってきます。
hiro329

2018/11/14 09:14

言葉足らずで申し訳ございません。 なにもしてないというのは、語弊がありました。 畳込みやmaxpoolといった、画像特有な署はしていないのでしょうかという意味でした。 もちろん、Dense層で活性化関数を使って計算をして、学習させているということは理解していました。 申し訳ございませんでした。 あと、もう一つ質問させていただいてもよろしいでしょうか。 形状は、やはり私が当初思った通りの数値になっていました。 ソースで実行していただきありがとうございます。 ひとつわからないのが、64, (3, 3)の(3,3)です。 これは、前に説明していただいた通り、カーネルという理解でよろしいのでしょうか。 具体的に、kernel_size=といったように、指定してやる必要性はないのでしょうか。 第一引数が、出力次元で、第2引数にこのように書いた場合、自動的にカーネルと判定されるのでしょうか。 丁寧に説明してくださりありがたく思っております。 ほんとうにありがとうございます。
tiitoi

2018/11/14 09:22 編集

> 画像特有な署はしていないのでしょうか していないです。クラス分類等のモデルで最後に2つぐらい付いてる全結合層は、畳み込み層から出てきた画像の特徴を元に分類を行う役割があります。 つまり、畳み込み層とは果たしてる役割が異なります。 ----------------------------------- Conv2D(filters, kernel_size, ...) となっているので、第1引数は出力数 (フィルター数、カーネルの数)、第2引数kernel_size はフィルタ (カーネル) の大きさです。 Conv2D(filters=64, kernel_size=(3, 3)) と明示的にキーワード引数として指定してもよいですよ。位置引数として指定するのなら、引数名は書かなくてもよいということです。 これは Keras の話ではなく、Python の関数の引数指定方法の理解ということになるかと思います。
hiro329

2018/11/14 09:25

丁寧に説明してくださりありがとうございます。 疑問点が完全にクリアになりました。 このたびはほんとうにありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問