keras - 模型预测函数和模型 API 函数之间的差异

keras - Difference between model predict function and model API function

我正在尝试从模型中的 SimpleRNN 层获取输出和最终隐藏状态。该模型具有结构:

inp= Input(shape= (input_length,)) 
emb_out= Embedding(input_dim, output_dim, input_length= input_length, 
                         weights= [Emat], trainable= False)(inp)
rnn_out, rnn_state= SimpleRNN(200,  return_state= True)(emb_out)
#out= Dense(1, activation= 'sigmoid')(rnn_out)
model = Model(inputs=inp, outputs=[rnn_out, rnn_state])
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['acc'])
model.summary()

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_7 (InputLayer)         [(None, 1403)]            0         
_________________________________________________________________
embedding_10 (Embedding)     (None, 1403, 100)         4348900   
_________________________________________________________________
simple_rnn_9 (SimpleRNN)     [(None, 200), (None, 200) 60200     
=================================================================


我注意到当我使用模型预测测试数据时输出的形状不同model.predict(xte), 和 model(xte) 当我将测试数据拟合到模型时 API。我需要一些帮助来解释这 2 个操作的区别以及返回的对象所指的内容。

# 1.
all_outs, fin_states= model.predict(xte_pad)
print('Test data shape:', xte_pad.shape)
print(all_outs.shape, fin_states.shape)
>> Test data shape: (2400, 1403)
(2400, 200) (2400, 200)

# 2.
outs= model(xte_pad)
print('Test data shape:', xte_pad.shape)
print(outs.shape)
>> Test data shape: (2400, 1403)
(2400, 1403, 200)

当执行 outs= model(xte_pad) 时,您将得到一个输出列表,并且列表没有 属性 shape。输出实际上是相同的:

import tensorflow as tf

input_length = 1403
inp= tf.keras.layers.Input(shape= (input_length,)) 
emb_out= tf.keras.layers.Embedding(500, 100, input_length= input_length, trainable= False)(inp)
rnn_out, rnn_state= tf.keras.layers.SimpleRNN(200,  return_state= True)(emb_out)

model = tf.keras.Model(inputs=inp, outputs=[rnn_out, rnn_state])
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['acc'])
model.summary()

xte_pad = tf.random.uniform((10, 1403), maxval=500, dtype=tf.int32)
all_outs, fin_states= model.predict(xte_pad)
print('Test data shape:', xte_pad.shape)
print(all_outs.shape, fin_states.shape)


all_outs, fin_states = model(xte_pad)
print('Test data shape:', xte_pad.shape)
print(all_outs.shape, fin_states.shape)
Test data shape: (10, 1403)
(10, 200) (10, 200)
Test data shape: (10, 1403)
(10, 200) (10, 200)