2016-10-07 23 views
1
私は、私が想定した

Kerasカスタムメトリックは、間違ったテンソル形状

def shape_test(y_true, y_pred): 
    return K.shape(y_pred)[0] 

(Theanoバックエンドを使用して)私自身のカスタムメトリックを定義することにより、y_predの大きさを監視する

を与えるそのカスタムメトリック機能でy_predの次元ミニバッチサイズに等しい。しかし、私は奇妙な出力を取得します。以下の小さな再現可能な例を参照してください。

#imports and definitions 
import numpy 
numpy.random.seed(1234) 
import keras.backend as K 
from keras.models import Sequential 
from keras.layers import Dense 
from keras.optimizers import SGD 

neuron_num=20 
dim_input=2 
#batch size will be important below! 
batch_size=2048 
TT=int(1e4) 

#sample data 
X=numpy.random.randn(TT,dim_input) 
eps=numpy.random.randn(TT) 
Y=0.3*X[:,0]+0.5*X[:,1]+eps 
x={"is":X[:(TT/2),:],"os":X[(TT/2+1):,:]} 
y={"is":Y[:(TT/2)],"os":Y[(TT/2+1):]} 

def shape_test(y_true, y_pred): 
    return K.shape(y_pred)[0] 

上に示したように、これは、今すぐ、簡単なNN

sgd=SGD(lr=1e-2,nesterov=True) 

model=Sequential() 
model.add(Dense(neuron_num, 
       input_dim=x["is"].shape[1], 
       init="glorot_normal", 
       activation="tanh")) 
model.add(Dense(neuron_num,init="glorot_normal",activation="tanh")) 
model.add(Dense(1,init="glorot_normal",activation="linear")) 
model.compile(loss="mean_squared_error", 
       optimizer=sgd, 
       metrics=["mean_squared_error",shape_test]) 

model.fit(x["is"], 
      y["is"], 
      validation_data=(x["os"],y["os"]), 
      nb_epoch=1, 
      batch_size=batch_size, 
      verbose=False).history 

を定義する。これは、私がを見て期待した

#{'loss': [1.834826689338684], 
# 'mean_squared_error': [1.834826689338684], 
# 'shape_test': [1841], 
# 'val_loss': [1.4931119817522769], 
# 'val_mean_squared_error': [1.4931119817522769], 
# 'val_shape_test': [1841.1716343268654]} 

を与えるカスタムメトリックです'shape_test': [1841]の代わりに0、バッチサイズは2048です。

これは非常に奇妙です。これはおそらくバグでしょうか? 私はPython 2.7.6,Keras==1.0.8,Theano==0.8.2とCPUを使用しています。

答えて

1

neuron_num=2000verbose=True使用して、ここで私はあなたの例で生成することができたものです:あなたが見ることができるように

Epoch 1/1 
2048/5000 [========>............] - ETA: 9s - loss: 1.4507 - shape_test: 2048.000 
4096/5000 [=================>...] - ETA: 3s - loss: 1.3577 - shape_test: 2048.000 
5000/5000 [=====================] - 26s - loss: 1.3087 - shape_test: 1841.1648 - val_shape_test: 1841.1716 

は、お使いの形状関数は、正常に動作するようです。しかし、batch_sizeはトレーニングセットのサイズの約数ではないので、最後のバッチには904の例しか含まれていません。私はKerasが1841年にどうやって登場するのか分かりませんが、複雑ではないでしょう。

もう一つは、良く見えるbatch_size=2500てみてください:あなたの助けのための

2500/5000 [==========>..........] - ETA: 9s - loss: 1.4292 - shape_test: 2500.0000 
5000/5000 [=====================] - 24s - loss: 1.3311 - shape_test: 2500.0000 - val_shape_test: 2499.5001 
+0

感謝を!ミニバッチが交換せずに選択されているのを忘れてしまった。はい、904の最後の値はまだ面白いようですが、おそらく重要ではありません。 – cryo111

関連する問題