Skip to main content
بلاگ

کاوش اطلاعات سیگنال در مراقبت‌های پزشکی

By آوریل 14, 2023آگوست 20th, 2023No Comments

شناسایی حالات خواب افراد از روی سیگنال‌ها

در این گفتار، به پیاده‌سازی یک نمونه از کاربرد کاوش اطلاعات سیگنال در مراقبت های پزشکی میپردازیم. هدف در این مثال، شناسایی افراد مختلف از روی حالات خواب آن‌ها با استفاده مدل یادگیری عمیق LSTM میباشد. برای این منظور، از مجموعه داده های ارائه شده در مقاله زیر استفاده می کنیم:

https://ieeexplore.ieee.org/document/7897206

همانطور که در متن مقاله کاملا توضیح داده خواهد شد، شناسایی الگوی حالات خواب اهداف مختلف با استفاده از سیگنال Pressure Map مدنظر است. همانطور که در مقاله مرجع اشاره شده است، مجموعه داده اول با مشارکت ۱۳ نفر انجام شده است. اطلاعات این ۱۳ نفر در شکل زیر آمده است:

کاوش اطلاعات سیگنال در مراقبت‌های پزشکی

حالات خواب به سه الگوی استاندارد Right، Supine و  Left تقسیم شده است:

کاوش اطلاعات سیگنال در مراقبت‌های پزشکی

از هر نفر ۲ دقیقه در حالت آرامش کامل دیتا ثبت شده است. همچنین، برای هر نفر اقدام ثبت داده در سه حالت استاندارد خواب Supine، Left و Right دیتا به تفکیک استخراج شده است. در مجموع، برای هر شخص ۱۷ بار دیتا ثبت شده است که شکل زیر تعلق هر یک از ۱۷ رکورد را به ۳ ساحت استاندارد خواب نشان می دهد:

کاوش اطلاعات سیگنال در مراقبت‌های پزشکی

داده‌های این پژوهش، در یک پوشه با عنوان Experiment I ذخیره شده‌اند. درون این پوشه، ۱۳ پوشه با اسامی شکل زیر وجود دارند:

کاوش اطلاعات سیگنال در مراقبت‌های پزشکی

در هر پوشه نیز، سیگنال ثبت شده از هر شخص در هر یک از ۱۷ اقدام انجام شده به صورت یک فایل .txt ذخیره شده است. درون هر فایل .txt سیگنال خام که در واقع یک سیگنال دوبعدی با اندازه 64*32 بوده است، به صورت یک سیگنال 1*2048 ذخیره شده است.

هدف:

شناسایی هر یک از ۱۳ فرد از روی حالات خوابشان در حالت Left (خوابیدن به پهلوی چپ)

روش اجرا در پایتون:

پس از فراخوانی کتابخانه ها و تعریف چند تابع برای کمک به فراخوانی خودکار داده‌ها، آموزش شبکه LSTM با چند لایه و تست شبکه:

# -*- coding: utf-8 -*-
"""
Created on Thu Dec 17 00:04:41 2020

@author:Milad
"""
import os
import numpy as np
from keras.models import Sequential
from keras import layers
from keras.utils import to_categorical
from sklearn.metrics import accuracy_score
from sklearn.metrics import precision_recall_fscore_support
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix
import pylab as pl
from sklearn import preprocessing
########### Functions ###########

defgetFileList(directory = os.path.dirname(os.path.realpath(__file__))):
    list = os.listdir(directory)
    return list

def getModel(x_train, x_validation, train, validation):
    #building a linear stack of layers with the sequential model
model = Sequential()


    #RNN Layer
    model.add(layers.LSTM(20, return_sequences=True, activation='relu', input_shape=(x_train.shape[1], x_train.shape[2])))

    #flatten output of conv
    model.add(layers.Flatten()) #this converts our 3D feature maps to 1D feature vectors
    ##Fully connected layer
    model.add(layers.Dense(128, activation='relu'))
    model.add(layers.Dense(64, activation='sigmoid'))
    model.add(layers.Dense(13, activation='softmax'))

model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
history = model.fit(x_train, train, epochs = 8, verbose = False, validation_data = (x_validation, validation), batch_ )
return model, history

def getPrediction(model, x_train, x_test, train):
    model.evaluate(x_train, train, verbose = False)
    predictions = model.predict(x_test)
    return predictions

ابتدا داده‌ها توسط مسیریابی و خواندن خودکار فایل‌ها از درون پوشه‌ها فراخوانی می‌شوند:

########### Load dataset

