乙Py先生のプログラミング教室
初学者のためのプログラミング学習サイト

プログラミング

今回は先日公開されたジブリ映画に関する
ジブリ公式ツイッターさんの投稿に関するものです

解説動画はこちら


ジブリ公式Twitterの投稿が
まるでモールス信号のようだと
話題になっていたので解読してみました

対象のツイートはこちら

ジブリ公式ツイッター


宮崎駿監督の最新作「君たちはどう生きるか」の
ポスターに描かれた謎の鳥のイラストとともに
「カカヘカ・・・」と暗号文ぽいものが
書かれています

鳥の鳴き声のようにも見えるますが・・・
モールス信号に変換する事で
解読する事ができる様です

 

書かれている文字

ツイートされていたのはこの文章
カカヘカヘッカヘヘッヘカヘカヘッカカッヘカヘカカッヘカヘカヘッカヘカヘカッヘカカヘッカヘッヘカヘカッカカヘカッヘカヘカカッカヘッカヘカヘヘッヘカヘヘカッヘヘッ

「カ」は「・」
「ヘ」は「-」
「ッ」は区切り
として和文モールス符号に
変換することが出来るみたいです

早速解読するコードを作っていきましょう

モールス暗号解読コード
md = {
'カヘ': 'イ','カヘカヘ': 'ロ','ヘカカカ': 'ハ','ヘカヘカ': 'ニ',
'ヘカカ': 'ホ','カ': 'ヘ','カカヘカカ': 'ト','カカヘカ': 'チ',
'ヘヘカ': 'リ','カカカカ': 'ヌ','ヘカヘヘカ': 'ル','カヘヘヘ': 'ヲ',
'ヘカヘ': 'ワ','カヘカカ': 'カ','ヘヘ': 'ヨ','ヘカ': 'タ',
'ヘヘヘ': 'レ','ヘヘヘカ': 'ソ','カヘヘカ': 'ツ','ヘヘカヘ': 'ネ',
'カヘカ': 'ナ','カカカ': 'ラ','ヘ': 'ム','カカヘ': 'ウ','カカヘヘ': 'ノ',
'カヘカカカ': 'オ','カカカヘ': 'ク','カヘヘ': 'ヤ','ヘカカヘ': 'マ',
'ヘカヘヘ': 'ケ','ヘヘカカ': 'フ','ヘヘヘヘ': 'コ','ヘカヘヘヘ': 'エ',
'カヘカヘヘ': 'テ','ヘヘカヘヘ': 'ア','ヘカヘカヘ': 'サ','ヘカヘカカ': 'キ',
'ヘカカヘヘ': 'ユ','ヘカカカヘ': 'メ','カカヘカヘ': 'ミ','ヘヘカヘカ': 'シ',
'カヘヘカカ': 'ヱ','ヘヘカカヘ': 'ヒ','ヘカカヘカ': 'モ','カヘヘヘカ': 'セ',
'ヘヘヘカヘ': 'ス','カヘカヘカ': 'ン','カカ': '゛','カカヘヘカ': '゜'
}

def morus_decode(text):
    texts = text.replace("\n","").split("ッ")
    result_text = ''.join([md[tx] for tx in texts if tx in md])
    print(result_text)

辞書を使って対象の文字列を
変換してつなげるだけのシンプルで簡単なコードです

これを使って先ほどの文章を入力すると
text  = """
カカヘカヘッカヘヘッ
ヘカヘカヘッカカッヘカヘカカッ
ヘカヘカヘッカヘカヘカッヘカカヘッカヘッ
ヘカヘカッカカヘカッヘカヘカカッカヘッ
カヘカヘヘッヘカヘヘカッヘヘッ
"""

morus_decode(text)

答えが出ます!!!!!!!

答えを知りたい方は
動画を見るかコード試してみて下さいね




平文をモールス暗号に変換するコード
md2 = {v:k for k,v in md.items()}
def morus_code(text):
    result_text = 'ッ'.join([md2[tx] for tx in text if tx in md2])
    print(result_text)
    
text = "ココニテキストヲ"
morus_code(text)

逆でテキストをモールス暗号化するのも
辞書変換で出来ます

Python言語を使えば
こういった暗号解読も簡単に行えます

文法がまだの方は
是非この機会に
色々動画見てみて下さいね

