Keras Conv1D 用于心电图信号分类

我正在尝试对不同的心电图信号进行分类。我使用了 Keras 的 Conv1D,但结果并不理想。我尝试过更改层数、窗口大小等,但每次运行时预测结果都是同一类别(类别为 0、1、2,所以我的预测输出类似于 [1,1,1,1,1,1,1,1,1,1,1,1,1,1],但每次运行脚本时类别都会变化)。心电图信号是以 1000 点的 numpy 数组形式存在的。

我是否在这方面犯了明显的错误?我原本以为使用几层就能很好地将心电图信号分类成三类。

#arrange and randomize datay1=[[0]]*len(lead1)y2=[[1]]*len(lead2)y3=[[2]]*len(lead3)y=np.concatenate((y1,y2,y3))data=np.concatenate((lead1,lead2,lead3))data = keras.utils.normalize(data)data=np.concatenate((data,y),axis=1)data=np.random.permutation((data))print(data)#separate data and create categoriesXtrain=data[0:130,0:-1]Xtrain=np.reshape(Xtrain,(len(Xtrain),1000,1))Xpred=data[130:,0:-1]Xpred=np.reshape(Xpred,(len(Xpred),1000,1))Ytrain=data[0:130,-1]Yt=to_categorical(Ytrain)Ypred=data[130:,-1]Yp=to_categorical(Ypred)#create CNN modelmodel = Sequential()model.add(Conv1D(20,20,activation='relu',input_shape=(1000,1)))model.add(MaxPooling1D(3))model.add(Conv1D(20,10,activation='relu'))model.add(MaxPooling1D(3))model.add(Conv1D(20,10,activation='relu'))model.add(GlobalAveragePooling1D())model.add(Dense(3,activation='relu',use_bias=False))model.compile(optimizer='adam', loss='categorical_crossentropy',metrics=['accuracy'])model.fit(Xtrain,Yt)#test modelprint(model.evaluate(Xpred,Yp))print(model.predict_classes(Xpred,verbose=1))

回答:

我是否在这方面犯了明显的错误?

确实有:你报告的输出并不令人惊讶,因为你目前在最后一层使用了 ReLU 作为激活函数,这没有任何意义。

在多类别设置中,如你所用,最后一层的激活函数必须是 softmax,而绝对不能是 ReLU;将你的最后一层更改为:

model.add(Dense(3, activation='softmax'))

不太确定你为什么要设置 use_bias=False,但你可以尝试有和没有偏置两种情况,并进行实验…

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注