Keras: 如何将caffe模型转换为Keras类型?

创建于 2015-05-14  ·  10评论  ·  资料来源: keras-team/keras

大家好,

我想使用 Keras 训练一个 CNN 模型进行分类。 据我所知,有许多公开的预训练 CNN 模型,如 VGG、ImageNet 等。但不幸的是,这些预训练模型是使用其他 CNN 框架生成的,如 caffe 或 cuda-convnet。 我们如何使用这些类型的预训练模型或权重来初始化 Keras 序列模型,然后进行微调训练?

谢谢
吴博士

stale

最有用的评论

我们正在做这件事。 这绝对是我们希望尽快添加的功能之一。 https://github.com/fchollet/keras/issues/100

所有10条评论

我也希望看到一个教程来说明这一点。

我们正在做这件事。 这绝对是我们希望尽快添加的功能之一。 https://github.com/fchollet/keras/issues/100

如果有人仍然感兴趣,您可以使用具有转换模块的 Keras 的这个分支:
https://github.com/MarcBS/keras

最好的,
马克

你好,
我正在尝试您提到的 caffe 到 keras 转换模块,但是当我运行 caffe2keras.py 时出现此错误

未定义全局名称“network_input”

有什么帮助吗?

@dhruvjain如果您指的是这个分支,请在此处打开一个新问题。

此外,如果您可以包含您尝试转换的模型文件,或者至少包含 .prototxt,那将非常有帮助。

我用它来转换caffenet模型,prototxt是这样的:
名称:“咖啡网”

force_backward: 真
输入数据”
input_dim: 1
input_dim: 3
input_dim: 227
input_dim: 227

输入:“标签”
input_dim: 1
input_dim: 1
input_dim: 1
input_dim: 1

层 {
名称:“conv1”
类型:“卷积”
底部:“数据”
顶部:“conv1”
卷积参数{
数字输出:96
内核大小:11
步幅:4
}
}

层 {
名称:“relu1”
类型:“ReLU”
底部:“conv1”
顶部:“conv1”
}
层 {
名称:“池1”
类型:“池化”
底部:“conv1”
顶部:“池1”
pooling_param {
池:最大
内核大小:3
步幅:2
}
}
层 {
名称:“规范1”
类型:“LRN”
底部:“池1”
顶部:“规范1”
lrn_param {
本地大小:5
阿尔法:0.0001
测试版:0.75
}
}
层 {
名称:“conv2”
类型:“卷积”
底部:“规范1”
顶部:“conv2”
卷积参数{
数字输出:256
垫:2
内核大小:5
组:2
}
}
层 {
名称:“relu2”
类型:“ReLU”
底部:“conv2”
顶部:“conv2”
}
层 {
名称:“pool2”
类型:“池化”
底部:“conv2”
顶部:“pool2”
pooling_param {
池:最大
内核大小:3
步幅:2
}
}
层 {
名称:“规范2”
类型:“LRN”
底部:“pool2”
顶部:“规范2”
lrn_param {
本地大小:5
阿尔法:0.0001
测试版:0.75
}
}
层 {
名称:“conv3”
类型:“卷积”
底部:“norm2”
顶部:“conv3”
卷积参数{
数字输出:384
垫:1
内核大小:3
}
}
层 {
名称:“relu3”
类型:“ReLU”
底部:“conv3”
顶部:“conv3”
}
层 {
名称:“conv4”
类型:“卷积”
底部:“conv3”
顶部:“conv4”
卷积参数{
数字输出:384
垫:1
内核大小:3
组:2
}
}
层 {
名称:“relu4”
类型:“ReLU”
底部:“conv4”
顶部:“conv4”
}
层 {
名称:“conv5”
类型:“卷积”
底部:“conv4”
顶部:“conv5”
卷积参数{
数字输出:256
垫:1
内核大小:3
组:2
}
}
层 {
名称:“relu5”
类型:“ReLU”
底部:“conv5”
顶部:“conv5”
}
层 {
名称:“pool5”
类型:“池化”
底部:“conv5”
顶部:“pool5”
pooling_param {
池:最大
内核大小:3
步幅:2
}
}
层 {
名称:“fc6”
类型:“内部产品”
底部:“pool5”
顶部:“fc6”
内部产品参数{
数字输出:4096
}
}
层 {
名称:“relu6”
类型:“ReLU”
底部:“fc6”
顶部:“fc6”
}
层 {
名称:“drop6”
类型:“辍学”
底部:“fc6”
顶部:“fc6”
dropout_param {
dropout_ratio: 0.5
}
}
层 {
名称:“fc7”
类型:“内部产品”
底部:“fc6”
顶部:“fc7”
内部产品参数{
数字输出:4096
}
}

层 {
名称:“relu7”
类型:“ReLU”
底部:“fc7”
顶部:“fc7”
}

层 {
名称:“drop7”
类型:“辍学”
底部:“fc7”
顶部:“fc7”
dropout_param {
dropout_ratio: 0.5
}
}

层 {
名称:“fc8”
类型:“内部产品”
底部:“fc7”
顶部:“fc8”
内部产品参数{
num_output: 1000
}
}

真的是一个重要的功能......

这个 Caffe-to-Keras 重量转换器正是您要找的:

https://github.com/pierluigiferrari/caffe_weight_converter

它将.caffemodel文件转换为.h5重量文件。 它仅转换权重,而不是模型定义,但无论如何,权重确实是您所需要的。

对于任何给定的模型,模型定义要么只需要 Keras 核心库层,在这种情况下在 Keras 中手动编写非常容易,或者模型定义很复杂并且具有自定义层类型,在这种情况下模型定义转换器可能会失败反正。

转换后的新 keras 模型需要什么形状输入? (3,224,224) 还是 (224,224,3)? 因为 caffe 与 (3,224,224) 一起工作,而 keras 与 (224,224,3) 一起工作......

此页面是否有帮助?
0 / 5 - 0 等级