我有一个问题,我想在TimeDistributed层中使用预训练的CNN网络,但我在实现过程中遇到了一些问题。
这是我的模型:
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类型的参数,但输入1是预训练Resnet中存在的输入2。
为了简单明了,这里是模型摘要。(注意:奇怪的是它没有显示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,并且我发现没有人尝试这样做。我希望有人可以指导我。
编辑:
问题出在
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)
但是它并没有生效。
tf.Session.run
调用中传递给'feed_dict'的内容吗? - drpng[<tf.Tensor 'input_1:0' shape=(?, 179, 224, 224, 3) dtype=float32>, <tf.Tensor 'dense_1_target:0' shape=(?, ?) dtype=float32>, <tf.Tensor 'keras_learning_phase:0' shape=<unknown> dtype=bool>, <tf.Tensor 'dense_1_sample_weights:0' shape=(?,) dtype=float32>]
。ResNet 仍然使用 placeholder 进行定义,但实际上不应该这样做。 - rAyyyResNet50.ResNet50(weights='imagenet', input_tensor=x, include_top=False)
这样的事情,这样在base_model中就没有占位符了,但是我不知道如何在TimeDistributed中实现它。 - rAyyy