それでは

今回はPython言語で機械学習用のUIが
サクサク作れるGradioについてです


解説動画はこちら






Gradioについて

機械学習用のモデルを一般の人が使うには
いちいちHTMLやJavascriptとかを書いて
適切なUIを実装しないと使えません


Gradio を使用すると
すべてPythonでデモを構築して
共有するところまでできちゃいます



導入方法

コマンドラインで
インストールコマンドを実行するだけです
pip install gradio



主なGradio操作方法

1.どこか作業用のディレクトリを用意する
2.ディレクトリ内にGradioのコードを書いた
 Pythonファイルを作る(app.py)
3.ターミナルなどからコマンドで実行する
 gradio ファイル名



サンプル起動用のファイル

デモサイトのソースです
sample.py

import gradio as gr

def greet(name):
    return "Hello " + name + "!"

demo = gr.Interface(fn=greet, inputs="text", outputs="text")

ファイルを作成したらターミナルを起動して
ファイルの有る場所に移動し
次のコマンドを実行します

gradio sample.py



アプリケーションが起動したら
以下のURLにアクセスすると見る事ができます

http://127.0.0.1:7860 or 7861
http://localhost:7860 or 7861

ポート番号は起動時にターミナルに表示されるので
それを入力しましょう

スクリーンショット 2023-07-08 16.57.27

こんな感じの画面が出たら成功です



Gradioの仕組み

デモソース
import gradio as gr

def greet(name):
    return "Hello " + name + "!"

demo = gr.Interface(fn=greet, inputs="text", outputs="text")
gradioをimportして
gr.Interface でインターフェイスを作成します


画面に表示されるのがインターフェイスです
スクリーンショット 2023-07-08 16.57.27


インターフェイスは3つの必須パラメータで
初期化を行います

1 . fn: UIをラップする関数

2 . inputs: 入力に使用するコンポーネント
(例"text": 、"image"または"audio")

3 . outputs: 出力に使用するコンポーネント
(例"text"、"image"、 または"label")

関数の引数や戻り値は
対応する入力ソースの数や
出力するソースの数に合わせる必要があります

入力と出力、そして何をするかを関数で定義して
gr.Interfaceの引数に指定して実行するだけ
という非常にシンプルな作りになっています



コンポーネントについて

GradioではUI変更用にさまざまな部品が用意されていて
これを使用してさまざまなUIを作成することができます

部品のサンプルソースです
import gradio as gr

def greet(name, is_morning, temperature):
    salutation = "Good morning" if is_morning else "Good evening"
    greeting = f"{salutation} {name}. It is {temperature} degrees today"
    celsius = (temperature - 32) * 5 / 9
    return greeting, round(celsius, 2)

demo = gr.Interface(
    fn=greet,
    inputs=["text", "checkbox", gr.Slider(0, 100)],
    outputs=["text", "number"],
)
demo.launch()
スクリーンショット 2023-07-08 17.01.22

入力として
・テキスト
・チェックボタン
・スライダー
が配置されています

部品を配置してUIをサクサク作る事ができます

これらを簡単に作成出来るのも
Gradioの強みですね




サンプルアプリ

huggingfaceの画像判別モデルを使用して
画像判別を行うUIサンプルアプリです

今回は
huggingface/google/vit-base-patch16-224
というモデルを使用する事にします

サンプルアプリのソース
import gradio as gr

demo = gr.Interface.load(
    "huggingface/google/vit-base-patch16-224",
    examples=[
    "./images/ファイル名",
    "./images/ファイル名",
    ])
    
demo.launch()

事前に画像ファイルを用意しておき
imagesというディレクトリ の中に配置しておきます

examples の部分のファイル名を
正しく指定しておきましょう

こんな感じの画面が出ます


スクリーンショット 2023-07-08 17.05.54

画像ファイルをクリックして「送信」をクリックすると
画像の判別結果が右側に出る仕組みです

このように判別モデルなんかも
数行のコードで使う事ができてしまうUIが
簡単に作成できてしまうので
非常に便利です

作ったコードを
Google colabなどで配布すれば
簡単に共有も出来てしまいます


huggingfaceにモデルを置いておけば
どこでも使う事ができるので
オープンソースで公開を検討している場合は
非常にお手軽に使う事ができます



