[]戦闘異常な心拍検出 - 使用Keras、K倍クロス次元畳み込みCNNを訓練

AIがYanxisheあるゲーム
目標は、ECGデータは、通常二つのカテゴリーに分け、1 =異常、0 =正常であるかを区別することです。
開くために、データセットをダウンロードした後にptbdb_train.csv187が心電図データである前に発見し、各行7000行になり、最後のものはラベルです。

このタスクは、バイナリ分類タスクであり、データのコンテキストを持つ時系列データであることから、またLSTMを達成するために使用することができる1次元の畳み込みを実現するために考えられますが、LSTMが知っているされていません。

:主に以下のモジュールに分割
データの前処理
モデルを構築する
モデルのトレーニング
モデルのテストを

データの前処理

データ前処理は、前記1.将label转为热向量编码 2. 数据读取2つの部分を

1.符号化ベクトルにサーマルラベル

データラベル、0又は1のラベル値、及び二つの出力によって構築私たちのネットワークの背面に各行対応するので、したがって、我々はoneHot形態に標識します。

# 把标签转成oneHot
def convert2oneHot(index,Lens):
    hot = np.zeros((Lens,))
    hot[int(index)] = 1
    return(hot)
2.データの読み取り

データセクションは、トレーニングデータを含む読み取り、テストデータを使用して、読み出されたyieldデータを生成する方法を。

# 生成数据
def train_gen(df,batch_size = 20,train=True):

    img_list = np.array(df)
    if train:
        steps = math.ceil(img_list.shape[0] / batch_size)    # 确定每轮有多少个batch
    else:
        steps = math.ceil(img_list.shape[0] / batch_size)    # 确定每轮有多少个batch
    while True:
        for i in range(steps):

            batch_list = img_list[i * batch_size : i * batch_size + batch_size]
#             print('batch_list shape is {}'.format(batch_list.shape))
            np.random.shuffle(batch_list)
            batch_x = np.array([file for file in batch_list[:,:-1]])
            batch_y = np.array([convert2oneHot(label,2) for label in batch_list[:,-1]])

            yield batch_x, batch_y

# 生成测试数据
def test_gen(df,batch_size = 20):
    img_list = np.array(df)
    steps = math.ceil(len(img_list) / batch_size)    # 确定每轮有多少个batch
    while True:
        for i in range(steps):
            batch_list = img_list[i * batch_size : i * batch_size + batch_size]
            batch_x = np.array([file for file in batch_list[:,:]])
            print(batch_x.shape)
            yield batch_x

モデル構築

フレームを構築Kerasモデルは、kerasフレームベースSequentialのビルド次のモデルは、ここでそれを使用し、非常に便利な方法です。
時系列データ187のサンプル長。
次のモデルは、ランダム次元コンボリューション、モデルはより良いデータにフィットするようにモデルを調整する必要性から構成されています。

TIME_PERIODS = 187
def build_model(input_shape=(TIME_PERIODS,),num_classes=2):
    model = Sequential()
    model.add(Reshape((TIME_PERIODS, 1), input_shape=input_shape))
    model.add(Conv1D(16, 8,strides=2, activation='relu',input_shape=(TIME_PERIODS,1)))

    model.add(Conv1D(16, 8,strides=2, activation='relu',padding="same"))
#     model.add(MaxPooling1D(2))
    model.add(Conv1D(64, 4,strides=2, activation='relu',padding="same"))
    model.add(Conv1D(64, 4,strides=2, activation='relu',padding="same"))
#     model.add(MaxPooling1D(2))
    model.add(Conv1D(256, 4,strides=2, activation='relu',padding="same"))
    model.add(Conv1D(256, 4,strides=2, activation='relu',padding="same"))
#     model.add(MaxPooling1D(2))
    model.add(Conv1D(512, 2,strides=1, activation='relu',padding="same"))
    model.add(Conv1D(512, 2,strides=1, activation='relu',padding="same"))
#     model.add(MaxPooling1D(2))

    model.add(GlobalAveragePooling1D())
    model.add(Dropout(0.3))
    model.add(Dense(num_classes, activation='softmax'))
    return(model)

モデルのトレーニング

データとビルドより良いモデルを準備した後、モデルを訓練することができます。使用ここではクロストレーニングモデルの方法を。これは、折り目10に分割され、すなわち、トレーニングのためのモデルトレーニングデータのすべての90%を、検証のためにデータの10%。sklearnKFold

data_fath = ['../heartbeat/ptbdb_train.csv', '../heartbeat/ptbdb_test.csv']

