栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

补充自定义callbacks函数

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

补充自定义callbacks函数

之前发过的文章,运行结果很不理想,经过添加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))

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/918582.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号