Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
chenpangpang
transformers
Commits
2ebf4e6a
Unverified
Commit
2ebf4e6a
authored
Oct 21, 2022
by
Davi Alves
Committed by
GitHub
Oct 21, 2022
Browse files
[ custom_models.mdx ] - Translated to Portuguese the custom models tutorial. (#19779)
parent
c1f009ad
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
353 additions
and
0 deletions
+353
-0
docs/source/pt/_toctree.yml
docs/source/pt/_toctree.yml
+2
-0
docs/source/pt/custom_models.mdx
docs/source/pt/custom_models.mdx
+351
-0
No files found.
docs/source/pt/_toctree.yml
View file @
2ebf4e6a
...
...
@@ -19,6 +19,8 @@
title
:
Usando os Tokenizers do 🤗 Tokenizers
-
local
:
create_a_model
title
:
Criando uma arquitetura customizada
-
local
:
custom_models
title
:
Compartilhando modelos customizados
-
sections
:
-
local
:
tasks/sequence_classification
title
:
Classificação de texto
...
...
docs/source/pt/custom_models.mdx
0 → 100644
View file @
2ebf4e6a
<
!--Copyright 2020 The HuggingFace Team. All rights reserved.
Licensed
under
the
Apache
License
,
Version
2.0
(
the
"License"
);
you
may
not
use
this
file
except
in
compliance
with
the
License
.
You
may
obtain
a
copy
of
the
License
at
http
://
www
.
apache
.
org
/
licenses
/
LICENSE
-
2.0
Unless
required
by
applicable
law
or
agreed
to
in
writing
,
software
distributed
under
the
License
is
distributed
on
an
"AS IS"
BASIS
,
WITHOUT
WARRANTIES
OR
CONDITIONS
OF
ANY
KIND
,
either
express
or
implied
.
See
the
License
for
the
specific
language
governing
permissions
and
limitations
under
the
License
.
-->
#
Compartilhando
modelos
customizados
A
biblioteca
🤗
Transformers
foi
projetada
para
ser
facilmente
extens
í
vel
.
Cada
modelo
é
totalmente
codificado
em
uma
determinada
subpasta
do
reposit
ó
rio
sem
abstra
çã
o
,
para
que
voc
ê
possa
copiar
facilmente
um
arquivo
de
modelagem
e
ajust
á
-
lo
à
s
suas
necessidades
.
Se
voc
ê
estiver
escrevendo
um
modelo
totalmente
novo
,
pode
ser
mais
f
á
cil
come
ç
ar
do
zero
.
Neste
tutorial
,
mostraremos
como
escrever
um
modelo
customizado
e
sua
configura
çã
o
para
que
possa
ser
usado
com
Transformers
,
e
como
voc
ê
pode
compartilh
á
-
lo
com
a
comunidade
(
com
o
c
ó
digo
em
que
se
baseia
)
para
que
qualquer
pessoa
possa
us
á
-
lo
,
mesmo
se
n
ã
o
estiver
presente
na
biblioteca
🤗
Transformers
.
Ilustraremos
tudo
isso
em
um
modelo
ResNet
,
envolvendo
a
classe
ResNet
do
[
biblioteca
timm
](
https
://
github
.
com
/
rwightman
/
pytorch
-
image
-
models
/
tree
/
master
/
timm
)
em
um
[`
PreTrainedModel
`].
##
Escrevendo
uma
configura
çã
o
customizada
Antes
de
mergulharmos
no
modelo
,
vamos
primeiro
escrever
sua
configura
çã
o
.
A
configura
çã
o
de
um
modelo
é
um
objeto
que
ter
á
todas
as
informa
çõ
es
necess
á
rias
para
construir
o
modelo
.
Como
veremos
na
pr
ó
xima
se
çã
o
,
o
modelo
s
ó
pode
ter
um
`
config
`
para
ser
inicializado
,
ent
ã
o
realmente
precisamos
que
esse
objeto
seja
o
mais
completo
poss
í
vel
.
Em
nosso
exemplo
,
pegaremos
alguns
argumentos
da
classe
ResNet
que
podemos
querer
ajustar
.
Diferentes
configura
çõ
es
nos
dar
á
os
diferentes
tipos
de
ResNets
que
s
ã
o
poss
í
veis
.
Em
seguida
,
apenas
armazenamos
esses
argumentos
,
ap
ó
s
verificar
a
validade
de
alguns
deles
.
```
python
from
transformers
import
PretrainedConfig
from
typing
import
List
class
ResnetConfig
(
PretrainedConfig
):
model_type
=
"resnet"
def
__init__
(
self
,
block_type
=
"bottleneck"
,
layers
:
List
[
int
]
=
[
3
,
4
,
6
,
3
],
num_classes
:
int
=
1000
,
input_channels
:
int
=
3
,
cardinality
:
int
=
1
,
base_width
:
int
=
64
,
stem_width
:
int
=
64
,
stem_type
:
str
=
""
,
avg_down
:
bool
=
False
,
**
kwargs
,
):
if
block_type
not
in
[
"basic"
,
"bottleneck"
]:
raise
ValueError
(
f
"`block` must be 'basic' or bottleneck', got {block}."
)
if
stem_type
not
in
[
""
,
"deep"
,
"deep-tiered"
]:
raise
ValueError
(
f
"`stem_type` must be '', 'deep' or 'deep-tiered', got {block}."
)
self
.
block_type
=
block_type
self
.
layers
=
layers
self
.
num_classes
=
num_classes
self
.
input_channels
=
input_channels
self
.
cardinality
=
cardinality
self
.
base_width
=
base_width
self
.
stem_width
=
stem_width
self
.
stem_type
=
stem_type
self
.
avg_down
=
avg_down
super
().
__init__
(**
kwargs
)
```
As
tr
ê
s
coisas
importantes
a
serem
lembradas
ao
escrever
sua
pr
ó
pria
configura
çã
o
s
ã
o
:
-
voc
ê
tem
que
herdar
de
`
PretrainedConfig
`,
-
o
`
__init__
`
do
seu
`
PretrainedConfig
`
deve
aceitar
quaisquer
kwargs
,
-
esses
`
kwargs
`
precisam
ser
passados
para
a
superclasse
`
__init__
`.
A
heran
ç
a
é
para
garantir
que
voc
ê
obtenha
todas
as
funcionalidades
da
biblioteca
🤗
Transformers
,
enquanto
as
outras
duas
restri
çõ
es
v
ê
m
do
fato
de
um
`
PretrainedConfig
`
ter
mais
campos
do
que
os
que
voc
ê
est
á
configurando
.
Ao
recarregar
um
config
com
o
m
é
todo
`
from_pretrained
`,
esses
campos
precisam
ser
aceitos
pelo
seu
config
e
ent
ã
o
enviados
para
a
superclasse
.
Definir
um
`
model_type
`
para
sua
configura
çã
o
(
aqui
`
model_type
=
"resnet"
`)
n
ã
o
é
obrigat
ó
rio
,
a
menos
que
voc
ê
queira
registrar
seu
modelo
com
as
classes
autom
á
ticas
(
veja
a
ú
ltima
se
çã
o
).
Com
isso
feito
,
voc
ê
pode
facilmente
criar
e
salvar
sua
configura
çã
o
como
faria
com
qualquer
outra
configura
çã
o
de
modelo
da
biblioteca
.
Aqui
est
á
como
podemos
criar
uma
configura
çã
o
resnet50d
e
salv
á
-
la
:
```
py
resnet50d_config
=
ResnetConfig
(
block_type
=
"bottleneck"
,
stem_width
=
32
,
stem_type
=
"deep"
,
avg_down
=
True
)
resnet50d_config
.
save_pretrained
(
"custom-resnet"
)
```
Isso
salvar
á
um
arquivo
chamado
`
config
.
json
`
dentro
da
pasta
`
custom
-
resnet
`.
Voc
ê
pode
ent
ã
o
recarregar
sua
configura
çã
o
com
o
m
é
todo
`
from_pretrained
`:
```
py
resnet50d_config
=
ResnetConfig
.
from_pretrained
(
"custom-resnet"
)
```
Voc
ê
tamb
é
m
pode
usar
qualquer
outro
m
é
todo
da
classe
[`
PretrainedConfig
`],
como
[`~
PretrainedConfig
.
push_to_hub
`]
para
carregar
diretamente
sua
configura
çã
o
para
o
Hub
.
##
Escrevendo
um
modelo
customizado
Agora
que
temos
nossa
configura
çã
o
ResNet
,
podemos
continuar
escrevendo
o
modelo
.
Na
verdade
,
escreveremos
dois
:
um
que
extrai
os
recursos
ocultos
de
um
lote
de
imagens
(
como
[`
BertModel
`])
e
um
que
é
adequado
para
classifica
çã
o
de
imagem
(
como
[`
BertForSequenceClassification
`]).
Como
mencionamos
antes
,
escreveremos
apenas
um
wrapper
solto
do
modelo
para
mant
ê
-
lo
simples
para
este
exemplo
.
A
ú
nica
coisa
que
precisamos
fazer
antes
de
escrever
esta
classe
é
um
mapa
entre
os
tipos
de
bloco
e
as
classes
de
bloco
reais
.
Ent
ã
o
o
modelo
é
definido
a
partir
da
configura
çã
o
passando
tudo
para
a
classe
`
ResNet
`:
```
py
from
transformers
import
PreTrainedModel
from
timm
.
models
.
resnet
import
BasicBlock
,
Bottleneck
,
ResNet
from
.
configuration_resnet
import
ResnetConfig
BLOCK_MAPPING
=
{
"basic"
:
BasicBlock
,
"bottleneck"
:
Bottleneck
}
class
ResnetModel
(
PreTrainedModel
):
config_class
=
ResnetConfig
def
__init__
(
self
,
config
):
super
().
__init__
(
config
)
block_layer
=
BLOCK_MAPPING
[
config
.
block_type
]
self
.
model
=
ResNet
(
block_layer
,
config
.
layers
,
num_classes
=
config
.
num_classes
,
in_chans
=
config
.
input_channels
,
cardinality
=
config
.
cardinality
,
base_width
=
config
.
base_width
,
stem_width
=
config
.
stem_width
,
stem_type
=
config
.
stem_type
,
avg_down
=
config
.
avg_down
,
)
def
forward
(
self
,
tensor
):
return
self
.
model
.
forward_features
(
tensor
)
```
Para
o
modelo
que
ir
á
classificar
as
imagens
,
vamos
apenas
alterar
o
m
é
todo
forward
:
```
py
class
ResnetModelForImageClassification
(
PreTrainedModel
):
config_class
=
ResnetConfig
def
__init__
(
self
,
config
):
super
().
__init__
(
config
)
block_layer
=
BLOCK_MAPPING
[
config
.
block_type
]
self
.
model
=
ResNet
(
block_layer
,
config
.
layers
,
num_classes
=
config
.
num_classes
,
in_chans
=
config
.
input_channels
,
cardinality
=
config
.
cardinality
,
base_width
=
config
.
base_width
,
stem_width
=
config
.
stem_width
,
stem_type
=
config
.
stem_type
,
avg_down
=
config
.
avg_down
,
)
def
forward
(
self
,
tensor
,
labels
=
None
):
logits
=
self
.
model
(
tensor
)
if
labels
is
not
None
:
loss
=
torch
.
nn
.
cross_entropy
(
logits
,
labels
)
return
{
"loss"
:
loss
,
"logits"
:
logits
}
return
{
"logits"
:
logits
}
```
Em
ambos
os
casos
,
observe
como
herdamos
de
`
PreTrainedModel
`
e
chamamos
a
inicializa
çã
o
da
superclasse
com
o
`
config
`
(
um
pouco
parecido
quando
voc
ê
escreve
um
`
torch
.
nn
.
Module
`).
A
linha
que
define
o
`
config_class
`
n
ã
o
é
obrigat
ó
ria
,
a
menos
que
voc
ê
deseje
registrar
seu
modelo
com
as
classes
autom
á
ticas
(
consulte
a
ú
ltima
se
çã
o
).
<
Tip
>
Se
o
seu
modelo
for
muito
semelhante
a
um
modelo
dentro
da
biblioteca
,
voc
ê
poder
á
reutilizar
a
mesma
configura
çã
o
desse
modelo
.
</
Tip
>
Voc
ê
pode
fazer
com
que
seu
modelo
retorne
o
que
voc
ê
quiser
,
por
é
m
retornando
um
dicion
á
rio
como
fizemos
para
`
ResnetModelForImageClassification
`,
com
a
fun
çã
o
de
perda
inclu
í
da
quando
os
r
ó
tulos
s
ã
o
passados
,
vai
tornar
seu
modelo
diretamente
utiliz
á
vel
dentro
da
classe
[`
Trainer
`].
Voc
ê
pode
usar
outro
formato
de
sa
í
da
,
desde
que
esteja
planejando
usar
seu
pr
ó
prio
la
ç
o
de
treinamento
ou
outra
biblioteca
para
treinamento
.
Agora
que
temos
nossa
classe
do
modelo
,
vamos
criar
uma
:
```
py
resnet50d
=
ResnetModelForImageClassification
(
resnet50d_config
)
```
Novamente
,
voc
ê
pode
usar
qualquer
um
dos
m
é
todos
do
[`
PreTrainedModel
`],
como
[`~
PreTrainedModel
.
save_pretrained
`]
ou
[`~
PreTrainedModel
.
push_to_hub
`].
Usaremos
o
segundo
na
pr
ó
xima
se
çã
o
e
veremos
como
enviar
os
pesos
e
o
c
ó
digo
do
nosso
modelo
.
Mas
primeiro
,
vamos
carregar
alguns
pesos
pr
é
-
treinados
dentro
do
nosso
modelo
.
Em
seu
pr
ó
prio
caso
de
uso
,
voc
ê
provavelmente
estar
á
treinando
seu
modelo
customizado
em
seus
pr
ó
prios
dados
.
Para
este
tutorial
ser
r
á
pido
,
usaremos
a
vers
ã
o
pr
é
-
treinada
do
resnet50d
.
Como
nosso
modelo
é
apenas
um
wrapper
em
torno
dele
,
ser
á
f
á
cil
de
transferir
esses
pesos
:
```
py
import
timm
pretrained_model
=
timm
.
create_model
(
"resnet50d"
,
pretrained
=
True
)
resnet50d
.
model
.
load_state_dict
(
pretrained_model
.
state_dict
())
```
Agora
vamos
ver
como
ter
certeza
de
que
quando
fazemos
[`~
PreTrainedModel
.
save_pretrained
`]
ou
[`~
PreTrainedModel
.
push_to_hub
`],
o
c
ó
digo
do
modelo
é
salvo
.
##
Enviando
o
c
ó
digo
para
o
Hub
<
Tip
warning
={
true
}>
Esta
API
é
experimental
e
pode
ter
algumas
pequenas
altera
çõ
es
nas
pr
ó
ximas
vers
õ
es
.
</
Tip
>
Primeiro
,
certifique
-
se
de
que
seu
modelo
esteja
totalmente
definido
em
um
arquivo
`.
py
`.
Ele
pode
contar
com
importa
çõ
es
relativas
para
alguns
outros
arquivos
desde
que
todos
os
arquivos
estejam
no
mesmo
diret
ó
rio
(
ainda
n
ã
o
suportamos
subm
ó
dulos
para
este
recurso
).
Para
o
nosso
exemplo
,
vamos
definir
um
arquivo
`
modeling_resnet
.
py
`
e
um
arquivo
`
configuration_resnet
.
py
`
em
uma
pasta
no
diret
ó
rio
de
trabalho
atual
chamado
`
resnet_model
`.
O
arquivo
de
configura
çã
o
cont
é
m
o
c
ó
digo
para
`
ResnetConfig
`
e
o
arquivo
de
modelagem
cont
é
m
o
c
ó
digo
do
`
ResnetModel
`
e
`
ResnetModelForImageClassification
`.
```
.
└──
resnet_model
├──
__init__
.
py
├──
configuration_resnet
.
py
└──
modeling_resnet
.
py
```
O
`
__init__
.
py
`
pode
estar
vazio
,
apenas
est
á
l
á
para
que
o
Python
detecte
que
o
`
resnet_model
`
possa
ser
usado
como
um
m
ó
dulo
.
<
Tip
warning
={
true
}>
Se
estiver
copiando
arquivos
de
modelagem
da
biblioteca
,
voc
ê
precisar
á
substituir
todas
as
importa
çõ
es
relativas
na
parte
superior
do
arquivo
para
importar
do
pacote
`
transformers
`.
</
Tip
>
Observe
que
voc
ê
pode
reutilizar
(
ou
subclasse
)
uma
configura
çã
o
/
modelo
existente
.
Para
compartilhar
seu
modelo
com
a
comunidade
,
siga
estas
etapas
:
primeiro
importe
o
modelo
ResNet
e
a
configura
çã
o
do
arquivos
criados
:
```
py
from
resnet_model
.
configuration_resnet
import
ResnetConfig
from
resnet_model
.
modeling_resnet
import
ResnetModel
,
ResnetModelForImageClassification
```
Ent
ã
o
voc
ê
tem
que
dizer
à
biblioteca
que
deseja
copiar
os
arquivos
de
c
ó
digo
desses
objetos
ao
usar
o
`
save_pretrained
`
e
registr
á
-
los
corretamente
com
uma
determinada
classe
autom
á
ticas
(
especialmente
para
modelos
),
basta
executar
:
```
py
ResnetConfig
.
register_for_auto_class
()
ResnetModel
.
register_for_auto_class
(
"AutoModel"
)
ResnetModelForImageClassification
.
register_for_auto_class
(
"AutoModelForImageClassification"
)
```
Observe
que
n
ã
o
h
á
necessidade
de
especificar
uma
classe
autom
á
tica
para
a
configura
çã
o
(
h
á
apenas
uma
classe
autom
á
tica
,
[`
AutoConfig
`]),
mas
é
diferente
para
os
modelos
.
Seu
modelo
customizado
pode
ser
adequado
para
muitas
tarefas
diferentes
,
ent
ã
o
voc
ê
tem
que
especificar
qual
das
classes
autom
á
ticas
é
a
correta
para
o
seu
modelo
.
Em
seguida
,
vamos
criar
a
configura
çã
o
e
os
modelos
como
fizemos
antes
:
```
py
resnet50d_config
=
ResnetConfig
(
block_type
=
"bottleneck"
,
stem_width
=
32
,
stem_type
=
"deep"
,
avg_down
=
True
)
resnet50d
=
ResnetModelForImageClassification
(
resnet50d_config
)
pretrained_model
=
timm
.
create_model
(
"resnet50d"
,
pretrained
=
True
)
resnet50d
.
model
.
load_state_dict
(
pretrained_model
.
state_dict
())
```
Agora
para
enviar
o
modelo
para
o
Hub
,
certifique
-
se
de
estar
logado
.
Ou
execute
no
seu
terminal
:
```
bash
huggingface
-
cli
login
```
ou
a
partir
do
notebook
:
```
py
from
huggingface_hub
import
notebook_login
notebook_login
()
```
Voc
ê
pode
ent
ã
o
enviar
para
seu
pr
ó
prio
namespace
(
ou
uma
organiza
çã
o
da
qual
voc
ê
é
membro
)
assim
:
```
py
resnet50d
.
push_to_hub
(
"custom-resnet50d"
)
```
Al
é
m
dos
pesos
do
modelo
e
da
configura
çã
o
no
formato
json
,
isso
tamb
é
m
copiou
o
modelo
e
configura
çã
o
`.
py
`
na
pasta
`
custom
-
resnet50d
`
e
carregou
o
resultado
para
o
Hub
.
Voc
ê
pode
conferir
o
resultado
neste
[
reposit
ó
rio
de
modelos
](
https
://
huggingface
.
co
/
sgugger
/
custom
-
resnet50d
).
Consulte
o
[
tutorial
de
compartilhamento
](
model_sharing
)
para
obter
mais
informa
çõ
es
sobre
o
m
é
todo
push_to_hub
.
##
Usando
um
modelo
com
c
ó
digo
customizado
Voc
ê
pode
usar
qualquer
configura
çã
o
,
modelo
ou
tokenizador
com
arquivos
de
c
ó
digo
customizados
em
seu
reposit
ó
rio
com
as
classes
autom
á
ticas
e
o
m
é
todo
`
from_pretrained
`.
Todos
os
arquivos
e
c
ó
digos
carregados
no
Hub
s
ã
o
verificados
quanto
a
malware
(
consulte
a
documenta
çã
o
de
[
Seguran
ç
a
do
Hub
](
https
://
huggingface
.
co
/
docs
/
hub
/
security
#
malware
-
scanning
)
para
obter
mais
informa
çõ
es
),
mas
voc
ê
ainda
deve
revisar
o
c
ó
digo
do
modelo
e
o
autor
para
evitar
a
execu
çã
o
de
c
ó
digo
malicioso
em
sua
m
á
quina
.
Defina
`
trust_remote_code
=
True
`
para
usar
um
modelo
com
c
ó
digo
customizado
:
```
py
from
transformers
import
AutoModelForImageClassification
model
=
AutoModelForImageClassification
.
from_pretrained
(
"sgugger/custom-resnet50d"
,
trust_remote_code
=
True
)
```
Tamb
é
m
é
fortemente
recomendado
passar
um
hash
de
confirma
çã
o
como
uma
`
revis
ã
o
`
para
garantir
que
o
autor
dos
modelos
n
ã
o
atualize
o
c
ó
digo
com
novas
linhas
maliciosas
(
a
menos
que
voc
ê
confie
totalmente
nos
autores
dos
modelos
).
```
py
commit_hash
=
"ed94a7c6247d8aedce4647f00f20de6875b5b292"
model
=
AutoModelForImageClassification
.
from_pretrained
(
"sgugger/custom-resnet50d"
,
trust_remote_code
=
True
,
revision
=
commit_hash
)
```
Observe
que
ao
navegar
no
hist
ó
rico
de
commits
do
reposit
ó
rio
do
modelo
no
Hub
,
h
á
um
bot
ã
o
para
copiar
facilmente
o
commit
hash
de
qualquer
commit
.
##
Registrando
um
modelo
com
c
ó
digo
customizado
para
as
classes
autom
á
ticas
Se
voc
ê
estiver
escrevendo
uma
biblioteca
que
estende
🤗
Transformers
,
talvez
queira
estender
as
classes
autom
á
ticas
para
incluir
seus
pr
ó
prios
modelos
.
Isso
é
diferente
de
enviar
o
c
ó
digo
para
o
Hub
no
sentido
de
que
os
usu
á
rios
precisar
ã
o
importar
sua
biblioteca
para
obter
os
modelos
customizados
(
ao
contr
á
rio
de
baixar
automaticamente
o
c
ó
digo
do
modelo
do
Hub
).
Desde
que
sua
configura
çã
o
tenha
um
atributo
`
model_type
`
diferente
dos
tipos
de
modelo
existentes
e
que
as
classes
do
seu
modelo
tenha
os
atributos
`
config_class
`
corretos
,
voc
ê
pode
simplesmente
adicion
á
-
los
à
s
classes
autom
á
ticas
assim
:
```
py
from
transformers
import
AutoConfig
,
AutoModel
,
AutoModelForImageClassification
AutoConfig
.
register
(
"resnet"
,
ResnetConfig
)
AutoModel
.
register
(
ResnetConfig
,
ResnetModel
)
AutoModelForImageClassification
.
register
(
ResnetConfig
,
ResnetModelForImageClassification
)
```
Observe
que
o
primeiro
argumento
usado
ao
registrar
sua
configura
çã
o
customizada
para
[`
AutoConfig
`]
precisa
corresponder
ao
`
model_type
`
de
sua
configura
çã
o
customizada
.
E
o
primeiro
argumento
usado
ao
registrar
seus
modelos
customizados
,
para
qualquer
necessidade
de
classe
de
modelo
autom
á
tico
deve
corresponder
ao
`
config_class
`
desses
modelos
.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment