سلام
برای این کار همون ساختارهای LSTM یا بقیه چیزهایی که توی کتابخونه هایی مثل keras هست کافیه و نیاز نیست کد جدیدی بنویسید
تنها کاری که باید بکنید اینه که ورودی رو به فرمی که سلولهای بازگشتی می خوان تبدیل کنید. مثلا توی keras، ورودی باید به فرم (batch_size, timesteps, dimension) باشه
مثلا برای کار شما، خروجی لایه آخر بوده (10,25,25,8) که 10 اندازه batch size ه فرضا
شما باید این تنسور رو reshape کنید به این فرم:
(10,25,25x8) یا (10,25,200)
یعنی کاری که کردیم اینه که هر 25 در 8 رو کردیم یه بردار 200 تایی و چون 25 تا ستون هم داریم پس 25 تا timestep هم داریم
بعدش دیگه می تونید این تنسور رو بدید به بقیه شبکه که مثلا از LSTM تشکیل شده
من بقیه مسالتون رو نمی دونم اما در صورتی که نیازه یه سری عملیات تکراری روی ورودی های مختلف انجام بشه، لایه TimeDistributed هم خیلی به کار میاد و کد رو ساده می کنه
اما تا جایی که توی سوالتون بود با همون reshape کردن مساله حل میشه
یه نکته دیگه هم که توجه داشته باشید اینه که بعضی وقتا استفاده از sequential models توی کراس برای خیلی مدلها کار میده، اما برای کارهایی که پیچیدگی بیشتری داره، بهتره که از functional api یا ترکیب این دو حالت استفاده کنید
برای اینکه بیشتر هم متوجه توضیحات بشید، این چندتا مثال رو ببینید می تونه مفید باشه:
https://github.com/ar-ms/lstm-mnist/blob/master/lstm_classifier.py
https://github.com/jiegzhan/image-classification-rnn/blob/master/train.py
فصل 6 از کتاب Deep learning with Keras هم در مورد کار کردن با شبکه های بازگشتی خیلی می تونه کمکتون کنه
کدهای مربوط به مثال pos tagging هم اینجا هست:
https://github.com/PacktPublishing/Deep-Learning-with-Keras/tree/master/Chapter06
======================================================
import tensorflow as tf
layers = tf.keras.layers
model = tf.keras.models.Sequential()
model.add(layers.Conv2D(32, (3, 3), input_shape=(300, 800,1),padding='same' ))
model.add(layers.Activation('relu'))
model.add(layers.MaxPooling2D(pool_size=(2, 2),padding='same'))
model.add(layers.Dropout(0.2))#3
model.add(layers.Conv2D(32, (3, 3),padding='same'))
model.add(layers.Activation('relu'))
model.add(layers.MaxPooling2D(pool_size=(2, 2),padding='same'))
model.add(layers.Dropout(0.2))#3
model.add(layers.Conv2D(16, (3, 3),padding='same'))
model.add(layers.Activation('relu'))
model.add(layers.MaxPooling2D(pool_size=(2, 2),padding='same'))
model.add(layers.Dropout(0.2))#3
model.add(layers.Conv2D(5, (3, 3),padding='same'))
model.add(layers.Activation('relu'))
model.add(layers.MaxPooling2D(pool_size=(2, 2),padding='same'))
model.add(layers.Dropout(0.2))#3
model.add(layers.Permute((2,1,3)))
model.add(layers.Reshape((50, -1)))
model.add(layers.LSTM(19, return_sequences=False, stateful=False))
# Final Prediction
model.add(layers.Dense(10, activation='softmax'))
model.summary()