python - 将 Keras 中 VGG19 的部分层与 TimeDistributed 层一起使用
问题描述
我想使用经过训练的 VGG19 模型的前 9 层与 TimeDistributed 层相结合。但我得到一个 InvalidArgumentError。
def build_vgg(in_shape):
vgg = VGG19(weights="imagenet")
vgg.outputs = [vgg.layers[9].output]
img = keras.Input(in_shape)
img_features = vgg(img)
return keras.Model(img, img_features)
vggmodel = build_vgg((50,50,3))
input_layer = keras.Input(batch_shape=(10,10,50,50,3))
h2 = keras.layers.wrappers.TimeDistributed(vggmodel)(input_layer)
model = keras.Model(input_layer,h2)
model.summary()
我收到此错误:
InvalidArgumentError Traceback (most recent call last)
~/.conda/envs/py3/lib/python3.6/site-packages/tensorflow/python/framework/ops.py in _create_c_op(graph, node_def, inputs, control_inputs)
1566 try:
-> 1567 c_op = c_api.TF_FinishOperation(op_desc)
1568 except errors.InvalidArgumentError as e:
InvalidArgumentError: Dimensions must be equal, but are 512 and 25088 for 'time_distributed_1/vgg19/fc1/MatMul' (op: 'MatMul') with input shapes: [10,512], [25088,4096].
解决方案
首先,您的模型不应在build_vgg
. 你应该只取你想要的张量。
其次,您应该使用兼容的输入形状。
第三,如果要更改输入形状并加载 imagenet 权重,则不能包含 top :
def build_vgg(in_shape):
vgg = VGG19(weights="imagenet", input_shape= in_shape, include_top = False)
outputs = vgg.layers[9].output
return keras.Model(vgg.input, outputs)
然后剩下的
vggmodel = build_vgg((50,50,3))
#vggmodel.summary()
input_layer = keras.Input(batch_shape=(10,10,50,50,3))
h2 = keras.layers.wrappers.TimeDistributed(vggmodel)(input_layer)
model = keras.Model(input_layer,h2)
model.summary()
model.predict(np.ones((10,10,50,50,3)))
推荐阅读
- csv - 通过 Zapier 将多选值从 typeform 传递到 Salesforce
- javascript - 为什么即使没有使用数组排序方法分配数组也会反转?
- python - Django 1.10 - 每 X 秒使用数据库中的数据更新网页
- performance - SSD 性能参数 - 延迟与 IOPS?
- javascript - textarea.append() 在手动输入后停止工作
- java - 列出具有预定义大小或没有大小的可变参数
- android - 从一个 android 应用程序向另一个应用程序连续发送数据
- python - 通配符错误 - “无效选项”
- batch-file - 基于模式匹配的批处理文件中的舒适程序执行作为一个衬垫
- docker - Docker - 在 $PATH 中找不到可执行文件