知りたい事:
Keras(またはTensorflow)でCNNのモデルを構築し学習させた後に、model.predict()で予測値をだす際の数値的な処理の詳細を知りたいです。
試したこと:
学習させたモデルのファイルからパラメータを取得し、教科書的な畳み込み演算、全結合演算をコードした自作CNNで予測値を算出したところ、model.predict()とはかなり異なる値ばかり算出されてしまいました。
Kerasで構築したモデルは以下のとおりです。
Python
1model = Sequential() 2mode.add(Conv2D(20,kernel_size=(1,5), strides=(1,1), padding='valid', input_shape=(24,13,1), activation='relu')) 3mode.add(Conv2D(20,kernel_size=(1,9), strides=(1,1), padding='valid', activation='relu')) 4mode.add(Conv2D(20,kernel_size=(24,1), strides=(1,1), padding='valid', activation='relu')) 5mode.add(Flatten()) 6mode.add(Dense(20,activation='relu')) 7mode.add(Dense(2,activation='sigmoid')) 8model.load_weights(model_path / '[model_filename].h5') 9model.summary() 10 11# Prediction 12y = model.predict(x, batch_size=1)
私の自作CNNのコードは下の通りです(畳み込みと全結合のみ記載します)
Python
1def mydense(ind, ker, bia, func): 2 tem_dense = np.dot(ker.T, ind) + bia 3 return func(tem_dense) 4 5def myconv(ind, ker, bia, func): 6 7 # input sample data's shape 8 H = ind.shape[0] 9 W = ind.shape[1] 10 11 # kernel' shape 12 Hf = ker.shape[0] 13 Wf = ker.shape[1] 14 K = ker.shape[3] 15 16 # result of convolution 17 u = np.zeros((H - Hf + 1, W - Wf + 1, K)) 18 # output 19 z = np.zeros((u.shape)) 20 21 for k in range(0,K): 22 for n in range(0,W - Wf + 1): 23 for m in range(0, H - Hf + 1): 24 u[m,n,k] = (ind[m:m+Hf, n:n+Wf, :] * ker[:,:,:,k] + bia[k]).sum() 25 26 z = np.array([func(i) for i in u]) 27 28 return z
KerasまたはTensorflowのソースコード
https://github.com/keras-team/keras/tree/master/keras
などで調べていましたが、私の自作コードの畳み込み演算(上記の myconv)は
Python
1from tensorflow.python.ops.nn_ops import convolution 2from tensorflow.python.ops.gen_nn_ops import conv2d 3tf.nn.conv2d() 4from tensorflow.python.ops.nn_ops import convolution_internal 5from tensorflow.pythonn.ops.nn_ops import convolution_v2
バイアスの付与は
Python
1from tensorflow.python.ops.gen_nn_ops import bias_add
と活性化関数(reluとsigmoid)の処理(省略)は結果が一致していましたが、
Python
1from keras.layers.convolutional import Conv2D 2from keras.layers.convolutional import Conv
とは一致していませんでしたので、ここで何かしら教科書的な数式以外の処理が組まれていると推測しています。
▼Kerasのmodel.predict() の数値的な厳密な処理はどのようになっているのか?
▼ソースコードなどの、どのあたりを調べれば分かりそうか?
▼ほかに質問した方が良さそうな、おすすめのサイトは?(英語版のstackoverflowには投稿していますが今のところ返答がありません、、)
この3点について、もしご存じの方いらっしゃいましたら助けて頂けますと大変ありがたいです。
長すぎないようにするためにだいぶ省略しましたので、上記でご不明点等ありましたら遠慮なく仰ってください。
何卒よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー