一昨日の記事の続きだが、gemma-4-E2B-itに「ㇰ」や「ㇷ゚」など小書きカタカナを追加してみることにした。resize_token_embeddingsのバグに巻き込まれたり、Gemma4TextScaledWordEmbeddingの構造がイマイチわからなかったり、model.safetensorsだとGoogle Colaboratory (GPU版)のメモリが足りなくなるのでpytorch_model.binに切り替えたりと、あちこち頑張ってみたのが、こんな感じ。
!pip install 'transformers>=5.5.0' 'mistral_common>=1.11.0' accelerate jinja2
import copy,torch,gc
from transformers import pipeline
from transformers.models.gemma4.modeling_gemma4 import Gemma4TextScaledWordEmbedding
w=[("ㇰ","ク"),("ㇱ","シ"),("ㇲ","ス"),("ㇳ","ト"),("ㇴ","ヌ"),("ㇵ","ハ"),("ㇶ","ヒ"),("ㇷ","フ"),("ㇸ","ヘ"),("ㇹ","ホ"),("ㇺ","ム"),("ㇻ","ラ"),("ㇼ","リ"),("ㇽ","ル"),("ㇾ","レ"),("ㇿ","ロ"),("ㇷ゚","プ")]
nlp=pipeline("image-text-to-text","google/gemma-4-E2B-it",device=-1)
n=nlp.model.model.language_model.embed_tokens_per_layer
g=copy.deepcopy(nlp.model.get_output_embeddings())
p={"embedding_dim":n.embedding_dim,"padding_idx":n.padding_idx,"embed_scale":n.scalar_embed_scale}
nlp.tokenizer.add_tokens([a for a,b in w])
e=nlp.model.resize_token_embeddings(len(nlp.tokenizer))
if(nlp.model.get_output_embeddings().out_features!=len(nlp.tokenizer)):
nlp.model.set_output_embeddings(g)
e=nlp.model.resize_token_embeddings(len(nlp.tokenizer))
g=Gemma4TextScaledWordEmbedding(num_embeddings=len(nlp.tokenizer),**p)
nlp.model.config.text_config.vocab_size=nlp.model.config.text_config.vocab_size_per_layer_input=len(nlp.tokenizer)
with torch.no_grad():
g.weight[0:n.weight.size()[0],:]=n.weight
nlp.model.model.language_model.embed_tokens_per_layer=g
e.weight.cuda()
g.weight.cuda()
x=nlp.tokenizer(["ャ","ヤ"])["input_ids"]
n=e.weight[x[0][0],:]-e.weight[x[1][0],:]
p=g.weight[x[0][0],:]-g.weight[x[1][0],:]
for x in nlp.tokenizer(w)["input_ids"]:
e.weight[x[0],:]=e.weight[x[-1],:]+n
g.weight[x[0],:]=g.weight[x[-1],:]+p
nlp.model.config.save_pretrained("tmpdir")
nlp.model.generation_config.save_pretrained("tmpdir")
nlp.processor.save_pretrained("tmpdir")
nlp.tokenizer.save_pretrained("tmpdir")
torch.save(nlp.model.state_dict(),"tmpdir/pytorch_model.bin")
del nlp,e,g,n,p
gc.collect()
nlp=pipeline("image-text-to-text","tmpdir",max_new_tokens=2048)
img="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428317/55d10bae-10b0-4a18-8e27-0907bc16361f.jpeg"
d=nlp([{"role":"user","content":[{"type":"image","image":img},{"type":"text","text":"OCR Ainu sentences."}]}])
print(d[0]["generated_text"][1]["content"])
『アイヌの美―彩りと輝き―』(京都文化博物館、2026年1月31日~3月19日)のウエランカラㇷ゚を読ませてみたところ、私(安岡孝一)の手元では以下の結果が出力された。
ここにOCRで読み取られたアイヌ語の文章を記載します。
合和7年度アイヌ工芸品展「アイヌの美-形と彫-き」アニ アンレヘ チコレ ウサムペカ イコチョア チャマ ウ エチスケラエン。
アイヌ アナケ ネ テタ ワン アン クル ネ ワ 20 イケ ネ バエム エ コ パクノヤウン モシリ、ヤンケモシリ (カラフト)、ルトム オカタ オカイ。タネ ヤウン モシタ カイ サモモシタ タイ カイ、モシリ エビツタ オカイ。テタ アナケ チクニ、ニカブ、キチカブ、チオキイボネ、キラウ、シニチ、チェブフ、セイ アニ ウサ オカイ ベカラ。ネ アンベ オッタ ケツト アイヌング フ カイ アン。イノイ オッタ アイヌング タイ カイ アン。ビシカン モシリ エオカイ ワッタラ、アイヌ ワイマ、センカクメ、ミト、カネ、タマ コロ ワ ネアンペ
タパン イキ オッタ イロホ ビリヤ プ、セベキ ビリヤ プ チムケ ウ チサンケ。イコ コチ エㇰメカレン カッタ エネアミ。センカク トラ アンテセ ワ アンカラ チラケ カイ、ルトム ウンクル イカララワ ワ ラ クカイ カイ アン。
センカク トラ アンセ ワ アンカラ チラケ カイ、ルトム ウンクル イカララワ ワ ラ クカイ カイ アン。
タプ アナケ、アイヌブリヤ クニ、公益財団法人アイヌ民族文化財団
広益財団法人アイヌ民族文化財団
うーん、やっぱり小書きのカタカナは、あまり読めてない。追加学習が必要なのだろうけど、Gemma4TextScaledWordEmbeddingの学習って、どういう風にすればいいんだろ。