今回は機械学習用のUIが
サクサク作れてしまう
Gradio をご紹介しました

それでは

今回はPython言語で
簡単にGUIアプリケーションが作成できちゃう
「Flet」のご紹介です






Fletについて

Fletは、PythonでWeb, Mobile, Desktopの
アプリケーションを作る事ができる
フレームワークです

Flutter言語をベースに構築されており
クロスプラットフォームの
アプリケーション開発が可能になっています

Pythonだけで簡単に
GUIアプリケーションが作れちゃうので
かなり便利だと思います


導入方法

導入方法は至って簡単で
コマンドでインストールするだけです
pip install flet



主なFlet操作方法

ここからは簡単な操作方法についてです

1.どこか作業用のディレクトリを用意する
2.ディレクトリ内にFletのコードを書いたPythonファイルを作る
3.ターミナルなどからコマンドで実行する

python ファイル名

これだけでFletで作ったアプリを
動かす事ができます



Fletの仕組み

Fletをimportして「ft.app」で
main関数が呼び出されるとGUIが作成されます
import flet as ft

def main(page: ft.Page):
    pass

ft.app(target=main)

Fletアプリをブラウザーで起動させる場合は
「app」メソッドの引数を追加します
ft.app(target=main, view=ft.WEB_BROWSER)



Controlの追加

Fletで表示されるページは
「Control」と呼ばれるウィジェットになっているので
ここに表示するものをリストのように追加していきます
page.add(ft.Text('こんにちは:乙pyです'))

スクリーンショット 2023-06-24 16.48.04


テキストやボタンなど
部品を配置する事ができるようになっています



イベントハンドラ

ボタンなどのコントロールは
ユーザの入力で発火するイベントハンドラを
持つことが出来るようになっています

# イベントハンドラ
def button_clicked(e):
    page.add(ft.Text("Clicked!"))

page.add(ft.ElevatedButton(text="Click py", on_click=button_clicked))
スクリーンショット 2023-06-24 16.48.15






サンプルアプリ

Fletのgithubでサンプルアプリが公開されています

サンプルのリンク

スクリーンショット 2023-06-24 16.48.40
スクリーンショット 2023-06-24 16.48.25




どんなアプリかは
動画の方を見てみて下さいね





結構簡単にアプリが作れるので
これからもどんどんアプリ作っていきたいと思います

それでは


 

今回は主にPython初学者の方のための
ハマりポイントの解説動画です


解説動画はこちら



Python言語は他のプログラム言語に比べ
比較的分かり易く簡単で、学ぶのに時間が掛からない言語です

ですが、初めての方だと
どうしても引っ掛かりやすいポイントが有るので
そこを重点的に解説していきます

次のコードを実行するとどうなるでしょうか?
答えや解説は解説動画の方をご覧ください


文字列型のポイント

### 文字列のインデックス代入

a = "12345"
a[3] = "a"
print(a)


### 文字列のスライス操作

a = "abcdefghi"
print(a[::-3])


### 文字列の展開とセパレーター

a = "abcde"
print(*a , sep=' a ')


小数点型のポイント
### 小数点型の定義

a = .1_2_3
print(a)


タプル型のポイント
### タプル型の引き算

a = (9 , 8)
b = (1 , 2)
print(a - b)


### タプル型の代入

a = 123 , 
print(a)


リスト型のポイント
### リスト型の代入と参照

a = [1,2,3]
b = a
b[0] = 99
print(a)


### リストのコピー

import copy

a = [[9, 2], [5, 8]]
b = copy.copy(a)
b[0][1] = 12345
print(a)


辞書型のポイント
### 辞書型への代入

a = {}
a.add(1)
print(a)


### getメソッド

a = {1:2 , 3:4}
print(a.get(9))


IF文のポイント
### None or 0

if None or 0:
    print(1)


FOR文のポイント
### FOR文後の変数参照

i = 10
for i in range(5):
    pass

print(i)


関数のポイント
### スコープ外の変数操作

a = 3

def sample_def():
    global a
    a += 5
    return a

print(sample_def())


### try - finally - return

def sample_def():
    try:
        a = "おっぱい"
        print(a)
        return a
    except:
        print(a * 2)
    finally:
        print(a * 3)
    
print(sample_def())


