وقتی مدل فکر میکنه هر چیزی شبیه پنومونیه، پس حتماً پنومونیه! 😅 ( تجربه من از یک پروژه مقاله محور)
یه مدت قبل روی پروژهای کار میکردم برای تشخیص پنومونی از روی تصاویر رادیولوژی قفسه سینه.
همهچیز از همون مسیر آشنای پروژههای دیپلرنینگ شروع شد:
دیتاست رو دانلود کردم، تصاویر رو پیشپردازش کردم، مدل رو ساختم و آموزش دادم.
نتایج اولیه هم واقعاً خوب به نظر میرسید.
دقت مدل بالا بود و در نگاه اول میشد گفت: «خب، ظاهراً مدل پنومونی رو خوب یاد گرفته.»
اما اینجا دقیقاً همون جاییه که باید کمی شک کنیم!
چون دقت بالا لزوماً به این معنی نیست که مدل واقعاً خود بیماری رو فهمیده. ممکنه مدل فقط یکسری شباهتهای تصویری رو یاد گرفته باشه.
مثلاً بعضی تغییراتی که در ریهی بیمار مبتلا به پنومونی دیده میشن، ممکنه در بیماریهای دیگه، مثل کووید-۱۹، هم وجود داشته باشن.
در این حالت، وقتی تصویر یک بیمار مبتلا به کووید رو به مدل میدیم، مدل ممکنه بگه:
😌این تصویر شبیه چیزهاییه که قبلاً با برچسب پنومونی دیدم؛ پس احتمالاً پنومونیه!در حالی که واقعیت چیز دیگهایه.
اینجا بود که برای من یک سؤال جدی شکل گرفت:
آیا نباید علاوه بر تصویر، اطلاعات بیشتری از بیمار هم در اختیار مدل بذاریم؟
در دنیای واقعی، پزشک فقط به تصویر نگاه نمیکنه.
سن بیمار، علائم، سابقه بیماری، نتیجه آزمایشها و توضیحات بالینی هم در تصمیمگیری نقش دارن.
پس تصمیم گرفتم ایدهی استفاده از چند نوع داده رو بررسی کنم.
برای این کار رفتم سراغ Functional API در Kerasو یک معماری چندورودی طراحی کردم.
در این معماری، مدل دو نوع اطلاعات دریافت میکنه:
1. تصویر رادیولوژی قفسه سینه
2. اطلاعات بالینی و متنهای مرتبط با بیمار
این اطلاعات متنی میتونن از گزارش رادیولوژی یا فیلدهای متنی موجود در فایلهای DICOM استخراج بشن.
یعنی مدل فقط قرار نیست تصویر رو ببینه؛
بلکه باید بتونه تصویر رو در کنار اطلاعات بالینی تفسیر کنه.
در ادامه، ویژگیهای استخراجشده از تصویر و متن در بخشی از شبکه با هم ترکیب میشن و مدل بر اساس هر دو منبع داده تصمیم نهایی رو میگیره.
ایده ساده است:
اگر تصویر یکسری ویژگیهای شبیه پنومونی داشته باشه، اما اطلاعات بالینی به بیماری دیگهای اشاره کنن، مدل باید بتونه با احتیاط بیشتری تصمیم بگیره؛ نه اینکه صرفاً به خاطر شباهت تصویری، سریع برچسب پنومونی بزنه.
⁉️اما اینجا یک دام خیلی مهم وجود داره:
🚫Data Leakage🚫
اطلاعات متنی همیشه مفید نیستند. اگر داخل متن DICOM مستقیماً نوشته شده باشه که بیمار پنومونی داره، مدل ممکنه به جای یادگیری الگوی واقعی بیماری، فقط جواب رو از روی متن حفظ کنه!
در این حالت، مدل ظاهراً عملکرد فوقالعادهای داره، اما در واقع تقلب کرده 😄
برای همین باید چند نکته رو جدی بررسی کرد:
- آیا این اطلاعات در زمان استفادهی واقعی از مدل هم در دسترس هستند؟
- آیا متن مستقیماً برچسب بیماری را لو میدهد؟
- آیا دادههای آموزش و تست به شکل درستی جدا شدهاند؟
- آیا تصاویر مربوط به یک بیمار، همزمان در آموزش و تست قرار نگرفتهاند؟
- آیا مدل روی بیمارستانها، دستگاهها و دیتاستهای مختلف هم عملکرد قابلقبولی دارد؟
- اگر فقط تصویر را به مدل بدهیم چه نتیجهای میگیریم؟
- اگر فقط اطلاعات متنی را بدهیم چطور؟
- و ترکیب هر دو ورودی واقعاً چقدر بهتر عمل میکند؟
این پروژه برای من یک نکتهی مهم داشت:
در هوش مصنوعی پزشکی، مدل خوب فقط مدلی نیست که Accuracy بالایی دارد.
مدل خوب مدلیه که برای تصمیمش به شواهد درست تکیه کنه.
گاهی برای بهتر کردن مدل لازم نیست فقط شبکه رو بزرگتر کنیم، لایههای بیشتری اضافه کنیم یا تعداد Epochها رو بالا ببریم.
گاهی باید یک قدم عقبتر بریم و از خودمون بپرسیم:
> آیا مدل واقعاً مسئلهی پزشکی رو فهمیده، یا فقط یک میانبُر آماری پیدا کرده؟
استفاده از Functional API در Keras فقط برای وصل کردن چند ورودی به هم نیست. این قابلیت میتونه کمک کنه مدلهایی بسازیم که بیشتر شبیه فرآیند تصمیمگیری واقعی در پزشکی هستند؛ یعنی تصمیمگیری بر اساس ترکیبی از تصویر، علائم، گزارش و اطلاعات بالینی.
چون در پزشکی، هر چیزی که شبیه یک بیماری به نظر میرسه، الزاماً همون بیماری نیست.
✒️تجربه من از پروژه تشخص ۵ نوع ناهنجاری و کلاس های پنومونی در ریه کودکان با یادگیری عمیق
➖➖➖➖➖➖
🔺 @hitwithit
Post #730
1.91K
- ❤ 16
- 🔥 1