之前发过的文章,运行结果很不理想,经过添加callbak函数后会变好,但是自带的callback函数和不加都不可以,之后使用自定义的callback函数结果才会变好,目前还不知道原因,代码写在最后。
而且训练集和测试集的比例,如果设置2:8就会出现loss=nan的问题,但是设置为8:2就没有问题,我尝试过设置为6:4,但是准确度反而会大幅提升,从0.5-0.7,这是有点违背我的传统观念的,我会进行更多的尝试。
另外,因为我的数据集的格式是CT转CSV,而找到的代码的适用格式是SEQ,如果有人自己运行效果好的话请给我传递好消息,让孩子也沾点喜气。
class TestCallback(keras.callbacks.Callback):
def on_epoch_end(self, epoch, logs={}):
n=0
sum_ppv_9=0.0
sum_sty_9=0.0
sum_mcc_9=0.0
sum_ppv_5=0.0
sum_sty_5=0.0
sum_mcc_5=0.0
namelist=[ i.split(".")[0] for i in os.listdir("./filename") if endswith(".seq")]
for name in namelist:
with open("./filename/%s_all.pkl"%name,'rb') as f:
data=pkl.load(f)
x_test=np.array(data['alnp'])
shapex=x_test.shape
diff=512-shapex[1]
x_test_pad=np.pad(x_test,((0,diff),(0,diff),(0,0)),'constant')
y_pred=self.model.predict(x_test_pad.reshape([1,512,512,shapex[2]]))
y_test=data['pair']
seq=data['seq_f']
l=np.sum(seq>0)
#cutoff 0.9
sum_predict_pair=0.0
TP=0.0
Y_predict=[]
for i in range(l):
for j in range(l):
if y_pred[0,i,j,0]>=0.9 and (j,i) not in Y_predict :
if ((seq[i]==1 and seq[j]==2) or (seq[i]==2 and seq[j]==1) or (seq[i]==3 and seq[j]==4) or
(seq[i]==4 and seq[j]==3) or (seq[i]==2 and seq[j]==4) or (seq[i]==4 and seq[j]==2)) :
sum_predict_pair=sum_predict_pair+1
Y_predict.append((i,j))
if y_test[i,j,0]==1.0 :
TP=TP+1
true_pair=float(np.sum(y_test==1.0))
l=float(l)
TP=float(TP)
FP=float(sum_predict_pair-TP)
FN=float(true_pair/2-TP)
TN=l*(l-1)/2-(TP+FP+FN)
ppv=TP/sum_predict_pair if sum_predict_pair > 0 else 0
sty=TP/(true_pair/2) if true_pair > 0 else 0
mcc=(TP*TN-FP*FN)/math.sqrt((TP+FP)*(FP+TN)*(TN+FN)*(TP+FN)) if sum_predict_pair > 0 else 0
print ('cutoff 0.9: Target: {} Number: {} Testing ppv: {} Testing sty: {} Testing mcc: {}'.format(name,sum_predict_pair,ppv,sty,mcc))
sum_ppv_9=sum_ppv_9+ppv
sum_sty_9=sum_sty_9+sty
sum_mcc_9=sum_mcc_9+mcc
#cutoff 0.5
l=int(l)
sum_predict_pair=0.0
TP=0.0
Y_predict=[]
for i in range(l):
for j in range(l):
if y_pred[0,i,j,0]>=0.5 and (j,i) not in Y_predict :
if ((seq[i]==1 and seq[j]==2) or (seq[i]==2 and seq[j]==1) or (seq[i]==3 and seq[j]==4) or
(seq[i]==4 and seq[j]==3) or (seq[i]==2 and seq[j]==4) or (seq[i]==4 and seq[j]==2)) :
sum_predict_pair=sum_predict_pair+1
Y_predict.append((i,j))
if y_test[i,j,0]==1.0 :
TP=TP+1
true_pair=float(np.sum(y_test==1.0))
l=float(l)
TP=float(TP)
FP=float(sum_predict_pair-TP)
FN=float(true_pair/2-TP)
TN=l*(l-1)/2-(TP+FP+FN)
ppv=TP/sum_predict_pair if sum_predict_pair > 0 else 0
sty=TP/(true_pair/2) if true_pair > 0 else 0
mcc=(TP*TN-FP*FN)/math.sqrt((TP+FP)*(FP+TN)*(TN+FN)*(TP+FN)) if sum_predict_pair > 0 else 0
print ('cutoff 0.5: Target: {} Number: {} Testing ppv: {} Testing sty: {} Testing mcc: {}'.format(name,sum_predict_pair,ppv,sty,mcc))
sum_ppv_5=sum_ppv_5+ppv
sum_sty_5=sum_sty_5+sty
sum_mcc_5=sum_mcc_5+mcc
n=n+1
ave_ppv_9=sum_ppv_9/n
ave_sty_9=sum_sty_9/n
ave_mcc_9=sum_mcc_9/n
ave_ppv_5=sum_ppv_5/n
ave_sty_5=sum_sty_5/n
ave_mcc_5=sum_mcc_5/n
print ('cutoff 0.9: Average ppv: {} Average sty: {} Average mcc: {}'.format(ave_ppv_9,ave_sty_9,ave_mcc_9))
print ('cutoff 0.5: Average ppv: {} Average sty: {} Average mcc: {}'.format(ave_ppv_5,ave_sty_5,ave_mcc_5))



