テンソルフローで畳み込みNNをトレーニングするために事前トレーニング済みの重みを使用する方法は?

Aug 18 2020

私の実験では、imagenetでcifar10を使用して畳み込みNN(CNN)をトレーニングしたいと思い、を使用しましたResNet50。cifar10は32x32x3の画像セットであるため、224x224x3をResNet50使用します。そのためには、でCNNをトレーニングするために、入力画像のサイズを変更する必要がありimagenetます。しかし、私はCNNimagenetで簡単にトレーニングする試みをフォローアップすることにしました。

私の現在の試み

この要点で私の実装全体をご覧ください:

base_model = ResNet50(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
x = Conv2D(32, (3, 3))(base_model.output)
x = Activation('relu')(x)
x = MaxPooling2D(pool_size=(2,2))(x)
x = Flatten()(x)
x = Dense(256)(x)
x = Dense(10)(x)
x = Activation('softmax')(x)
outputs = x
model = models.Model(base_model.input, outputs)
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X_train, y_train, batch_size=50, epochs=3, verbose=1, validation_data=(X_test, y_test))

しかし、この試みは私に与えましたResourceExhaustedError; 以前にこのエラーが発生し、変更batch_sizeするとエラーが削除されました。しかし、今でも私はbatch_size可能な限り小さく変更しましたが、それでもエラーが発生します。上記のimagenetでCNNをトレーニングする方法が正しくないか、私の試みで何か問題があるのではないかと思います。

更新

事前にトレーニングされた重み(つまり、imagenet上のResNet50)を使用して畳み込みNNをトレーニングする方法を理解したいと思います。これをテンソルフローで実行する方法がわかりません。誰かがこれを正しくするために可能な実行可能なアプローチを提供できますか?ありがとう

誰かが私の試みで何が悪かったのか指摘できますか?CNNimagenetでcifar10を使用して最先端のモデルをトレーニングする正しい方法は何でしょうか?テンソルフローでこれを行うための考えられる考えや効率的な方法を誰かが共有できますか?何か案が?ありがとう!

回答

Deshwal Aug 18 2020 at 10:44

一度にデータ全体にメモリ(RAM)を割り当てようとしているため、このエラーが発生する可能性があります。手始めに、numpy画像を保存するためにarratを使用している可能性があります。その後、それらの画像はに変換されtensorsます。したがって、何かを作成する前でも、すでに2倍のメモリがあります。その上、resnet非常に重いモデルなので、データ全体を一度に渡そうとしています。そのため、モデルはで動作しbatchesます。tf.data.Dataset ドキュメントを使用してジェネレーターを作成するか、非常に簡単なkeras.preprocessing.Image.ImageDataGeneratorクラスを使用してみてください。とても使いやすいです。Datarameクラスを表す別の列を持つ列に画像ファイルのアドレスを保存して、を使用できます.flow_from_directory。またはflow_from_directory、画像をディレクトリに保存している場合に使用できます。

ドキュメントをチェックアウト