train_data = pd.read_csv(data_fath[0], header = None)
train_data_df = pd.DataFrame(train_data)

batch_size = 20
skf = KFold(n_splits=10, random_state=233, shuffle=True)
for flod_idx, (train_idx, val_idx) in enumerate(skf.split(train_data_df, train_data_df)):
    train_data= train_data_df.iloc[train_idx]
    val_data = train_data_df.iloc[val_idx]
    len_train = train_data.shape[0]
    len_val = val_data.shape[0]

    train_iterr = train_gen(train_data, batch_size, True)
    val_iterr = train_gen(val_data, batch_size, False)

    ckpt = keras.callbacks.ModelCheckpoint(
       # 模型保存名字,训练完成会有10个模型文件。
        filepath='best_model_{}.h5'.format(flod_idx),
        monitor='val_loss', save_best_only=True, verbose=1)

    model = build_model()
    # 使用Adam优化器,这里可以更改为其它优化器
    opt = Adam(0.0002)
    model.compile(loss='categorical_crossentropy',
                  optimizer=opt, metrics=['accuracy'])
    print(model.summary())

    model.fit_generator(
        generator=train_iterr,
        steps_per_epoch=len_train // batch_size,
        epochs=100,
        initial_epoch=0,
        validation_data=val_iterr,
        nb_val_samples=len_val // batch_size,
        callbacks=[ckpt],
    )

次のように概略的にプロセスをトレーニング:

Epoch 00001: val_loss improved from inf to 0.36047, saving model to best_model_0.h5
Epoch 2/100
315/315 [==============================] - 3s 11ms/step - loss: 0.4000 - accuracy: 0.8365 - val_loss: 0.3006 - val_accuracy: 0.8700

Epoch 00002: val_loss improved from 0.36047 to 0.30064, saving model to best_model_0.h5
Epoch 3/100
315/315 [==============================] - 3s 11ms/step - loss: 0.3306 - accuracy: 0.8684 - val_loss: 0.2190 - val_accuracy: 0.8771

Epoch 00003: val_loss improved from 0.30064 to 0.21901, saving model to best_model_0.h5
Epoch 4/100
315/315 [==============================] - 3s 9ms/step - loss: 0.2674 - accuracy: 0.8948 - val_loss: 0.1419 - val_accuracy: 0.9014

Epoch 00004: val_loss improved from 0.21901 to 0.14192, saving model to best_model_0.h5
Epoch 5/100
315/315 [==============================] - 4s 13ms/step - loss: 0.2161 - accuracy: 0.9181 - val_loss: 0.1205 - val_accuracy: 0.9271

Epoch 00005: val_loss improved from 0.14192 to 0.12052, saving model to best_model_0.h5
Epoch 6/100
315/315 [==============================] - 4s 11ms/step - loss: 0.1775 - accuracy: 0.9346 - val_loss: 0.1750 - val_accuracy: 0.9257


モデルのテスト

訓練の後、10モデルから10モデルをテストした取得、およびへの出力の統合csvファイル。

batch_size = 20
result =np.zeros(shape=(1000,))
data_fath = ['../heartbeat/ptbdb_train.csv', '../heartbeat/ptbdb_test.csv']
test_data = pd.read_csv(data_fath[1], header = None)
test_data_df = pd.DataFrame(test_data)
# 测试数据生成器
test_iter = test_gen(test_data_df,batch_size = 20)

for i in range(10):
    h5 = './best_model_{}.h5'.format(i)
    model = load_model(h5)
    pres =model.predict_generator(generator=test_iter,steps=math.ceil(1000/batch_size),verbose=1)
    print('pres.shape is {}'.format(pres.shape))
    ohpres = np.argmax(pres,axis=1)
    print('ohpres.shape is {}'.format(ohpres.shape))
    print(type(ohpres))
    result +=  ohpres
    print('result shape is {}'.format(result))

result = [1.0 if result[i]>5 else 0.0 for i in range(len(result))]
df = pd.DataFrame()
df["id"] = np.arange(0,len(ohpres))
df["label"] = result
df.to_csv("submmit.csv",header=None, index=None)

プロセスのすべてOKが、オンライン五十から五虎、としてライン熾烈を設定します。モデル構築は、変更の必要は無理です。
コードのアップロードgithubの終了後、レコードを作ります。
ゲームオーバー!

公開された29元の記事 ウォン称賛12 ビュー10000 +

おすすめ

転載: blog.csdn.net/c2250645962/article/details/103990209