どれもこれも
癖の有るコードになっています

ハマりやすいポイントでもあるので
結果がどうなるか
分からない部分は
確認しておくと良いと思います

それでは


今回はサイバーさんの
大規模日本語モデルを
Google Colabで試してみることにしました

解説動画はこちら



はじめに

サイバーエージェントから日本語LLM
OpenCALMが発表されたので
Google Colabで動かしてみることとします

最大68億パラメータの
日本語LLM(大規模言語モデル)

オープンなデータで学習した
商用利用可能なモデルとのことです

詳細はこちら

chatGPTなどとは違い
入力した文章の
続きとなる文章を生成してくれる
LLMになっています

モデルの性能も
いくつか種類がある様で

Model Params Layers Dim Heads Dev ppl
cyberagent/open-calm-small 160M 12 768 12 19.7
cyberagent/open-calm-medium 400M 24 1024 16 13.8
cyberagent/open-calm-large 830M 24 1536 16 11.3
cyberagent/open-calm-1b 1.4B 24 2048 16 10.3
cyberagent/open-calm-3b 2.7B 32 2560 32 9.7
cyberagent/open-calm-7b 6.8B 32 4096 32 8.2

こんな感じのモデル構成になっています
今回は一番小さい small モデルを試します


必要なもの

Google Colabで動かすのに必要なのは
1.「ランタイムタイプの変更」:GPUに変更する
2.必要なライブラリのインストール
3.ライブラリやモデルのインポート
です


・「ランタイムタイプの変更」:GPUに変更する

Colabのメニューから「ランタイムタイプの変更」で
GPUに変更しておきましょう




・必要なライブラリのインストール

Google Colabのライブラリだけでは
動かないので次の2つをインストールしましょう
!pip install transformers

!pip install accelerate

1分くらいでインストール出来ます


・ライブラリやモデルのインポート

次のコードでライブラリと
モデルをセットアップ出来ます
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

model = AutoModelForCausalLM.from_pretrained("cyberagent/open-calm-small", device_map="auto", torch_dtype=torch.float16)
tokenizer = AutoTokenizer.from_pretrained("cyberagent/open-calm-small")

エラーはライブラリなどが
インストール出来ていない場合に起きるので
先にインストール確認しておきましょう


次のコードは入力用の関数です
先に実行しておきましょう
# 入力用の関数を定義
def make_text(input_text):
    inputs = tokenizer(input_text, return_tensors="pt").to(model.device)
    with torch.no_grad():
        tokens = model.generate(
            **inputs,
            max_new_tokens=64,
            do_sample=True,
            temperature=0.7,
            pad_token_id=tokenizer.pad_token_id,
        )
    return tokenizer.decode(tokens[0], skip_special_tokens=True)


ここまで揃ったらあとは実行のみです
文章を入力して実行してみましょう
input_text = "文章を入力、"
out = make_text(input_text)
print(out)

次のような文章が生成されました

吾輩は猫である、つまり猫である。
猫が猫であるということは、
すなわち猫であるということは、
つまり猫であるということである。

これは、猫に人間が従うという前提が、
猫に人間を従わせるという前提が前提になっているからである。

猫は、人間に従属する、従属関係にある。
猫は、人間に従属する



諦めたらそこで試合終了ですよ、
正直、今、プロでも勝てる試合もそんなにない。
しかも、まだ2試合あるし。

まあ、その状態は、
プロでも通用しないってことですよね。

で、その状態での、
4連敗は、
かなり、ヤバい。
もう、
負けると、
もう、




俺は高校生探偵、工藤新一。
幼馴染と遊園地へ遊びに行って、
黒ずくめの男の怪しげな取引現場を目撃した、
同級生の阿久津。

そして、阿久津は、ある事件の犯人に成りすまして、
美人でかっこいい高校生探偵・工藤新一と名乗り、
高校生探偵事務所を開いたのだ。

その依頼を受けた新一は、阿久津に、
事件の詳細を尋ねた。
それは「工藤新一」という同級生の阿久津


勝手に色々な物語を生成してくれます

正直な話
精度に関しては良く分かりません

実行毎に結果は変わるので
良いものが出るまで
繰り返してみることをお勧めします


今回はサイバーエージェントのLLMを
ご紹介しました

それでは

このページのトップヘ