def convertDCM(PathDCM) :
data = []
for dirName, subdir, files in os.walk(PathDCM):
for filename in sorted(files):
ds = pydicom.dcmread(PathDCM +'/' + filename)
im = fromarray(ds.pixel_array)
im = keras.preprocessing.image.img_to_array(im)
im = cv2.resize(im,(300,300))
data.append(im)
return data
PathDCM = '/home/Desktop/FULL_BALANCED_BW/'
data = convertDCM(PathDCM)
class_names = ['Normal','Abnormal'] #Normal = 0, Abnormal = 1
read = pd.read_excel('/home/FULL_REDUCED_BALANCED_DATA.xlsx')
labels = read.iloc[:,2].tolist()
#scale the raw pixel intensities to the range [0,1]
data = np.array(data, dtype = "float")/255.0
labels = np.array(labels,dtype = "uint8")
#splitting data into training and testing
(trainX, testX, trainY, testY) = train_test_split(
data,labels,
test_size=0.2,
random_state=42)
img_width, img_height = 300, 300 #InceptionV3 size
train_samples = 1000
validation_samples = 200
epochs = 10
batch_size = 32
base_model = keras.applications.InceptionV3(
weights ='imagenet',
include_top=False,
input_shape = (img_width,img_height,3))
#Classifier Model ontop of Convolutional Model
model_top = keras.models.Sequential()
model_top.add(keras.layers.GlobalAveragePooling2D(input_shape=base_model.output_shape[1:], data_format=None)),
model_top.add(keras.layers.Dense(450,activation='relu'))
model_top.add(keras.layers.Dropout(0.5))
model_top.add(keras.layers.Dense(1,activation = 'sigmoid'))
model = keras.models.Model(inputs = base_model.input, outputs = model_top(base_model.output))
#Compiling model using Adam Optimizer
model.compile(optimizer = keras.optimizers.Adam(
lr=0.00002,
beta_1=0.9,
beta_2=0.999,
epsilon=1e-08),
loss='binary_crossentropy',
metrics=['accuracy'])
#Image Processing and Augmentation
train_datagen = keras.preprocessing.image.ImageDataGenerator(
zoom_range = 0.1,
width_shift_range = 0.2,
height_shift_range = 0.2,
horizontal_flip = True,
fill_mode ='nearest')
val_datagen = keras.preprocessing.image.ImageDataGenerator()
train_generator = train_datagen.flow(
trainX,
trainY,
batch_size=batch_size,
shuffle=True)
validation_generator = val_datagen.flow(
testX,
testY,
batch_size=batch_size)
#Training the model
history = model.fit_generator(
train_generator,
steps_per_epoch = train_samples//batch_size,
epochs = epochs,
validation_data = validation_generator,
validation_steps = validation_samples//batch_size)
При прогнозировании вероятностей для двух классов я использую:
testX= convertDCM('home/Desktop/NewData')
testX = np.array(testX, dtype = "float")/255.0
predictions= model.predict(testX)
print(predictions)
И верните этот массив:
[[0.6151286 ]
[0.5269037 ]
[0.6088796 ]
[0.55031174]]
Поскольку у меня только два класса, является ли возвращаемое число вероятностью того, что оно принадлежит первому классу? Что означает класс в элементе 0 (нормальный)? Итак, согласно этому мышлению, значение меньше 0,5 считается нормальным, а значение больше 0,5 - ненормальным?
Это действительно вопрос интерпретации. Не видя кода, вы, вероятно, получаете вероятность принадлежности тестового образца к ненормальному случаю, а 1-p_normal
- это вероятность другого класса. У вас не получается хорошее разделение между двумя классами всего на уровне ~ 0,6, но этого может быть достаточно для вашего конкретного случая, и здесь возникает интерпретация. Это очень широкий вопрос.
Я обновил сообщение, добавив в него свой код.
Возвращенное число - это вероятность предсказания положительного класса (кодируется как 1). В вашем случае это, вероятно, класс Abnormal
(это зависит от того, как точно закодированы ваши данные). Вы можете преобразовать предсказанные вероятности в двоичные значения, вызвав:
(predictions > 0.5).astype(int)
Четыре числа соответствуют четырем входным параметрам модели.
Каждое число закодировано так же, как и цель во время тренировки (trainY). Если класс 1 был закодирован как целевой 0
, а класс 2 был закодирован как 1
, то вы можете интерпретировать выходное значение 0.6
как вероятность 0,6, что это класс 2.
Обратите внимание, что в производственной среде вы можете увидеть следующие случаи, с которыми вы не можете справиться:
что такое textX? какая модель?