首页 > 解决方案 > 使用 Keras 中的功能 API 向 GRU 模型添加遮罩层的正确方法?

问题描述

我试图弄清楚如何在 Keras 中使用带有功能 API的掩蔽层。

使用非功能性 Keras 语法,我可以轻松地创建一个 GRU 模型,它可以像这样屏蔽所有零值:

model = tf.keras.Sequential()
model.add( tf.keras.layers.Masking( mask_value = 0.0, input_shape = ( nTimeSteps, nVariables ) ) )
model.add( tf.keras.layers.GRU( 32 ) )
model.add( tf.keras.layers.Dense( 10, activation = "softmax" ) )
opt = tf.keras.optimizers.SGD( learning_rate = 0.001 )
model.compile( loss = 'categorical_crossentropy', optimizer = opt, metrics = ['accuracy'] )

到目前为止,我尝试使用功能 API 复制此模型如下所示:

x = tf.keras.layers.Masking( mask_value = 0.0, input_shape = ( nTimeSteps, nVariables ) )
x = tf.keras.layers.GRU( 32 )( x )
z = tf.keras.layers.Dense( numberOfOutputs, activation = "softmax" )( x )
model = tf.keras.Model( inputs = x, outputs = z )
opt = tf.keras.optimizers.SGD( learning_rate = 0.001 )
model.compile( loss = 'categorical_crossentropy', optimizer = opt, metrics = ['accuracy'] )

但是,它不起作用 - 它会产生以下错误:

AttributeError: 'Masking' object has no attribute 'shape'

将屏蔽层与功能 API 一起使用的正确方法是什么?

标签: pythontensorflowmachine-learningkerasdeep-learning

解决方案


你错过了Input功能 API 格式的层。这是一个虚拟示例

nsamples = 10
nTimeSteps, nVariables = 6, 4
numberOfOutputs = 2
X = np.random.randint(0,6, (nsamples ,nTimeSteps, nVariables))
y = np.random.randint(0,numberOfOutputs, nsamples)

inp = tf.keras.Input(shape = ( nTimeSteps, nVariables ))
x = tf.keras.layers.Masking( mask_value = 0.0 )(inp)
x = tf.keras.layers.GRU( 32 )( x )
z = tf.keras.layers.Dense( numberOfOutputs, activation = "softmax" )( x )

model = tf.keras.Model( inputs = inp, outputs = z )
opt = tf.keras.optimizers.SGD( learning_rate = 0.001 )
model.compile( loss = 'sparse_categorical_crossentropy', 
              optimizer = opt, metrics = ['accuracy'] )

model.fit(X,y, epochs=3)

推荐阅读