Path = 'Experiment I'
Temp1 = getFileList('Experiment I')
Inputs = []
Labels = []
L = -1
for i in range(len(Temp1)):
    L+=1
    temp = getFileList(os.path.join(Path, Temp1[i]))
    for j in [2, 5, 6, 13]:
        Temp2 = np.loadtxt(os.path.join(Path, Temp1[i], Temp[j]))
        for k in range(Temp2.shape[0]):
            Inputs.append(Temp2[k])
            Labels.append(L)

Inputs = np.array(Inputs)
Labels = np.array(Labels)

سپس، در قالب بخش پیش‌پردازش مقادیر عددی سیگنال‌ها به بازه [0,1] نگاشت می‌شوند و در قالب بخش پارتیشن‌بندی، به سه بخش “آموزش”، “اعتبارسنجی” و “تست” تقسیم می‌شوند:

########### Pre-process

# Standardization
min_max_scaler = preprocessing.MinMaxScaler()
Inputs = min_max_scaler.fit_transform(Inputs)

########### Partition data to train and test
X_temp, X_test, y_temp, y_test=train_test_split(Inputs, Labels, test_size=0.2, random_state=42)
X_train, X_validation, y_train, y_validation = train_test_split(X_temp, y_temp, test_size=0.3, random_state=42)

سپس، ابتدا مقادیر خام و دو بعدی سیگنال به صورت چهاربعدی و متناسب با الزامات ورودی شبکه‌های یادگیری عمیق، تغییر شکل داده می‌شوند. سپس، یک شبکه LSTM با ساختار نمایش داده شده در ادامه برای آموزش روی داده‌های آموزش اجرا می‌شود:

########### Create and Train Network

# Reshape data to match with network
X_train = X_train.reshape(X_train.shape[0], 1, X_train.shape[1])
X_validation = X_validation.reshape(X_validation.shape[0], 1, X_validation.shape[1])
X_test = X_test.reshape(X_test.shape[0], 1, X_test.shape[1])
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)
y_validation = to_categorical(y_validation)


#Train
model, history = getModel(X_train, X_validation, y_train, y_validation)
print(model.summary())

در انتها نیز، ابتدا مدل آموزش دیده روی داده‌های تست اعمال شده و پس از آن ابتدا معیارهای ارزیابی دسته‌بندی حساب شده و پس از آن نمودارهای ماتریس درهم‌ریختگی و فرایند تغییرات دقت و loss function در حین آموزش نمایس داده می‌شوند:

########### Test trained Model on test data

Temp1 = getPrediction(model, X_train, X_test, y_train)
Temp1 = np.round(Temp1)

########### Evaluate Results

result1 = precision_recall_fscore_support(y_test, Temp1)
print("Fscore:", result1[2])
print("Precision:", result1[0])
print("Recall:", result1[1])
Accuracy = accuracy_score(y_test, Temp1)
print("Accuracy:", accuracy_score(y_test, Temp1))
Precision = result1[0]
Recall = result1[1]
Fscore = result1[2]
############## Show results

# Loss Curves
plt.figure(figsize=[8,6])
plt.plot(history.history['loss'], 'r',linewidth=3.0)
plt.plot(history.history['val_loss'], 'b',linewidth=3.0)
plt.legend(['Training loss', 'Validation Loss'],fontsize=18)
plt.xlabel('Epochs',fontsize=16)
plt.ylabel('Loss',fontsize=16)
plt.title('Loss Curves',fontsize=16)

# Accuracy Curves
plt.figure(figsize=[8,6])
plt.plot(history.history['acc'], 'r',linewidth=3.0)
plt.plot(history.history['val_acc'], 'b',linewidth=3.0)
plt.legend(['Training Accuracy', 'Validation Accuracy'],fontsize=18)
plt.xlabel('Epochs',fontsize=16)
plt.ylabel('Accuracy',fontsize=16)
plt.title('Accuracy Curves',fontsize=16)

# Confusion Chart
Out_test = [np.argmax(y, axis=None, out=None) for y in Temp1]
Temp2 = y_test
y_test = [np.argmax(y, axis=None, out=None) for y in Temp2]
cm = confusion_matrix(y_test, Out_test)
Print(cm)
pl.matshow(cm)
pl.title('Confusion matrix of the classifier')
pl.colorbar()
pl.show()
کاوش اطلاعات سیگنال در مراقبت‌های پزشکی
کاوش اطلاعات سیگنال در مراقبت‌های پزشکی

مهندس محسن عباسپور

دانشگاه صنعتی آیندهون | متخصص هوش مصنوعی قابل اعتماد | Trustworthy AI

Leave a Reply

Close Menu