我正在嘗試使用 Keras Tensorflow 編譯和訓練用于回歸的 RNN 模型。我正在使用“功能 API”方式來定義我的模型。
我需要有2 個不同的輸入。第一個 ( input) 是我的訓練資料,它是一個形狀為 (TOTAL_TRAIN_DATA, SEQUENCE_LENGTH, NUM_OF_FEATURES) = (15000,1564,2) 的陣列。為了更清楚,我對 15000 個視頻的每一幀都有 2 個特征。這些視頻最初具有不同數量的幀,因此它們都被填充為具有 SEQUENCE_LENGTH=1564 幀(通過重復最后一行)。第二個輸入 ( lengths) 是一個向量 (15000,),其中包含每個視頻的初始長度。它是這樣的:長度 = [317 215 576 ... 1245 213 654]。
我想要做的是連接 GRU 層輸出中的特征,然后將它們與適當的掩碼相乘,以僅保留與初始視頻長度相對應的特征。更準確地說,GRU 層的輸出具有 (batch_size, SEQUENCE_LENGTH, GRU_UNITS) = (50,1564,256) 的形狀。我已經定義了一個 Flatten() 層,它將 RNN 的輸出重塑為 (50, 1564*256)。所以在這一步中,我想創建一個形狀為 (50,1564*256) 的掩碼陣列。陣列的每一行都將成為對應批次樣本的掩碼。
def mask_creator(lengths,number_of_GRU_features=256,max_pad_len=1564):
masks = np.zeros((lengths.shape[0],number_of_GRU_features*max_pad_len))
for i, length in enumerate(lengths):
masks[i,:] = np.concatenate((np.ones([length * number_of_GRU_features, ]),
np.zeros([(max_pad_len - length) * number_of_GRU_features, ])), axis=0)
return masks
#tf.compat.v1.enable_eager_execution()
#tf.data.experimental.enable_debug_mode()
#tf.config.run_functions_eagerly(True)
GRU_UNITS = 256
SEQUENCE_LENGTH = 1564
NUM_OF_FEATURES = 2
input = tf.keras.layers.Input(shape=(SEQUENCE_LENGTH,NUM_OF_FEATURES))
lengths = tf.keras.layers.Input(shape=())
masks = tf.keras.layers.Lambda(mask_creator, name="mask_function")(lengths)
gru = tf.keras.layers.GRU(GRU_UNITS , return_sequences=True)(input)
flat = tf.keras.layers.Flatten()(gru)
multiplied = tf.keras.layers.Multiply()([flat, masks])
outputs = tf.keras.layers.Dense(7, name="pred")(multiplied )
# Compile
model = tf.keras.Model([input, lengths], outputs, name="RNN")
# optimizer = tf.keras.optimizers.Adam(learning_rate=1e-2)
#Compile keras model
model.compile(optimizer='adam',
loss='mean_squared_error',
metrics=['MeanSquaredError', 'MeanAbsoluteError']),
#run_eagerly=True)
model.summary()
要創建掩碼,我必須以某種方式訪問length??作為輸入引數傳遞給我的 keras 模型 ( lengths = tf.keras.layers.Input(shape=())) 的向量。為此,我考慮定義一個 Lamda 層 ( masks=tf.keras.layers.Lambda(mask_creator, name="mask_function")(lengths)),它呼叫該mask_creator函式來創建蒙版。lengths如果我沒記錯的話,這個變數應該是一個形狀為 (batch_size,)=(50,) 的張量。但是,當我遇到不同型別的錯誤時,我無論如何都無法訪問其中的元素lengths,例如。
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-30-8e31522694ee> in <module>()
9 input = tf.keras.layers.Input(shape=(SEQUENCE_LENGTH,FEATURES))
10 lengths = tf.keras.layers.Input(shape=())
---> 11 masks = tf.keras.layers.Lambda(mask_creator, name="mask_function")(lengths)
12 gru = tf.keras.layers.GRU(GRU_UNITS , return_sequences=True)(input)
13 flat = tf.keras.layers.Flatten()(gru)
1 frames
<ipython-input-19-9490084e8336> in mask_creator(lengths, number_of_GRU_features, max_pad_len)
1 def mask_creator(lengths,number_of_GRU_features=256,max_pad_len=1564):
2
----> 3 masks = np.zeros((lengths.shape[0],number_of_GRU_features*max_pad_len))
4
5 for i, length in enumerate(lengths):
TypeError: Exception encountered when calling layer "mask_function" (type Lambda).
'NoneType' object cannot be interpreted as an integer
Call arguments received:
? inputs=tf.Tensor(shape=(None,), dtype=float32)
? mask=None
? training=None
為什么會這樣,我該如何解決?
uj5u.com熱心網友回復:
嘗試tf僅使用操作:
import tensorflow as tf
@tf.function
def mask_creator(lengths, number_of_GRU_features=256, max_pad_len=1564):
ones = tf.ragged.range(lengths * number_of_GRU_features)* 0 1
zeros = tf.ragged.range((max_pad_len - lengths) * number_of_GRU_features) * 0
masks = tf.concat([ones, zeros], axis=1)
return masks.to_tensor()
lengths = tf.constant([5, 10])
tf.print(mask_creator(lengths).shape, summarize=-1)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/489710.html
