Como usar o peso pré-treinado para treinar NN convolucional no tensorflow?

Aug 18 2020

Em meu experimento, quero treinar NN convolucional (CNN) com cifar10 na imagenet e usei ResNet50. Como cifar10 é um conjunto de imagens 32x32x3, enquanto ResNet50usa 224x224x3. Para fazer isso, preciso redimensionar a imagem de entrada para treinar a CNN no imagenet. No entanto, surgiu a seguinte tentativa de treinar simples CNNno imagenet:

minha tentativa atual :

Por favor, veja toda a minha implementação nesta essência :

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))

mas essa tentativa me deu ResourceExhaustedError; Ocorreu esse erro antes e a alteração batch_sizeremoveu o erro. Mas agora até eu mudei batch_sizeo mínimo possível e ainda acabo com o erro. Estou me perguntando se a maneira de treinar a CNN na imagenet acima pode não estar correta ou algo errado em minha tentativa.

atualização :

Eu quero entender como usar pesos pré-treinados (ou seja, ResNet50 na imagenet) para treinar NN convolucional; Não tenho certeza de como fazer isso no tensorflow. Alguém pode fornecer uma possível abordagem viável para acertar isso? Obrigado

Alguém pode me apontar o que deu errado com a minha tentativa? Qual seria a maneira correta de treinar o CNNmodelo de última geração com cifar10 na imagenet? Alguém pode compartilhar pensamentos possíveis ou uma maneira eficiente de fazer isso no tensorflow? Qualquer ideia? Obrigado!

Respostas

Deshwal Aug 18 2020 at 10:44

Você pode estar recebendo este erro porque está tentando alocar a memória (RAM) para todos os dados de uma vez. Para começar, você pode estar usando numpyarrat para armazenar as imagens, então essas imagens estão sendo convertidas para tensors. Então você já tem 2X a memória antes mesmo de criar qualquer coisa. Além disso, resneté um modelo muito pesado, então você está tentando passar todos os dados de uma vez. É por isso que os modelos funcionam com batches. Tente criar um gerador usando a tf.data.Dataset documentação ou use a classe muito fácil keras.preprocessing.Image.ImageDataGenerator. É muito fácil de usar. Você pode salvar o endereço de seus arquivos de imagem na Dataramecoluna com outra coluna representando a classe e usar .flow_from_directory. Ou você pode usar flow_from_directoryse tiver suas imagens salvas no diretório.

Confira a documentação