如何获取Keras模型的运行时批量大小

时间:2018-06-15 10:20:55

标签: keras runtime layer

基于this post。我需要一些基本的实现帮助。下面你会看到我的模型使用Dropout图层。使用noise_shape参数时,最后一批不适合批量大小创建错误(请参阅其他文章)。

原型:

def LSTM_model(X_train,Y_train,dropout,hidden_units,MaskWert,batchsize):
   model = Sequential()
   model.add(Masking(mask_value=MaskWert, input_shape=(X_train.shape[1],X_train.shape[2]) ))
   model.add(Dropout(dropout, noise_shape=(batchsize, 1, X_train.shape[2]) ))   
   model.add(Dense(hidden_units, activation='sigmoid', kernel_constraint=max_norm(max_value=4.) ))   
   model.add(LSTM(hidden_units, return_sequences=True, dropout=dropout, recurrent_dropout=dropout))  

现在,Alexandre Passos建议使用 tf.shape 获取运行时批量大小。我尝试以不同的方式将运行时批量化的想法实现到Keras中但从未工作过。

   import Keras.backend as K

   def backend_shape(x):
       return K.shape(x)

   def LSTM_model(X_train,Y_train,dropout,hidden_units,MaskWert,batchsize):    
       batchsize=backend_shape(X_train)
       model = Sequential()
       ...
       model.add(Dropout(dropout, noise_shape=(batchsize[0], 1, X_train.shape[2]) )) 
       ...  

但是这只是给我输入张量形状而不是运行时输入张量形状。

我也尝试使用Lambda Layer

def output_of_lambda(input_shape):
   return (input_shape)

def LSTM_model_2(X_train,Y_train,dropout,hidden_units,MaskWert,batchsize):       
   model = Sequential()
   model.add(Lambda(output_of_lambda, outputshape=output_of_lambda))
   ...
   model.add(Dropout(dropout, noise_shape=(outputshape[0], 1, X_train.shape[2]) )) 

不同的变种。但正如你已经猜到的那样,根本不起作用。 模型定义实际上是正确的位置吗? 你能给我一个或更好的提示,告诉我如何获得Keras模型的运行批量大小?非常感谢。

1 个答案:

答案 0 :(得分:3)

当前实现确实根据运行时批量大小进行调整。来自Dropout图层实施code

symbolic_shape = K.shape(inputs)
noise_shape = [symbolic_shape[axis] if shape is None else shape
               for axis, shape in enumerate(self.noise_shape)]

因此,如果您给出noise_shape=(None, 1, features),则形状将是(runtime_batchsize,1,features),遵循上述代码。