在嘗試學習回圈神經網路 (RNN) 時,我正在嘗試使用 3DCNN LSTM 訓練自動唇讀模型。我嘗試了在 Kaggle 上找到的相同代碼。
model = Sequential()
# 1st layer group
model.add(Conv3D(32, (3, 3, 3), strides = 1, input_shape=(22, 100, 100, 1), activation='relu', padding='valid'))
model.add(MaxPooling3D(pool_size=(2, 2, 2), strides=2))
model.add(Conv3D(64, (3, 3, 3), activation='relu', strides=1))
model.add(MaxPooling3D(pool_size=(2, 2, 2), strides=2))
model.add(Conv3D(128, (3, 3, 3), activation='relu', strides=1))
model.add(MaxPooling3D(pool_size=(2, 2, 2), strides=2))
shape = model.get_output_shape_at(0)
model.add(Reshape((shape[-1],shape[1]*shape[2]*shape[3])))
# LSTMS - Recurrent Network Layer
model.add(LSTM(32, return_sequences=True))
model.add(Dropout(.5))
model.add((Flatten()))
# # FC layers group
model.add(Dense(2048, activation='relu'))
model.add(Dropout(.5))
model.add(Dense(1024, activation='relu'))
model.add(Dropout(.5))
model.add(Dense(10, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='Adam', metrics=['accuracy'])
model.summary()
但是,它回傳以下錯誤:
11 model.add(MaxPooling3D(pool_size=(2, 2, 2), strides=2))
12
---> 13 shape = model.get_output_shape_at(0)
14 model.add(Reshape((shape[-1],shape[1]*shape[2]*shape[3])))
15
RuntimeError: The layer sequential_2 has never been called and thus has no defined output shape.
據我了解,我看到代碼的作者試圖獲取第一層的輸出形狀并對其進行重塑,例如轉發到 LSTM 層。找到了一個類似的帖子,之后我進行了以下更改并修復了錯誤。
shape = model.layers[-1].output_shape
# shape = model.get_output_shape_at(0)
我仍然對代碼將輸入從 CNN 層轉發到 LSTM 層的作用感到困惑。任何讓我理解上述內容的幫助表示贊賞。謝謝你!!
uj5u.com熱心網友回復:
當您從上到下傳遞代碼時,輸??入在圖表中從上到下流動,您會收到此錯誤,因為您無法在急切模式下呼叫此函式,因為 Tensorflow 2.0 已完全轉移到急切模式,所以,一旦你適應了這個函式并訓練了 1 個 epoch,你就可以使用 model.get_output_at(0) 否則使用 mode.layers[-1].output。
CNN 層將在本地提取特征,然后 LSTM 將依次提取和學習特征,將 CONV 與 LSTM 結合使用是一種很好的方法,但我建議您直接使用tf.keras.layers.ConvLSTM3D。在這里查看https://www.tensorflow.org/api_docs/python/tf/keras/layers/ConvLSTM3D
tf.keras.backend.clear_session()
model = Sequential()
# 1st layer group
model.add(Conv3D(32, (3, 3, 3), strides = 1, input_shape=(22, 100, 100, 1), activation='relu', padding='valid'))
model.add(MaxPooling3D(pool_size=(2, 2, 2), strides=2))
model.add(Conv3D(64, (3, 3, 3), activation='relu', strides=1))
model.add(MaxPooling3D(pool_size=(2, 2, 2), strides=2))
model.add(Conv3D(128, (3, 3, 3), activation='relu', strides=1))
model.add(MaxPooling3D(pool_size=(2, 2, 2), strides=2))
shape = model.layers[-1].output_shape
model.add(Reshape((shape[-1],shape[1]*shape[2]*shape[3])))
# LSTMS - Recurrent Network Layer
model.add(LSTM(32, return_sequences=True))
model.add(Dropout(.5))
model.add((Flatten()))
# # FC layers group
model.add(Dense(2048, activation='relu'))
model.add(Dropout(.5))
model.add(Dense(1024, activation='relu'))
model.add(Dropout(.5))
model.add(Dense(10, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='Adam', metrics=['accuracy'])
model.summary()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/531229.html
