Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
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
Show 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