Voici mon problème, je veux utiliser l'un des pré-réseau CNN dans un calque TimeDistributed. Mais j'ai un problème pour l'implémenter.Keras pretrain CNN avec TimeDistributed
Voici mon modèle:
def bnn_model(max_len):
# sequence length and resnet input size
x = Input(shape=(maxlen, 224, 224, 3))
base_model = ResNet50.ResNet50(weights='imagenet', include_top=False)
for layer in base_model.layers:
layer.trainable = False
som = TimeDistributed(base_model)(x)
#the ouput of the model is [1, 1, 2048], need to squeeze
som = Lambda(lambda x: K.squeeze(K.squeeze(x,2),2))(som)
bnn = Bidirectional(LSTM(300))(som)
bnn = Dropout(0.5)(bnn)
pred = Dense(1, activation='sigmoid')(bnn)
model = Model(input=x, output=pred)
model.compile(optimizer=Adam(lr=1.0e-5), loss="mse", metrics=["accuracy"])
return model
Lors de la compilation du modèle que j'ai aucune erreur. Mais quand je commence une formation que je reçois l'erreur suivante:
tensorflow/core/framework/op_kernel.cc:975] Invalid argument: You must feed a value for placeholder tensor 'input_2' with dtype float
[[Node: input_2 = Placeholder[dtype=DT_FLOAT, shape=[], _device="/job:localhost/replica:0/task:0/gpu:0"]()]]
J'ai vérifié et je fais envoyer float32 mais pour INPUT1, INPUT2 est l'entrée présente dans le Resnet de pretrain.
Juste pour avoir un aperçu, voici le résumé du modèle. (Note: il est étrange que cela ne montre pas ce qui se passe à l'intérieur Resnet mais jamais l'esprit)
____________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
====================================================================================================
input_1 (InputLayer) (None, 179, 224, 224, 0
____________________________________________________________________________________________________
timedistributed_1 (TimeDistribut (None, 179, 1, 1, 204 23587712 input_1[0][0]
____________________________________________________________________________________________________
lambda_1 (Lambda) (None, 179, 2048) 0 timedistributed_1[0][0]
____________________________________________________________________________________________________
bidirectional_1 (Bidirectional) (None, 600) 5637600 lambda_1[0][0]
____________________________________________________________________________________________________
dropout_1 (Dropout) (None, 600) 0 bidirectional_1[0][0]
____________________________________________________________________________________________________
dense_1 (Dense) (None, 1) 601 dropout_1[0][0]
====================================================================================================
Total params: 29,225,913
Trainable params: 5,638,201
Non-trainable params: 23,587,712
____________________________________________________________________________________________________
Je suppose que je ne l'utilise correctement TimeDistributed et j'ai vu personne d'essayer de le faire. J'espère que quelqu'un peut me guider à ce sujet.
EDIT:
Le problème provient du fait que ResNet50.ResNet50(weights='imagenet', include_top=False)
créer sa propre entrée dans le graphique.
Donc je suppose que je dois faire quelque chose comme ResNet50.ResNet50(weights='imagenet', input_tensor=x, include_top=False)
mais je ne vois pas comment le coupler avec TimeDistributed
.
J'ai essayé
base_model = Lambda(lambda x : ResNet50.ResNet50(weights='imagenet', input_tensor=x, include_top=False))
som = TimeDistributed(base_model)(in_ten)
Mais il ne fonctionne pas.
Il semble demander une valeur flottante pour l'espace réservé. Pourriez-vous retracer ce qui est passé à 'feed_dict' dans l'appel' tf.Session.run'? – drpng
Dans ** tensorflow_backend.py ** J'ai imprimé le feed_dict et j'ai obtenu ce '[, , dtype = bool>, ] '. Le ResNet est toujours défini avec un espace réservé alors qu'il ne le devrait pas. –
rAyyy
Je suis sûr que je devrais faire quelque chose comme 'ResNet50.ResNet50 (poids = 'imagenet', input_tensor = x, include_top = False)' donc il n'y a pas d'espace réservé dans le modèle base_model mais je ne vois pas comment le faire avec TimeDistributed. – rAyyy