7

これが私の問題です。TimeDistributed レイヤーで事前トレーニング CNN ネットワークの 1 つを使用したいと考えています。しかし、私はそれを実装するにはいくつかの問題があります。

これが私のモデルです:

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 は 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 を正しく使用していないと推測していますが、誰もこれをやろうとしているのを見たことはありません。誰かがこれについて私を案内してくれることを願っています。

編集:

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)

しかし、うまくいきません。

4

2 に答える 2