Add Beit model and pretrained weights
Add Beit model and pretrained weights
1、当oneflow版本为0.8.1.dev20220802+cu112时,会报错:
Traceback (most recent call last):
File "/home/deeplearning/wangzheny/vision-beit/train.py", line 16, in <module>
net = ModelCreator.create_model("beit_base_patch16_224", num_classes=10)
File "/home/deeplearning/wangzheny/vision-beit/flowvision/models/registry.py", line 53, in create_model
model = create_fn(pretrained=pretrained, **kwargs)
File "/home/deeplearning/wangzheny/vision-beit/flowvision/models/beit.py", line 411, in beit_base_patch16_224
model = Beit(**model_kwargs)
File "/home/deeplearning/wangzheny/vision-beit/flowvision/models/beit.py", line 290, in __init__
[
File "/home/deeplearning/wangzheny/vision-beit/flowvision/models/beit.py", line 291, in <listcomp>
Block(
File "/home/deeplearning/wangzheny/vision-beit/flowvision/models/beit.py", line 160, in __init__
self.attn = Attention(
File "/home/deeplearning/wangzheny/vision-beit/flowvision/models/beit.py", line 89, in __init__
"relative_position_index", gen_relative_position_index(window_size)
File "/home/deeplearning/wangzheny/vision-beit/flowvision/models/beit.py", line 38, in gen_relative_position_index
relative_coords[:, :, 0] += window_size[0] - 1 # shift to start from 0
File "/home/deeplearning/miniconda3/envs/onetorch/lib/python3.8/site-packages/oneflow/framework/tensor.py", line 132, in _iadd
return self.add_(other)
File "/home/deeplearning/miniconda3/envs/onetorch/lib/python3.8/site-packages/oneflow/framework/tensor.py", line 128, in _add_inplace
return flow._C.add(self, other, alpha=alpha, inplace=True)
RuntimeError: Check failed: (*outputs_)[i] != inputs_[i] || inputs_[i]->is_contiguous() inplace operation is not allowed if input is non-contiguous and non-contiguous is not supported for this operation
修改oneflow版本为0.8.1+cu112.git.506cb3f1即可正常运行。 最小复现代码:
from flowvision.models import ModelCreator
net = ModelCreator.create_model("beit_base_patch16_224", num_classes=10)
2、对beit_base_patch16_224、beit_base_patch16_384、beit_large_patch16_224、beit_large_patch16_384、beit_large_patch16_512进行测试,皆可正常运行。
对beit_base_patch16_224_in22k、beit_large_patch16_224_in22k进行测试,采用预训练时可正常运行。在不采用预训练直接调用模型时,无法直接设置num_classes参数。 最小复现代码:
from flowvision.models import ModelCreator
net = ModelCreator.create_model("beit_base_patch16_224_in22k", num_classes=10)
报错信息:
Traceback (most recent call last):
File "/home/deeplearning/wangzheny/vision-beit/train.py", line 16, in <module>
net = ModelCreator.create_model("beit_base_patch16_224_in22k", num_classes=10)
File "/home/deeplearning/wangzheny/vision-beit/flowvision/models/registry.py", line 53, in create_model
model = create_fn(pretrained=pretrained, **kwargs)
File "/home/deeplearning/wangzheny/vision-beit/flowvision/models/beit.py", line 459, in beit_base_patch16_224_in22k
**kwargs
TypeError: type object got multiple values for keyword argument 'num_classes'
若通过像采用预训练那样修改最后一层head层的输出,可正常运行。
from flowvision.models import ModelCreator
import oneflow as flow
net = ModelCreator.create_model("beit_base_patch16_224_in22k")
num_fc = net.head.in_features
net.head = flow.nn.Linear(in_features=num_fc, out_features=10)
3、还有一点我比较好奇的是,in22k结尾的网络最后一层head的输出为何是21841这么大,即使是预训练之后。(按理说通过imagenet预训练之后最后的输出都是1000类)
(head): Linear(in_features=1024, out_features=21841, bias=True)
修改oneflow版本为0.8.1+cu112.git.506cb3f1即可正常运行。
你是用eager模式跑的吧,因为add op还没支持non-contiguous输入,所以non-contiguous输入的inplace add是不支持的,以前的版本能支持,但计算出来的结果肯定是错的。这个问题正在统一解决中。