uhfband/keras2caffeで以下のネットワークがうまく変換できません。

  model.add(InputLayer(input_shape=input_shape))
  model.add(Conv2D(32, kernel_size=(3, 3),use_bias=False))
  model.add(Activation('relu'))
  model.add(Conv2D(64, (3, 3),use_bias=False))
  model.add(Activation('relu'))
  model.add(MaxPooling2D(pool_size=(2, 2)))
  model.add(Dropout(0.25))
  model.add(Flatten())
  model.add(Dense(128))
  model.add(Activation('relu'))
  model.add(Dropout(0.5))
  model.add(Dense(num_classes))
  model.add(Activation('softmax'))

これは、Kerasがchannels_lastであるinput_shape=(224, 224, 3)、Caffeがchannels_firstであるinput_shape=(3, 224, 224)で画像を扱うため、keras2caffeの内部でtransposeしているためです。Flattenは元のベクトルをそのまま1次元に変換するため、channels_lastとchannels_firstが異なると、異なるベクトルに変換され、その後のDenseでのInnerProductで正しくない値になります。

このネットをうまく変換するには、FlattenのDenseでInnnerProductのweightを並び替える必要があります。今回のネットワークでは、パッチワーク的に以下の変換をかけると動作します。

elif layer_type=='Dense':
    caffe_net[name] = L.InnerProduct(caffe_net[outputs[bottom]], 
    	num_output=config['units'], weight_filler=dict(type='xavier'))
    
    if config['use_bias']:
        weight=np.array(blobs[0]).transpose(1, 0)
        print(weight.shape)
        if weight.shape[1]==9216:
            for i in range(128):
                weight[i]=np.array(weight[i].reshape(12,12,64).transpose(2,0,1).reshape(9216))
        net_params[name] = (weight, np.array(blobs[1]))
    else:
        net_params[name] = (blobs[0])


VGG16もFlattenの後にDenseが続く構造なため、同様の変換が必要です。変換を一般化するには、Flattenでlayer.input_shapeを保存しておき、その次のDenseでweightの並び替えを行います。

abars/keras2caffeの該当コミット

他、Keras2caffeはConvの中にactivationを含む場合や、InputLayerが存在しない場合に変換に失敗するため、いくつか修正が必要です。

上記修正は本家にプルリクエストを出してみました。
uhfband/keras2caffe/pull/1

---2018/1/2追記
マージして頂けましたので、最新版ではVGG16が動作します。