はじめに
現在 n高等学校に通ってる者です。
Keras初めたての右も左もわからないかつ、
プログラミングもそこまでやってるわけではない初心者が
試行錯誤の末、架空言語の性能の悪い翻訳機を作った記事です。
記事を書くのも初めてなので、至らぬ点も多々あるかと思いますが、
少しでも同じ初心者の方の参考になれば幸いです。
もくじ
- 動作環境
- 学習用データの用意
- データ作り
- 学習
- 実行
- まとめ
- 全コード
動作環境
- mac OS Big Sur
- anaconda Navigator 1.10.0
- Jupyter Notebook 6.4.3
- Keras 2.3.1
- TensorFlow 2.0.0
- numpy 1.19.2
学習用データの用意
今回使用した学習用データは
日本語と架空言語の対訳データで、
英語で表すなら
sushi
I like sushi.
I'm from Japan.
すし
わたしはすしがすきです
わたしはにほんからきました
みたいな英語とひらがなの対訳データを
私はざっと900個ほど用意しました。
(全然少ないので、もっと多い方が良いと思います)
データ作り
ここからは、Jupyter notebook
で色々していきます。
勿論、学習させるためには、英語と日本語の対訳データを
AIが読み込めるような形にしなければなりません。
ここでは対訳データの文字を整数にしてそれを配列にします。
まず初めに多分必要なものをインポートします。
import pickle
次にファイルを読み込みます
# 例文や単語読み込み
with open('架空言語データ.txt', 'r') as f:
text_fl = f.read().split("\n")
with open('日本語データ.txt', 'r') as f:
text_ja = f.read().split("\n")
次に文字列を数値の配列にする関数を入れます。
※font_arrayに入る要素を増やして、
152って書いてあるところにfont_arrayの要素数を入れれば対応文字増やせます
#文字数値化関数
def text_to_array(text):
font_array = [' ','1','2','3','4','5','6','7','8','9',' ','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','l','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','!','?',"'",',','.','"','…',';','あ','い','う','え','お','か','き','く','け','こ','が','ぎ','ぐ','げ','ご','さ','し','す','せ','そ','ざ','じ','ず','ぜ','ぞ','た','ち','つ','て','と','だ','ぢ','づ','で','ど','な','に','ぬ','ね','の','は','ひ','ふ','へ','ほ','ば','び','ぶ','べ','ぼ','ぱ','ぴ','ぷ','ぺ','ぽ','ま','み','む','め','も','や','ゆ','よ','ら','り','る','れ','ろ','わ','を','ん','ぁ','ぃ','ぅ','ぇ','ぉ','ゃ','ゅ','ょ','っ','ー']
result = [text[i:i+1] for i in range(0,len(text), 1)]
for i in range(len(result)):
for i2 in range(152):
font_array_id = str(i2)
result[i] = result[i].replace(font_array[i2],font_array_id)
result[i] = int(result[i])
for i in range(64 - len(result)):
result.append(0)
return result
あとは順番
ファイルを保存したらセルはここで一区切りです。
x_item = []
y_item = []
for i in range(単語や文の数):
fl_item = text_to_array(text_fl[i])
ja_item = text_to_array(text_ja[i])
x_train.append(fl_item)
y_train.append(ja_item)
print(result)
print(random_word)
items = [x_train, y_train]
with open("example_data.pkl", "wb") as f:
pickle.dump(items, f)
学習
次に、学習用のセルに入っていきます。
まずは必要そうなものをインポートします。
import tensorflow as tf
import pickle
from tensorflow import keras
from tensorflow.keras.layers import Dense, Input
from tensorflow.keras.models import Model
次に保存した例文のデータを読み込みます。
with open("example_data.pkl", "rb") as f:
data = pickle.load(f)
(x_train, y_train) = data
最後に学習を行なって、保存をします。
#入力層 -入れる配列の要素数を決めます
inputs = keras.Input(shape=(64))
#中間層
x = keras.layers.Dense(10000, activation="relu")(inputs)
#出力層 -出力される配列の要素数を決めます
outputs = keras.layers.Dense(64)(x)
#モデルをまとめて
model = keras.Model(inputs=inputs, outputs=outputs)
#コンプリートする。ここで損失関数とかいじれます。損失関数はmaeだと調子良さそうな気がします。
model.compile(loss="mae", optimizer="adam", metrics=["mae"])
model.summary()
model.fit(x_train, y_train, epochs=学習する回数)
#ここで保存します
model.save('ファイル名.h5', include_optimizer=True)
翻訳
インポートして、
import tensorflow as tf
import numpy as np
import math
from tensorflow import keras
文字を配列化とその逆を行う関数を配置して
def text_to_array(text):
font_array = [' ','1','2','3','4','5','6','7','8','9',' ','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','l','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','!','?',"'",',','.','"','…',';','あ','い','う','え','お','か','き','く','け','こ','が','ぎ','ぐ','げ','ご','さ','し','す','せ','そ','ざ','じ','ず','ぜ','ぞ','た','ち','つ','て','と','だ','ぢ','づ','で','ど','な','に','ぬ','ね','の','は','ひ','ふ','へ','ほ','ば','び','ぶ','べ','ぼ','ぱ','ぴ','ぷ','ぺ','ぽ','ま','み','む','め','も','や','ゆ','よ','ら','り','る','れ','ろ','わ','を','ん','ぁ','ぃ','ぅ','ぇ','ぉ','ゃ','ゅ','ょ','っ','ー']
result = [text[i:i+1] for i in range(0,len(text), 1)]
for i in range(len(result)):
for i2 in range(152):
font_array_id = str(i2)
result[i] = result[i].replace(font_array[i2],font_array_id)
result[i] = int(result[i])
for i in range(64 - len(result)):
result.append(0)
return result
def array_to_text(text):
font_array = [' ','1','2','3','4','5','6','7','8','9',' ','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','l','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','!','?',"'",',','.','"','…',';','あ','い','う','え','お','か','き','く','け','こ','が','ぎ','ぐ','げ','ご','さ','し','す','せ','そ','ざ','じ','ず','ぜ','ぞ','た','ち','つ','て','と','だ','ぢ','づ','で','ど','な','に','ぬ','ね','の','は','ひ','ふ','へ','ほ','ば','び','ぶ','べ','ぼ','ぱ','ぴ','ぷ','ぺ','ぽ','ま','み','む','め','も','や','ゆ','よ','ら','り','る','れ','ろ','わ','を','ん','ぁ','ぃ','ぅ','ぇ','ぉ','ゃ','ゅ','ょ','っ','ー']
for i in range(64):
if i == 0:
a = round(text[i])
if a < 152:
result = font_array[a]
else:
a = 151
result = font_array[a]
else:
if a < 152:
a = round(text[i])
else:
a = 151
result = font_array[a]
result += font_array[a]
return result
モデルを読み込み、文字列を変換して、モデルに突っ込むことで、
翻訳することができます。
model = keras.models.load_model("watashi2.h5")
def test(text):
x = np.array([text_to_array(text)])
r = model.predict(x)
print(array_to_text(r[0]))
test("翻訳したい文章")
まとめ
ただの初心者が何のためかもよくわからず、
適当に書いた記事になってしまいましたが、
誰かのお役に立てたら幸いです。
全コード
1個目のセル
# 例文や単語読み込み
with open('架空言語データ.txt', 'r') as f:
text_fl = f.read().split("\n")
with open('日本語データ.txt', 'r') as f:
text_ja = f.read().split("\n")
#文字数値化関数
def text_to_array(text):
font_array = [' ','1','2','3','4','5','6','7','8','9',' ','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','l','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','!','?',"'",',','.','"','…',';','あ','い','う','え','お','か','き','く','け','こ','が','ぎ','ぐ','げ','ご','さ','し','す','せ','そ','ざ','じ','ず','ぜ','ぞ','た','ち','つ','て','と','だ','ぢ','づ','で','ど','な','に','ぬ','ね','の','は','ひ','ふ','へ','ほ','ば','び','ぶ','べ','ぼ','ぱ','ぴ','ぷ','ぺ','ぽ','ま','み','む','め','も','や','ゆ','よ','ら','り','る','れ','ろ','わ','を','ん','ぁ','ぃ','ぅ','ぇ','ぉ','ゃ','ゅ','ょ','っ','ー']
result = [text[i:i+1] for i in range(0,len(text), 1)]
for i in range(len(result)):
for i2 in range(152):
font_array_id = str(i2)
result[i] = result[i].replace(font_array[i2],font_array_id)
result[i] = int(result[i])
for i in range(64 - len(result)):
result.append(0)
return result
x_item = []
y_item = []
for i in range(単語や文の数):
fl_item = text_to_array(text_fl[i])
ja_item = text_to_array(text_ja[i])
x_train.append(fl_item)
y_train.append(ja_item)
print(result)
print(random_word)
items = [x_train, y_train]
with open("example_data.pkl", "wb") as f:
pickle.dump(items, f)
2個目のセル
import tensorflow as tf
import pickle
from tensorflow import keras
from tensorflow.keras.layers import Dense, Input
from tensorflow.keras.models import Model
次に保存した例文のデータを読み込みます。
with open("example_data.pkl", "rb") as f:
data = pickle.load(f)
(x_train, y_train) = data
#入力層 -入れる配列の要素数を決めます
inputs = keras.Input(shape=(64))
#中間層
x = keras.layers.Dense(10000, activation="relu")(inputs)
#出力層 -出力される配列の要素数を決めます
outputs = keras.layers.Dense(64)(x)
#モデルをまとめて
model = keras.Model(inputs=inputs, outputs=outputs)
#コンプリートする。ここで損失関数とかいじれます。損失関数はmaeだと調子良さそうな気がします。
model.compile(loss="mae", optimizer="adam", metrics=["mae"])
model.summary()
model.fit(x_train, y_train, epochs=学習する回数)
#ここで保存します
model.save('ファイル名.h5', include_optimizer=True)
3個目のセル
import tensorflow as tf
import numpy as np
import math
from tensorflow import keras
#文字数値化関数
def text_to_array(text):
font_array = [' ','1','2','3','4','5','6','7','8','9',' ','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','l','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','!','?',"'",',','.','"','…',';','あ','い','う','え','お','か','き','く','け','こ','が','ぎ','ぐ','げ','ご','さ','し','す','せ','そ','ざ','じ','ず','ぜ','ぞ','た','ち','つ','て','と','だ','ぢ','づ','で','ど','な','に','ぬ','ね','の','は','ひ','ふ','へ','ほ','ば','び','ぶ','べ','ぼ','ぱ','ぴ','ぷ','ぺ','ぽ','ま','み','む','め','も','や','ゆ','よ','ら','り','る','れ','ろ','わ','を','ん','ぁ','ぃ','ぅ','ぇ','ぉ','ゃ','ゅ','ょ','っ','ー']
result = [text[i:i+1] for i in range(0,len(text), 1)]
for i in range(len(result)):
for i2 in range(152):
font_array_id = str(i2)
result[i] = result[i].replace(font_array[i2],font_array_id)
result[i] = int(result[i])
for i in range(64 - len(result)):
result.append(0)
return result
def array_to_text(text):
font_array = [' ','1','2','3','4','5','6','7','8','9',' ','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','l','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','!','?',"'",',','.','"','…',';','あ','い','う','え','お','か','き','く','け','こ','が','ぎ','ぐ','げ','ご','さ','し','す','せ','そ','ざ','じ','ず','ぜ','ぞ','た','ち','つ','て','と','だ','ぢ','づ','で','ど','な','に','ぬ','ね','の','は','ひ','ふ','へ','ほ','ば','び','ぶ','べ','ぼ','ぱ','ぴ','ぷ','ぺ','ぽ','ま','み','む','め','も','や','ゆ','よ','ら','り','る','れ','ろ','わ','を','ん','ぁ','ぃ','ぅ','ぇ','ぉ','ゃ','ゅ','ょ','っ','ー']
for i in range(64):
if i == 0:
a = round(text[i])
if a < 152:
result = font_array[a]
else:
a = 151
result = font_array[a]
else:
if a < 152:
a = round(text[i])
else:
a = 151
result = font_array[a]
result += font_array[a]
return result
model = keras.models.load_model("watashi2.h5")
def test(text):
x = np.array([text_to_array(text)])
r = model.predict(x)
print(array_to_text(r[0]))
test("翻訳したい言葉")