2017-02-18 26 views
2

Вот моя проблема, я хочу использовать одну из презервативной сети CNN в слое TimeDistributed. Но у меня есть некоторые проблемы для его реализации.Keras prerain CNN с TimeDistributed

Вот моя модель:

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 

При составлении модели у меня нет ошибки. Но когда я начала тренировки я получаю следующее сообщение об ошибке:

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"]()]] 

я проверил и я отправить float32, но для input1, input2 является входом присутствует в pretrain RESNET.

Просто чтобы получить обзор, приведено резюме модели. (Примечание: это странно, что он не показывает, что произойдет внутри RESNET, но никогда не возражаю)

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

Я предполагаю, что я не использую TimeDistributed правильно, и я не видел никого, пытаясь сделать это. Надеюсь, кто-то может направить меня на это.

EDIT:

Проблема возникает из-за того, что ResNet50.ResNet50(weights='imagenet', include_top=False) создать свой собственный вход в графике.

Так что, я думаю, мне нужно сделать что-то вроде ResNet50.ResNet50(weights='imagenet', input_tensor=x, include_top=False), но я не вижу, как связать его с TimeDistributed.

Я попытался

base_model = Lambda(lambda x : ResNet50.ResNet50(weights='imagenet', input_tensor=x, include_top=False)) 
som = TimeDistributed(base_model)(in_ten) 

Но это не работает.

+0

Кажется, что запрашивается значение поплавка для заполнителя. Не могли бы вы проследить, что передано 'feed_dict' в вызове' tf.Session.run'? – drpng

+0

В ** tensorflow_backend.py ** Я напечатал feed_dict, и я получил это '[, , dtype = bool>, ] '. ResNet по-прежнему определяется с помощью заполнителя, если он не должен. – rAyyy

+0

Я уверен, что я должен сделать что-то вроде 'ResNet50.ResNet50 (weights = 'imagenet', input_tensor = x, include_top = False)' поэтому в base_model нет placeholder, но я не вижу, как это сделать с TimeDistributed. – rAyyy

ответ

1

Мое быстрое решение немного уродливое.

Я только что скопировал код ResNet и добавил TimeDistributed для всех слоев, а затем загрузил весы из «базового» ResNet на моем настроенном ResNet.

Примечание:

Чтобы иметь возможность анализировать последовательность изображений, как это займет огромное количество памяти на GPU.

+0

На самом деле - нет другого способа: <Ваше решение в настоящее время является максимально возможным. –