Como usar o peso pré-treinado para treinar NN convolucional no tensorflow?
Em meu experimento, quero treinar NN convolucional (CNN) com cifar10 na imagenet e usei ResNet50
. Como cifar10 é um conjunto de imagens 32x32x3, enquanto ResNet50
usa 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 CNN
no 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_size
removeu o erro. Mas agora até eu mudei batch_size
o 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 CNN
modelo 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
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 numpy
arrat 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 Datarame
coluna com outra coluna representando a classe e usar .flow_from_directory
. Ou você pode usar flow_from_directory
se tiver suas imagens salvas no diretório.
Confira a documentação