概要
あけましておめでとうございます。久しぶりの投稿です。
この前ちょっとおしゃれなバーに行ったとき、たくさんの種類のカクテルがありました。
その時は知っているものを頼みましたが、用意されている多種のお酒などの材料を見て、いったい何通りの組み合わせが存在するのだろうと思い、帰ってからwikipediaでカクテルのレシピを眺めてみました。
名前もおしゃれで種類もたくさんあり、これから少しずつ飲んでいこうと思います。
さて、この記事はそんな魅力的なカクテルのレシピをAIで新規開拓できないか、という試みです。
やっていきます
pythonを用いて書いていきます。
ライブラリはTensorflowを使います。
学習用のデータはhttps://www.thecocktaildb.com/のものを使用しています。
424のカクテルレシピを学習データとして用います。(後に触れますが、データ数としては少ないです)
ざっくりとした説明にはなりますが、2段階に分けて学習を行いました。
①カクテル名を、その特徴を表した数値のベクトル(Word Embedding)に変換する
②カクテル名のベクトルとレシピを対応付けて学習する
カクテル名
⇅
カクテル名のベクトル
⇅
カクテルのレシピ(用いている材料)
つまったところ
複数のアウトプットをもつモデルをtensorflowで作る場合には、Functional APIを使う必要があります。
(Sequentialモデルで定義しようとして困りました。)
Inputに対して10個の出力層に接続しています。下記のように書きました。
1 2 3 |
input_ = tf.keras.Input(shape=(300,)) # 入力は300次元のベクトル output_ = [tf.keras.layers.Dense(units=len(labellist), activation='softmax',name="Ingredient"+str(i+1))(input_) for i in range(10)] # 10個の出力を作成する 名前は"Ingredient1","Ingredient2"... model = tf.keras.models.Model(inputs=input_, outputs=output_) # modelのInputとOutputを指定 |
また、このモデルに対して、学習用のデータは各名前(Ingredient1, Ingredient2…)に対応付けて渡す必要があります。
1 2 3 |
y_dict = {"Ingredient"+str(k+1): label_array[k] for k in range(10)} model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001), loss=tf.keras.losses.CategoricalCrossentropy()) model.fit(x, y_dict, epochs=200) |
結果
カクテル名「Let’s go party」
[‘Scotch:45 ml ‘ ‘Light cream:10 ml ‘ ‘Water:600 ml ‘]
パーティーの前に水を飲んでおきましょう。
カクテル名「Hungry」
[‘Gin:45 ml ‘ ‘Apfelkorn:20 ml ‘]
もうカクテルのネーミングに意味なんて感じなくていいと思います。
カクテル名「2023」
[‘Whiskey:20 ml ‘ ‘Allspice:15 ml’]
やる前から気づいていましたが、すぐに過学習してしまいます。上記のレシピは適当な段階で学習を止めて出力しています。
入力の”カクテル名の持つ意味の複雑さ”(=word embeddingの次元数の多さ)と、出力の”レシピの種類の少なさ”の2点が大きな原因と思います。
Word Embeddingの考え方がとても面白いと思っていて、何かに応用できないかと思っているのですが、どうにもいい対象が見つかりませんね。
以前、「BitCoinの価格変動をニュースの見出しデータセットを用いた多変量LSTMで予測する」でも使いましたが、この時も上手くいきませんでした。
何か面白そうな題材があったら教えてほしいです。
参考
- https://www.thecocktaildb.com/
カクテルのレシピを使用しました。 - https://amateur-engineer-blog.com/fuctional-api-multi-input-output/
Functional APIについて 公式のガイドも参考にしました。 - https://radimrehurek.com/gensim/models/doc2vec.html
gensimのdoc2vecを用いてカクテル名からベクトルを計算しました。
コメント