ニューラルネットワークPTの使用2

3565 ワード

導入


我々が我々のデータセットをダウンロードした最後の週ブログでは、我々が我々が我々が我々のニューラルネットで使われることができたように我々が我々が使用したメトリックを決定して、我々のイメージをセットアップすることができるように、我々のデータの理解を見つけました.だから今日、私は継続的には、ニューラルネット自体のセットアップを進めていると私はあなたの努力を実行するために永遠にかかることはありません十分に正確かつ効率的な両方のモデルを準備するために私の最も困難を試みる.

バッチとエポック


最後のブログでは、“画像をプリフェッチ”のセクションでは、私は私たちがイメージに行っていたすべての変換について話したが、私は別の重要な機能については、私は値を割り当てていた話を残した.バッチサイズは、我々のモデルにどのように多くの画像を制御します.バッチがモデルに合うたびに、ニューラルネットはそれからそれを各々のノードの重さを調節して、それから次のバッチを走らせます.すべてのバッチの完成はエポックと呼ばれ、モデルがエポックを完成すると、それは新しいバッチにイメージを再編成し、次の時代を開始する.私がこれを持って来る理由は、以前私が偶然に私のバッチサイズを8にセットしたので、それはより少ないエポックでより良い結果を得ます、それは各々を走らせる多くの時間がかかります.それで、我々はBatchchenサイズを64に調整するつもりです.

ネットワークの構築


我々のモデルでは、濃密、畳み込み、バッチ正規化、ドロップアウト層のような2種類の異なるレイヤタイプを使用する.
Keras記述が「ちょうどあなたの規則的に密に接続されたNN層」と言うように、高密度層は神経回路網で最も一般的な層です.密な層は、入力テンソルのドット積と、我々のモデルで特徴とする重みカーネルを取ることによって、特徴間の関連を見つけます.
畳込み層は、像の画素を通過して、像のパターンを見つけるために周辺画素にそれらを比較する.
バッチ正規化は私が理解していない層の1つですが、私は、それが再入力と再入力によってニューラルネットワークをスピードアップすることを知っています.
その後、最終的には、彼らは何のように聞こえる正確に行うドロップアウト層を持って、彼らはオーバーフィックスを防ぐために重みの割合をドロップします.
だから私たちのモデルを定義し、我々の層を追加します.
model = Sequential()
model.add(Conv2D(32, kernel_size = (3, 3), activation='relu', input_shape=(image_size, image_size, 3)))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(BatchNormalization())

model.add(Conv2D(64, kernel_size=(3,3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(BatchNormalization())

model.add(Conv2D(64, kernel_size=(3,3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(BatchNormalization())

model.add(Conv2D(96, kernel_size=(3,3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(BatchNormalization())
model.add(Dropout(.3))

model.add(Conv2D(32, kernel_size=(3,3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(BatchNormalization())
model.add(Dropout(0.4))

model.add(Flatten())
model.add(Dense(128, activation='relu'))
# model.add(Dropout(0.3))
model.add(Dense(1, activation = 'sigmoid'))
あなたが最初に見ることができるように、我々はイメージを通過するために異なるサイズの我々の畳込み層を使っていて、どんなパターンを見るかについてわかって、それから我々が若干の濃い層に投げることができるイメージを平らにして、結局、我々の最後の層だけが一つの出力を持っているので、我々は我々の診断を得ることができます.
そして最後にモデルをまとめることができます.
model.compile(optimizer = 'adam',
              loss='binary_crossentropy',
              metrics=['accuracy',keras.metrics.Recall(name='recall')])
エポックの私達の数を選択し、モデルを実行します.
epochs = 25
steps_per_epoch = train_generator.n // batch_size
validation_steps = test_generator.n // batch_size
history = model.fit(train_generator,
                              steps_per_epoch=steps_per_epoch,
                              epochs=epochs,
                              validation_data=test_generator,
                              validation_steps=validation_steps,
                              class_weight=class_weight)

そして、我々はフィットニューラルネットワークを持っているように!

結論


それで、我々が我々のニューラルネットワークを取り付けたので、我々はmodel.save('pneu_model.h5')を使ってそれを保存することができます、そして、我々はちょうど我々がちょうど合ったものを失うことなく、我々のモデルへの若干の変化を続けることができます.来週私は私たちの精度を取得し、同様にこのシリーズを完了するために探しているリコールを助けるためにいくつかのパラメータを追加するつもりです.