به بخش پرسش و پاسخ یادگیری عمیق خوش آمدید,
این نسخه آزمایشی سایت است.
لطفا به نکات زیر توجه کنید:
  • برای ارتباط با مدیران میتوانید از صفحه مدیران اقدام کنید.
  • سوال و جواب ها باید به زبان فارسی باشند. استفاده از زبان انگلیسی یا فینگلیش برای پاسخ دادن مجاز نیست.
  • لطفا بعد از پرسش سوال لینک سوال خود را در گرو تلگرام (Iran Deep Learning Group) معرفی کنید تا سریعتر به جواب برسید. برای دسترسی به آخرین لینک از منابع یادگیری استفاده کنید
  • لطفا بجای عکس از متن استفاده کنید. اگر متون طولانی هستند از سایت pastebin.com برای اپلود استفاده کرده و لینک حاصل را در سوال خود قرار دهید. برای قرار دادن تصویر ، از بخش ارسال تصویر ادیتور سایت استفاده کنید.
  • بعد از دریافت پاسخ، بهترین پاسخ را از طریق کلیک بر روی علامت تیک انتخاب کنید
  • اگر با خطا و یا مشکلی مواجه شدید از بخش تماس با ما در انتهای صفحه و یا ایمیل Coderx7@gmail.com موضوع را اطلاع دهید.

با تشکر

دسته بندی ها

0 امتیاز

سلام
میخوام به جای استفاده از لایه FC و استفاده از dense
یه چیزی مثل LSTM اجرا بشه با این تفاوت که از سمت چپ بیاد روی feature map شروع کنه ستون ستون داده هارو بررسی کنه نتیجه رو نگه داره یه ستون بره سمت راست دوباره و.... تا تموم بشه
مثلا لایه آخر conv2d اگر 25 در 25 در 8 هست هر بار 25 در 8 ورودی رو بررسی کنه و نتیجه رو پاس بده به 25 در 8 بعدی ....
از چه تابعی تو کراس و یا چه ساختاری میشه این عمل رو پیاده کرد ؟
با تشکر

توسط (208 امتیاز)
ویرایش شده توسط

1 پاسخ

+3 امتیاز
 
بهترین پاسخ

سلام
برای این کار همون ساختارهای 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()
توسط (1.6k امتیاز)
ویرایش شده توسط
ممنونم از پاسختون
منظورتون از عملیات تکراری چیه ؟ که باید از TimeDistributed  استفاده کرد ؟
ممنون میشم راهنمایی کنید مثلا تو مدل زیر چطور لایه ی آخر رو جوری reshape کنم که از سمت چپ ستونی بشه داد به lstm
اینجا میخوام 19در5 باشه ورودی lstm
ترتیب ورودی همون طور که میخواستم هست الان یعنی از چپ به راست تصویر رو میده لایه lstm (دستور reshape ام درسته) ؟
خطا میده که 4 بعد داری میدی، چطور 4 بعد رو بدم به lstm که سه بعد میخواد ؟

from keras import regularizers
from keras.models import Sequential,Model
from keras.layers import Conv2D, MaxPooling2D,BatchNormalization,Conv3D,LSTM
from keras.layers import Activation, Dropout, Flatten, Dense,TimeDistributed,Bidirectional,LSTM,Reshape,TimeDistributed

#60
model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape=(300, 800,1),padding='same' ))#,kernel_initializer='lecun_normal'
model.add(Activation('relu'))
#model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2),padding='same'))
model.add(Dropout(0.2))#3

model.add(Conv2D(32, (3, 3),padding='same'))
model.add(Activation('relu'))
#model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2),padding='same'))
model.add(Dropout(0.2))#3

model.add(Conv2D(16, (3, 3),padding='same'))
model.add(Activation('relu'))
#model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2),padding='same'))
model.add(Dropout(0.2))#3

model.add(Conv2D(5, (3, 3),padding='same'))
model.add(Activation('relu'))
#model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2),padding='same'))
model.add( (Dropout(0.2)))#3

model.add(Reshape((-1,19, 5)))

model.add(LSTM(19, input_shape=(19, 5), return_sequences=False, stateful=False))

model.summary()
با تشکر
سلام
خواهش میکنم
من متوجه قسمت آخر کدتون نشدم. مگه قرار نبود شما به صورت ستونی که هر ستون هم خودش چندتا کانال داره تصویر رو بدید به lstm ؟
یعنی مثلا الان شما feature map هایی دارید که 50 تا ستون داره (یعنی 50 تا timestep) و 19 تا سطر و 5 تا کانال که باید با هم ترکیب بشن و میشه 95 تا عنصر
من فعلا با همین فرض کدتون رو تغییر دادم و آخر جوابم رو آپدیت کردم
فرض هم کردم که شما مثلا می خواید کلاس تصویر رو مشخص کنید که مساله هم 10 کلاسه بوده، مثل mnist
اما اگه بخواید توی هر step خروجی داشته باشید باید از TimeDistributed استفاده کنید و return_sequence هم True باشه
در مورد عملیات تکراری و TimeDistributed مثلا فرض کنید قرار بود برای هر پیکسل، یه label بزنید و مثلا semantic segmentation کنید
حالا باید برای هر پیکسلی که به RNN می دادید یه خروجی هم می داشتید، که برای مثال از طریق یه softmax بدست میومد. اینکه یه لایه softmax رو هر دفعه رو خروجی RNN توی استپ های مختلف اعمال کنید رو میشه با TimeDistributed انجام داد
یا یه مثال معروف دیگه فرض کنید قرار بود از فریم های یه فیلم با CNN بردار feature در بیارید. اینکه یه شبکه رو روی هر فریم اعمال کنید یه کار تکراری بود که بازم میشه با TimeDistributed خیلی راحت انجامش داد
اینایی که گفتم مثال های استفاده از TimeDistributed بود و برای اینکه استفادش براتون جا بیوفته وگرنه خیلی جاهای دیگه هم میشه استفاده کرد و کد رو خیلی تر و تمیز می کنه
سپاس
1- سوال چرا تنسور رو صدا زدین بعد کراس رو از اون آوردین
اینجوری سریع تره به نسبت وقتی که کراس رو مستقیم ایمپورت میکنیم ؟!

2- تو صورت سوال نشون دادم که خروجی رو باید یادش باشه برای ستون بعدی
پس اینجوری باید بدم ؟
model.add(layers.TimeDistributed(layers.LSTM(19, return_sequences=True, stateful=False)))
1- آهان، نه، الان من keras رو به طور جدا نصب ندارم روی این سیستم و فقط tensorflow نصبه، برای همین از keras داخل tensorflow استفاده کردم. شما مستقیم از keras استفاده کنید هم درسته

2-خروجی منظورتون دقیقا چیه؟ اگه تاثیر گامهای قبلی ، خود به خود توی hidden state ه lstm اطلاعات هست، اما اگه نیازه که برای هر ستون از feature map یه خروجی داده بشه بحث فرق می کنه
الان کدی که هست بر این اساسه که شما همه ستون ها رو بررسی می کنید و در نهایت یه خروجی قراره برای تصویر بدست بیارید. وقتی این موضوع رو مشخص کردید که برای هر گام خروجی دارید(مثلا طبقه بندی هر ستون) یا در نهایت باید خروجی بدست بیاد مشخص میشه که شما return sequence و TimeDistributed می خواید یا نه
...