20210428のPythonに関する記事は30件です。

Transformersの__init__() got an unexpected keyword argument 'prediction loss only'エラーを解決した件について

はじめに Huggingface Transformersを勉強しているのですが、Transformersが新しくなったようで、公式に乗っているコードも動かないものが多く、そちらの対処をしましたので記事にします。 私はこちらの記事を動かしている途中でエラーに遭遇しました。 問題 以下のコードで学習を実行したところ # 学習 !python transformers/examples/language-modeling/run_language_modeling.py \ --output_dir=output \ --model_type=gpt2 \ --model_name_or_path=gpt2 \ --do_train \ --train_data_file=train.txt \ --do_eval \ --eval_data_file=eval.txt \ --per_device_train_batch_size=2 \ --per_device_eval_batch_size=2 \ --num_train_epochs=10 \ --save_steps=5000 \ --save_total_limit=3 以下のようなエラーがでた __init__() got an unexpected keyword argument 'prediction loss only' 解決方法 こちらの記事を参考に対処を行っていました。 transformers/examples/legacy/run_language_modeling.pyを開いて以下の行をコメントアウトします。 # 318行目 # prediction_loss_onlyをコメントアウトする # Initialize our Trainer trainer = Trainer( model=model, args=training_args, data_collator=data_collator, train_dataset=train_dataset, eval_dataset=eval_dataset, # prediction_loss_only=True, ) おわりに prediction_loss_only=Trueが何を表しているのか、理解できていないのでがんばりたいです。 なんとか記事通りに動きました。めでたしめでたし。 参考サイト https://note.com/npaka/n/nad450e772a84?magazine_key=mdf3ce11e35b9 https://www.gitmemory.com/issue/huggingface/blog/72/785454524
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

TransformersのAttributeError: 'Trainer' object has no attribute 'is_world_master'エラーを解決した件について

はじめに Huggingface Transformersを勉強しているのですが、Transformersが新しくなったようで、公式に乗っているコードも動かないものが多く、そちらの対処をしましたので記事にします。 私はこちらの記事を動かしている途中でエラーに遭遇しました。 問題 # 学習 !python transformers/examples/language-modeling/run_language_modeling.py \ --output_dir=output \ --model_type=gpt2 \ --model_name_or_path=gpt2 \ --do_train \ --train_data_file=train.txt \ --do_eval \ --eval_data_file=eval.txt \ --per_device_train_batch_size=2 \ --per_device_eval_batch_size=2 \ --num_train_epochs=10 \ --save_steps=5000 \ --save_total_limit=3 AttributeError: 'Trainer' object has no attribute 'is_world_master' 解決方法 こちらの記事によると、transformersのバージョンが古いとのこと。どうしてもやる場合は以下の対応で可能とのことでした。 is_world_masterをis_world_process_zeroに変更することでエラーがなくなります。 具体的には./transformers/examples/legacy/run_language_modeling.pyの以下の行を変更しています。 # 332行目 if trainer.is_world_process_zero(): # 346行目 if trainer.is_world_process_zero(): おわりに is_wold_process_zeroを使わず、バージョンを上げて対応させたほうがよいそうなのですが、Gitからcloneしている場合は、run_language_modeling.pyを使わない方法をとる必要がありそうです。詳しい方はコメントいただけると嬉しいです。 次回 次に起きるエラーはこちらで対応しています。 参考 https://note.com/npaka/n/nad450e772a84?magazine_key=mdf3ce11e35b9 https://github.com/huggingface/transformers/issues/8995
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

TransformersのAttributeError: 'gpt2tokenizerfast' object has no attribute 'max_len' エラーを解決した件について

はじめに Huggingface Transformersを勉強しているのですが、Transformersが新しくなったようで、公式に乗っているコードも動かないものが多く、そちらの対処をしましたので記事にします。 私はこちらの記事を動かしている途中でエラーに遭遇しました。 前回 このエラーの前に遭遇したエラーについては以下の記事をご参考ください。 問題 以下のコードで学習を始めるとエラーが発生します。 !python transformers/examples/legacy/run_language_modeling.py \ --output_dir=output \ --model_type=gpt2 \ --model_name_or_path=gpt2 \ --do_train \ --train_data_file=train.txt \ --do_eval \ --eval_data_file=eval.txt \ --per_device_train_batch_size=2 \ --per_device_eval_batch_size=2 \ --num_train_epochs=10 \ --save_steps=5000 \ --save_total_limit=3 実行途中で以下のエラーがでます。 AttributeError: 'RobertaTokenizerFast' object has no attribute 'max_len' max_lenがないそうです。 こちらの記事によると、記事に利用されていたrun_language_modeling.pyが非推奨となっており、language-modeling/run_{clm, plm, mlm}.pyに切り替わっているとのことでした。 そもそも私はtransformersがわからない状態でハンズオン代わりに勉強しているため、切り替わったほうの使い方がわからないため、修正する方法でrun_language_model.pyを使うことにします。 (使い方がわかる方はコメントお待ちしております) 解決方法 ./transformers/examples/legacy/run_language_modeling.pyにmax_lenが2ヵ所あるのでmodel_max_lengthに変更する。 # 280行目 data_args.block_size = tokenizer.model_max_length # 282行目 else: data_args.block_size = min(data_args.block_size, tokenizer.model_max_length) おわりに だいぶコードが古くなっているようで、公式のハンズオンも動かないことが多く大変です。 推奨されている方法で同じことを実行できるようになりたいものです。 次回 次に起きるエラーはこちらで対応しています。 参考サイト https://github.com/huggingface/transformers/issues/8739 https://www.gitmemory.com/issue/huggingface/blog/72/785454524
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

transformersのexamples/run_language_modeling.pyが見つからない件について

はじめに 本日はHuggingface Transformersの記事を読み、同じコードをGoogle Colabratoryで動かしていた際にファイルがないというエラーが発生したので、そちらを解決していきます。Transformersは大きな変更があったようで、公式のコードも動かないものが多いです。 記事のコードは3か所エラーが出ますので、次のエラーの解決方法は最後に紹介する記事を確認して下さい。 私が行っていた記事は以下の記事となります。 環境 Google Colabratory 問題 python3: can't open file 'transformers/examples/run_language_modeling.py': [Errno 2] No such file or directory ファイルが存在しないと言われて確認してみるとありませんでした。 解決方法 リポジトリが更新されてファイルの場所が変わっているようなので以下のコマンドで探しました。 !find ./transformers/ -type f -name "*run_language_modeling.py" すると以下の返答が返ってきました。 ./transformers/examples/legacy/run_language_modeling.py どうやら記事が古いらしく、./transformers/examples/legacy/run_language_modeling.pyにありました。 おまけ 記事で推論を行うコードはこちらを利用しています。 !python transformers/examples/pytorch/text-generation/run_generation.py \ --model_type=gpt2 \ --model_name_or_path=output \ --prompt "山田太郎。日本の小説家。 " \ --seed=${RANDOM} \ --length 1000 run_generation.pyの場所も変わっておりました。 正しいファイルの位置はtransformers/examples/pytorch/text-generation/run_generation.pyです。 おわりに たくさんファイルがあるので、そもそもrun_language_modeling.pyがあるのか心配でしたが、findを使うことで探すことができました。UNIXコマンドは使えるようになると便利なので覚えていきたいです。 次回 参考サイト
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Transformersのexamples/run_language_modeling.pyが見つからない件について

はじめに 本日はHuggingface Transformersの記事を読み、同じコードをGoogle Colabratoryで動かしていた際にファイルがないというエラーが発生したので、そちらを解決していきます。Transformersは大きな変更があったようで、公式のコードも動かないものが多いです。 記事のコードは3か所エラーが出ますので、次のエラーの解決方法は最後に紹介する記事を確認して下さい。 私が行っていた記事は以下の記事となります。 環境 Google Colabratory 問題 python3: can't open file 'transformers/examples/run_language_modeling.py': [Errno 2] No such file or directory ファイルが存在しないと言われて確認してみるとありませんでした。 解決方法 リポジトリが更新されてファイルの場所が変わっているようなので以下のコマンドで探しました。 !find ./transformers/ -type f -name "*run_language_modeling.py" すると以下の返答が返ってきました。 ./transformers/examples/legacy/run_language_modeling.py どうやら記事が古いらしく、./transformers/examples/legacy/run_language_modeling.pyにありました。 おまけ 記事で推論を行うコードはこちらを利用しています。 !python transformers/examples/pytorch/text-generation/run_generation.py \ --model_type=gpt2 \ --model_name_or_path=output \ --prompt "山田太郎。日本の小説家。 " \ --seed=${RANDOM} \ --length 1000 run_generation.pyの場所も変わっておりました。 正しいファイルの位置はtransformers/examples/pytorch/text-generation/run_generation.pyです。 おわりに たくさんファイルがあるので、そもそもrun_language_modeling.pyがあるのか心配でしたが、findを使うことで探すことができました。UNIXコマンドは使えるようになると便利なので覚えていきたいです。 次回 参考サイト
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

conda activateができない

概要 linux, condaで新しい仮想環境を作ろうとしたらconda activateコマンドが動かなかったのを解決した備忘録。多分ちゃんと正しい方法ではないので今度ちゃんと作り直そう。 環境 Ubuntu 18.04 python 3.8 pyenv anaconda (miniconda3-4.7.12) レベル 導入レベル 解説 anacondaとpyenvはいっつも競合する。そして解決しては忘れる。もう嫌だ。 問題 普通、仮想環境は次のコマンドで作れる conda create -n test # testという名前の仮想環境を作成 conda activate test # 仮想環境をtestに切り替え しかし、 home ❯ conda activate test CommandNotFoundError: 'activate is not a conda command. Did you mean 'source activate'? 通らない... 調べたところ、condaとpyenvの競合によるものらしい。 そして、言われるがままsourceを使っても、 home ❯ source activate test pyenv-virtualenv: version 'test' is not a virtualenv virtualenvの環境ではないと言われる。 そんなものいつ入れたっけ... 多分最初に入れていた。 作った仮想環境の確認 pyenv+virtualenvとcondad作った仮想環境、それぞれを確認する condaの仮想環境を確認 conda info -e pyenv+virtualenvの仮想環境を確認 pyenv virtualenvs 両者は全く別物だとわかる。 解決方法 作る仮想環境は一つにまとめた方がいい。 今回はpyenv+virtulenvで作ることにする。 ちなみに、インストールしているpyenvのバージョンはminiconda3-4.7.12。最新のものを取得。 testという名前の仮想環境を作成。 pyenv virtualenv miniconda3-4.7.12 test インストールが進む... Collecting package metadata (current_repodata.json): done Solving environment: done ... # To activate this environment, use # # $ conda activate test # # To deactivate an active environment, use # # $ conda deactivate ... condaでactivateしろと言われるが無視。 pyenv-virtualenvの仮想環境切り替えはpyrnv localで行う。 pyenv local test 切り替わっている (base) test ❯ 解決! 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Python株価取得→グラフ作成

前段: メーカーの営業をしており、常日頃の思いとして「主要1,000製品の受注動向をデイリーで把握したい」という思いに駆られることが多々ある。色々試行した結果折れ線グラフでの可視化が一番効率良くモニターできると感じPythonでのグラフ作りに至った。 *本投稿では受注データーの代わりに株価を使用。 (社内セキュリティーの関係でPythonを導入できていない為、実務上での解決には至っていない) 構成: 株価を使用しPythonでのグラフ作り 以下手順 ・Pythonで株価の自動取得 ・データー整形 ・データーを纏めてプロット #必要ライブラリーのImport from datetime import datetime import pandas as pd import matplotlib.pyplot as plt import sys from yahoo_finance_api2 import share from yahoo_finance_api2.exceptions import YahooFinanceError import numpy as np import matplotlib.dates as mdate #銘柄ファイルを先にエクセルで作成しておきPandasで読み込み(銘柄コード一覧はネットで拾ってくる) df=pd.read_excel("/Users/銘柄.xlsx") l=df["コード"] #yahoo_finance_apiで株価を自動取得する為、銘柄コードの末尾に「.T」を付与する処理 j=list(l) q=list(map(lambda x: str(x),j)) c = list(map(lambda x: x+".T", q)) #先ずは例として1銘柄2年分自動取得を行う。(今回はOpenのみ使用) my_share = share.Share('1305.T') symbol_data = None try: symbol_data= my_share.get_historical( share.PERIOD_TYPE_YEAR, 2, share.FREQUENCY_TYPE_DAY,1) except YahooFinanceError as e: print(e.message) sys.exit(1) df = pd.DataFrame(symbol_data) df["datetime"] = pd.to_datetime(df.timestamp, unit="ms") g=df[["datetime","open"]] g.rename(columns={'open': '1305.T'}, inplace=True) #残りはfor loopで回し、上で作成した株価一覧に結合していく for z in c: my_share = share.Share(z) symbol_data = None try: symbol_data = my_share.get_historical( share.PERIOD_TYPE_YEAR, 2, share.FREQUENCY_TYPE_DAY,1) except YahooFinanceError as e: print(e.message) sys.exit(1) df = pd.DataFrame(symbol_data) df["datetime"] = pd.to_datetime(df.timestamp, unit="ms") d=df[["datetime","open"]] d.rename(columns={'open': z}, inplace=True) g=pd.merge(g, d, on='datetime',how='left') #datetimeをインデックス化。また1305.Tの重複を削除 g.set_index('datetime', inplace=True) print(g.columns[[0,1,2]]) g.rename(columns={'1305.T_y': '1305.T'}, inplace=True) g.drop(g.columns[[0]], axis=1,inplace=True) #複合グラフの処理、見やすさを加味し12x12とした %matplotlib tk fig, axes = plt.subplots(12,12,sharex=True,sharey=False, figsize = (19,10)) for ax, zz in zip(axes.ravel(),c): dt = g[zz] ax.plot(dt,label=zz) ax.grid(True) ax.legend(fontsize=6) ax.set_xticklabels(g.index,rotation=90,fontsize=8) xfmt = mdates.DateFormatter("%y/%m/%d") ax.xaxis.set_major_formatter(xfmt) ax.tick_params(labelsize=8) plt.tight_layout() plt.show() 結果: 下記データーを受注動向に置き換えると、増設の判断に役立ちそう?
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

DOBOT MG400の可動域

DOBOT MG400の可動域を描画します。 スペックは次のようになります。 寸法 リンク1 = 175mm リンク2 = 175mm エンドオフセット (66,0,0) 関節範囲 J1 -160 ~ 160 J2 -25 ~ 85 J3 -25 ~ 105 mg400.py import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D import math L2 = 175 L3 = 175 end_effector_params = [66.0,0.0,0.0] def ki(j1,j2,j3): if(check_joint_limit(j1,j2,j3) == False): raise Exception('out of range') j1_rad = math.pi * j1 / 180 j2_rad = math.pi * j2 / 180 j3_rad = math.pi * j3 / 180 l = L2 * math.sin(j2_rad) + L3 * math.cos(j3_rad) + end_effector_params[0] z = L2 * math.cos(j2_rad) - L3 * math.sin(j3_rad) + end_effector_params[2] x = l * math.cos(j1_rad) + end_effector_params[1] * math.sin(j1_rad) y = l * math.sin(j1_rad) + end_effector_params[1] * math.cos(j1_rad) return (x,y,z) def check_joint_limit(j1,j2,j3): d_j = j3 - j2 if (j1 >= -160 and j1 <= 160): if (j2 >= -25 and j2 <= 85): if (j3 >= -25 and j3 <= 105): return True return False def check_coordinate(x,y,z): if x < 150 and x > -150: if y < 150 and y > -150: return False return True fig = plt.figure() ax = Axes3D(fig) ax.set_xlabel("X") ax.set_ylabel("Y") ax.set_zlabel("Z") ax.set_xlim(-500,500) ax.set_ylim(-500,500) ax.set_zlim(-200,250) points = [] for j1 in range(-180,180,10): for j2 in range(-180,180,10): for j3 in range(-180,180,10): try: x,y,z = ki(j1,j2,j3) if check_coordinate(x,y,z): ax.plot([x],[y],[z],marker=".",linestyle='None',color='blue',alpha=0.2) points.append([x,y,z]) except: pass #plt.show() ### change to ply import open3d as o3d import numpy as np xyz = np.array(points) pcd = o3d.geometry.PointCloud() pcd.points = o3d.utility.Vector3dVector(xyz) o3d.io.write_point_cloud("dobot.ply", pcd) 生成された点群をcloudcompareで描画すると次の様になりました。 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

pythonでスマホゲーム自動化~FGO自動化編~

概要 pythonを用いた画像処理を用いてスマホゲームを自動化していきます. PCを初期化したので,再度設定してきます. 前回の記事 https://qiita.com/m_tani_july/items/6691bc590693c3cf65cb 解説動画 後日,動作確認の動画をアップロードしたいと思います. コードの紹介 スマホから画像を取得してから,テンプレートマッチングしてその結果を可視化したプログラムです. def _click_image3_vis(temp_path): ############################################################### # 画像取得 # # テンプレート画像の読み込み temp = cv2.imread(temp_path) # # スマホのキャプチャ画像 img = capture_screen_2(device_id) # # デバッグ用に一応保存 cv2.imwrite('_screen.png', img) ############################################################### # デバッグ用 # # img = cv2.imread('_screen.png') # temp_path = r'img\fgo\arts.png' # temp = cv2.imread(temp_path) # cv2.imwrite('_screen.png', img) result = cv2.matchTemplate(img, temp, cv2.TM_CCOEFF_NORMED) # 最も類似度が高い位置を取得する。 minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(result) # print(f"max value: {maxVal}, position: {maxLoc}, temp_path: {temp_path}") # print("max value:{:6.3f}, position:{:<10}, temp_path:{}".format(maxVal, maxLoc, temp_path)) print("max value:{:6.3f}, position:{:>16}, temp_path:{}".format(maxVal, "{}".format(maxLoc), temp_path)) ############################################################### # 確認用描画セクション # # 読み込んだ画像の高さと幅を取得 kenel_size = 201 height = img.shape[0] width = img.shape[1] # # ============================================================= # show resized base image resized_img = cv2.resize(img,(int(width/2), int(height/2))) cv2.imshow("image", resized_img) cv2.moveWindow("image", 0, 0) # # ============================================================= # show heat map & roi # # create heat map # # 0.5 以下は無視 result[result<0.5] = 0 # 3 channel heat_map heat_map = np.zeros((img.shape[0], img.shape[1], 3)) # result to heatmap heat_map[0:-temp.shape[0]+1, 0:-temp.shape[1]+1, 2] = result # heatmap GaussianBlur heat_map_blur = cv2.GaussianBlur(heat_map,(kenel_size, kenel_size),0) result2 = heat_map[:, :, 2] # # create gray image resized_img_gray = resized_img.copy() img_gray = cv2.cvtColor(resized_img, cv2.COLOR_BGR2GRAY) # RGB2〜 でなく BGR2〜 を指定 for i in range(3): resized_img_gray[:, :, i] = img_gray # temp image show cv2.imshow("temp", temp) cv2.moveWindow("temp", int(resized_img.shape[1]), 0) # resized heat_map resized_heat_map = cv2.resize(heat_map_blur,(int(width/2), int(height/2))) * 255 # resized heat_map xheat = (resized_heat_map *255 * 0.6 + resized_img_gray * 0.4)/255 # detect peak coordinates = peak_local_max(resized_heat_map[:, :, 2], min_distance=2) # draw rectangle color_ = np.array([102, 51, 255])/255 # RGB -> GBR for p in coordinates: cv2.rectangle(xheat, (p[1]+int(temp.shape[1]/2), p[0]+int(temp.shape[0]/2)), (p[1], p[0]), color_, thickness=1) # show heat map cv2.imshow("heat", xheat) cv2.moveWindow("heat", 0, int(resized_img.shape[0] + 50)) k = cv2.waitKey(1) おわりに 今回はadbコマンドと画像処理を組み合わせたコードを紹介しました. これでオート周回するプログラムができます. 今後は別ゲームへの対応や戦略アルゴリズムの開発をやっていく予定です.
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

CloudWatchのエラーログをSlackに通知する

いちいちLaravelのログを見るのがめんどくさいと思いCloudWatch Logsに転送しました。しかし、Slackに通知させた方がより便利だと思ったので今回は下記のような構成で行きます。 通知したいロググループに対してメトリクスフィルターを作成する CloudWatchにて通知したいEC2ののロググループを選択し、「 アクション 」「 メトリクスフィルターを作成する 」をクリック フィルターパターンはERRORログを出力したいのでERRORとします。そして、メトリクスフィルターを作成しましょう。 SNSのトピックを作成しましょう 任意の名前でさくっと作りましょう。 Lambdaの処理 Lambdaの構成はこんな感じになります。 SNSには作成したトピックを割り当てます。 lambda_function.py import json import urllib.request import logging from collections import OrderedDict import os import datetime import calendar import boto3 logger = logging.getLogger() logger.setLevel(logging.INFO) #抽出するログデータの最大件数 OUTPUT_LIMIT=5 #何分前までを抽出対象期間とするか TIME_FROM_MIN=5 def lambda_handler(event, context): logger.info("Event: " + str(event)) message = json.loads(event['Records'][0]['Sns']['Message']) logs = boto3.client('logs') # MetricNameとNamespaceをキーにメトリクスフィルタの情報を取得する。 metricfilters = logs.describe_metric_filters( metricName = message['Trigger']['MetricName'] , metricNamespace = message['Trigger']['Namespace'] ) logger.info("Metricfilters: " + str(metricfilters)) #ログストリームの抽出対象時刻をUNIXタイムに変換(取得期間は TIME_FROM_MIN 分前以降) #終了時刻はアラーム発生時刻の1分後 timeto = datetime.datetime.strptime(message['StateChangeTime'][:19] ,'%Y-%m-%dT%H:%M:%S') + datetime.timedelta(minutes=1) u_to = calendar.timegm(timeto.utctimetuple()) * 1000 #開始時刻は終了時刻のTIME_FROM_MIN分前 timefrom = timeto - datetime.timedelta(minutes=TIME_FROM_MIN) u_from = calendar.timegm(timefrom.utctimetuple()) * 1000 # ログストリームからログデータを取得 response = logs.filter_log_events( logGroupName = metricfilters['metricFilters'][0]['logGroupName'] , filterPattern = metricfilters['metricFilters'][0]['filterPattern'], startTime = u_from, endTime = u_to, limit = OUTPUT_LIMIT ) # メッセージを整形しつつslackに通知 for event in response['events']: postText = ''' {logStreamName} {message} '''.format( logStreamName=str(event['logStreamName']), message=str(event['message'])).strip() logger.info("Response: " + str(response)) send_data = { "text": postText, } send_text = json.dumps(send_data) request = urllib.request.Request( "https://hooks.slack.com/services/xxxxxxxxx/xxxxxxxxx/xxxxxxx", data=send_text.encode('utf-8'), method="POST" ) with urllib.request.urlopen(request) as response: response_body = response.read().decode('utf-8') IAMロールの設定 IAMロールにて先ほど作成したLambda関数にポリシーをアタッチします。 そして、AWSLambdaBasicExecutionRoleをクリックしてにポリシーの編集を行います。 { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "logs:CreateLogGroup", "Resource": "arn:aws:logs:ap-northeast-1:009554248005:*" }, { "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:PutLogEvents", "logs:DescribeMetricFilters" ], "Resource": [ "arn:aws:logs:ap-northeast-1:009554248005:log-group:/aws/lambda/cloudwatch:*" ] } ] }  CloudWatch Alarmを設定します  CloudWatch Alarmにてアラームを作成します。設定は以下の通りです。しきい値が1以上を超えたらSNSトピックに送信するように設定します。  送信するSNSトピックは先ほど作成したものを選択  Slackの設定  https://w1618578007-hxz964946.slack.com/intl/ja-jp/apps を開き、「 マストアプリ 」をクリックし、検索窓で「 Incoming Webhook 」と検索  そしてSlackに追加して通知させたいチャンネルを選択します。その後、生成されたWebhook URLをコピーしましょう。のちに使います。  最後に確認します 意図的にログを吐くようにして、このような通知が来れば完了です。アイコンやアプリ名はカスタマイズすることも可能ですよ。  参考文献 ・ https://qiita.com/yahagin/items/2248287c5285cd1e9201 ・ https://blog.chakimar.net/aws-chatbot-cloudwatch-logs/
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

VBAでPython3

まずはpythonの用意 純正でも、コンダでも、embedでも pythonの実行環境を作る 次に、VBAの準備 標準モジュールに python実行するモジュール Option Explicit ' シェルの実行 Public Function run(ByVal cmd As String) As Variant Dim WSH, wExec As Object Set WSH = CreateObject("WScript.Shell") '実行 'Set wExec = WSh.Exec("%ComSpec% /c " & cmd) Set wExec = WSH.exec(cmd) '実行結果 Dim Result, Err wExec.StdIn.WriteLine "echo 処理中" Result = wExec.StdOut.ReadAll Err = wExec.StdErr.ReadAll If Err <> "" Then Debug.Print "Error:" & Err End If '解放 Set wExec = Nothing Set WSH = Nothing run = shape(Result) End Function ' レスポンスの整形 Public Function shape(ByVal v) As Variant If v = "" Then End '整形 Dim str_lines As Variant '引数を行毎見ていって、空白以外を再編集する If UBound(Split(v, vbLf)) > 0 Then str_lines = Split(v, vbLf) ElseIf UBound(Split(v, vbCr)) > 0 Then str_lines = Split(v, vbCr) ElseIf UBound(Split(v, vbCrLf)) > 0 Then str_lines = Split(v, vbCrLf) End If ' 返却用に空白なしリストにする Dim res_list() As Variant Dim i, res_cnt As Long res_cnt = 0 For i = 0 To UBound(str_lines) If str_lines(i) <> "" Then ' 行末の改行コードを飛ばしつつリストに追加 ReDim Preserve res_list(res_cnt) res_list(res_cnt) = Left(str_lines(i), Len(str_lines(i)) - 1) res_cnt = res_cnt + 1 End If Next i shape = res_list End Function ' pythonの実行 Public Function run(ByVal interpreter_path As String, ByVal source_path As String, Optional ByVal args As String) As Variant If IsMissing(args) Then run = shell.run(interpreter_path & " " & source_path) Else run = shell.run(interpreter_path & " " & source_path & " " & args) End If End Function pythonを呼び出す(今回はボタン) Private Sub CommandButton1_Click() Dim py, src, arg ' py = com.desktop_path & "\..\emb-python\python-3.9.4-embed-win32\pythonw" py = com.desktop_path & "\..\miniconda3\pythonw" src = "-c" arg = """exec(""""" _ & "from datetime import datetime" & "\n" _ & "import time" & "\n" _ & "for i in range(5):" & "\n" _ & "\t" & "print(datetime.now())" & "\n" _ & "\t" & "time.sleep(1)" & "\n" _ & """"")""" Dim res res = python.run(py, src, arg) Dim i For i = 0 To UBound(res) Debug.Print res(i) Next i End Sub py:pythonの実行ファイル(pythonだとコンソールが表示される) src:pyファイル arg:コマンドライン引数など 上のはcコマンドを使っての実行
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

論文のモデルを自分で実装する ResNet編

はじめに 機械学習のために理論を理解しておくのは十分必要なわけですが、やはり手を動かさないと何も進まなそう、ということで、自分でいろんなネットワークを実装してみる修行を始めようと思います。 そこで、まず初めにResNetから行こう、ということで、書かせていただきます。 前まで書いてた記事とはえらく楽した記事になっていて、読みにくいかもしれません。そこはごめんなさい。 論文 Deep Residual Learning for Image Recognition 1回目 とりあえず、ざっと書いてみます 初めに書いたコード from typing import Union import tensorflow as tf from tensorflow.keras.applications import ResNet50 as _ResNet50 from tensorflow.keras.layers import (Activation, Add, BatchNormalization, Conv2D, Input, MaxPooling2D, GlobalAveragePooling2D, Dense) from tensorflow.keras.models import Model class ResNet(): """ResNet Architecture""" __LAYER_LOOPS = { '18' : [2,2,2,2], '34' : [3,4,6,3], '50' : [3,4,6,3], '101' : [3,4,23,3], '152' : [3,8,36,3] } def __init__(self, input_ch:tuple, output_ch:int, layers:str): try: self._range = self.__LAYER_LOOPS[layers] except KeyError: raise ValueError('ResNet layers must be [18, 34, 50, 101, 152].') self.input_ch = input_ch self.output_ch = output_ch self.layers = layers self.index = 0 def conv_bn_act(self, x, filters:Union[int, tuple, list], kernel_size:Union[int, tuple, list], strides=(1,1)): """ Conv2D + BatchNormalization + Relu """ x = Conv2D(filters=filters, kernel_size=kernel_size, strides=strides)(x) x = BatchNormalization()(x) x = Activation('relu')(x) return x def conv_x(self, x, times): """conv2_x""" y = x for _ in range(self._range[self.index]): if self.layers == 18: x = self.conv_bn_act(x, 3, 64*(2**times)) x = self.conv_bn_act(x, 3, 64*(2**times)) elif self.layers == 34: x = self.conv_bn_act(x, 3, 64*(2**times)) x = self.conv_bn_act(x, 3, 64*(2**times)) else: x = self.conv_bn_act(x, 1, 64*(2**times)) x = self.conv_bn_act(x, 3, 64*(2**times)) x = self.conv_bn_act(x, 1, 256*(2**times)) x = Add()[y, x] x = Activation('relu')(x) self.index += 1 return x def build_resnet(self): input = Input(shape=self.input_ch) # 7x7 conv, 64, /2 x = self.conv_bn_act(input, filters=64, kernel_size=7, strides=(2,2)) # pool, /2 x = MaxPooling2D(pool_size=(3,3), strides=2)(x) # conv2_x x = self.conv_x(x, 0) # conv3_x x = self.conv_x(x, 1) # conv4_x x = self.conv_x(x, 2) # conv5_x x = self.conv_x(x, 3) # average pool, softmax x = GlobalAveragePooling2D()(x) x = Dense(units = self.output_ch, activation='softmax')(x) model = Model(inputs = input, outputs = x) return model resnet_50 = ResNet(input_ch = (512, 512, 3), output_ch=100, layers='50') model = resnet_50.build_resnet() model.summary() 結果 ValueError: Negative dimension size caused by subtracting 64 from 63 for '{{node conv2d_2/Conv2D}} = Conv2D[T=DT_FLOAT, data_format="NHWC", dilations=[1, 1, 1, 1], explicit_paddings=[], padding="VALID", strides=[1, 1, 1, 1], use_cudnn_on_gpu=true](Placeholder, conv2d_2/Conv2D/ReadVariableOp)' with input shapes: [?,63,63,1], [64,64,1,3]. oof 2回目 50行目辺りが原因でした。ふつうに引数間違いです。 あと、layers.Addで重大ミス犯してました。リストは指定できないわな… 結果 ValueError: Operands could not be broadcast together with shapes (126, 126, 64) (120, 120, 256) oof… 3回目 解決ができたのでざっと書きます。 Addの場所が違ってたり、結合前の畳み込みのActivationはしないという所が辺でした。 shapeが違うということは、3x3の畳み込みでpadding='same'してない所が原因そうです(理由は「CNNと画像認識による構造の違いについて」の記事で説明しています)。また50層以上の場合、結合前の畳み込みでフィルターが4倍になっているので、畳んでない方(論文中の、いわゆる$\bf x$)についても同じフィルタサイズで畳み込みしておく必要がありそうです。 関数conv_xの初めのstrideを2にするのを忘れてました。stride=1だとずっとhとwのサイズが減りません… 結果 出力 __________________________________________________________________________________________________ Layer (type) Output Shape Param # Connected to ================================================================================================== input_1 (InputLayer) [(None, 512, 512, 3) 0 __________________________________________________________________________________________________ conv2d (Conv2D) (None, 253, 253, 64) 9472 input_1[0][0] __________________________________________________________________________________________________ batch_normalization (BatchNorma (None, 253, 253, 64) 256 conv2d[0][0] __________________________________________________________________________________________________ activation (Activation) (None, 253, 253, 64) 0 batch_normalization[0][0] __________________________________________________________________________________________________ max_pooling2d (MaxPooling2D) (None, 126, 126, 64) 0 activation[0][0] __________________________________________________________________________________________________ conv2d_2 (Conv2D) (None, 63, 63, 64) 4160 max_pooling2d[0][0] __________________________________________________________________________________________________ batch_normalization_2 (BatchNor (None, 63, 63, 64) 256 conv2d_2[0][0] __________________________________________________________________________________________________ activation_1 (Activation) (None, 63, 63, 64) 0 batch_normalization_2[0][0] __________________________________________________________________________________________________ conv2d_3 (Conv2D) (None, 63, 63, 64) 36928 activation_1[0][0] __________________________________________________________________________________________________ batch_normalization_3 (BatchNor (None, 63, 63, 64) 256 conv2d_3[0][0] __________________________________________________________________________________________________ activation_2 (Activation) (None, 63, 63, 64) 0 batch_normalization_3[0][0] __________________________________________________________________________________________________ conv2d_1 (Conv2D) (None, 63, 63, 256) 16640 max_pooling2d[0][0] __________________________________________________________________________________________________ conv2d_4 (Conv2D) (None, 63, 63, 256) 16640 activation_2[0][0] __________________________________________________________________________________________________ batch_normalization_1 (BatchNor (None, 63, 63, 256) 1024 conv2d_1[0][0] __________________________________________________________________________________________________ batch_normalization_4 (BatchNor (None, 63, 63, 256) 1024 conv2d_4[0][0] __________________________________________________________________________________________________ add (Add) (None, 63, 63, 256) 0 batch_normalization_1[0][0] batch_normalization_4[0][0] __________________________________________________________________________________________________ activation_3 (Activation) (None, 63, 63, 256) 0 add[0][0] __________________________________________________________________________________________________ conv2d_6 (Conv2D) (None, 63, 63, 64) 16448 activation_3[0][0] __________________________________________________________________________________________________ batch_normalization_6 (BatchNor (None, 63, 63, 64) 256 conv2d_6[0][0] __________________________________________________________________________________________________ activation_4 (Activation) (None, 63, 63, 64) 0 batch_normalization_6[0][0] __________________________________________________________________________________________________ conv2d_7 (Conv2D) (None, 63, 63, 64) 36928 activation_4[0][0] __________________________________________________________________________________________________ batch_normalization_7 (BatchNor (None, 63, 63, 64) 256 conv2d_7[0][0] __________________________________________________________________________________________________ activation_5 (Activation) (None, 63, 63, 64) 0 batch_normalization_7[0][0] __________________________________________________________________________________________________ conv2d_5 (Conv2D) (None, 63, 63, 256) 65792 activation_3[0][0] __________________________________________________________________________________________________ conv2d_8 (Conv2D) (None, 63, 63, 256) 16640 activation_5[0][0] __________________________________________________________________________________________________ batch_normalization_5 (BatchNor (None, 63, 63, 256) 1024 conv2d_5[0][0] __________________________________________________________________________________________________ batch_normalization_8 (BatchNor (None, 63, 63, 256) 1024 conv2d_8[0][0] __________________________________________________________________________________________________ add_1 (Add) (None, 63, 63, 256) 0 batch_normalization_5[0][0] batch_normalization_8[0][0] __________________________________________________________________________________________________ activation_6 (Activation) (None, 63, 63, 256) 0 add_1[0][0] __________________________________________________________________________________________________ conv2d_10 (Conv2D) (None, 63, 63, 64) 16448 activation_6[0][0] __________________________________________________________________________________________________ batch_normalization_10 (BatchNo (None, 63, 63, 64) 256 conv2d_10[0][0] __________________________________________________________________________________________________ activation_7 (Activation) (None, 63, 63, 64) 0 batch_normalization_10[0][0] __________________________________________________________________________________________________ conv2d_11 (Conv2D) (None, 63, 63, 64) 36928 activation_7[0][0] __________________________________________________________________________________________________ batch_normalization_11 (BatchNo (None, 63, 63, 64) 256 conv2d_11[0][0] __________________________________________________________________________________________________ activation_8 (Activation) (None, 63, 63, 64) 0 batch_normalization_11[0][0] __________________________________________________________________________________________________ conv2d_9 (Conv2D) (None, 63, 63, 256) 65792 activation_6[0][0] __________________________________________________________________________________________________ conv2d_12 (Conv2D) (None, 63, 63, 256) 16640 activation_8[0][0] __________________________________________________________________________________________________ batch_normalization_9 (BatchNor (None, 63, 63, 256) 1024 conv2d_9[0][0] __________________________________________________________________________________________________ batch_normalization_12 (BatchNo (None, 63, 63, 256) 1024 conv2d_12[0][0] __________________________________________________________________________________________________ add_2 (Add) (None, 63, 63, 256) 0 batch_normalization_9[0][0] batch_normalization_12[0][0] __________________________________________________________________________________________________ activation_9 (Activation) (None, 63, 63, 256) 0 add_2[0][0] __________________________________________________________________________________________________ conv2d_14 (Conv2D) (None, 32, 32, 128) 32896 activation_9[0][0] __________________________________________________________________________________________________ batch_normalization_14 (BatchNo (None, 32, 32, 128) 512 conv2d_14[0][0] __________________________________________________________________________________________________ activation_10 (Activation) (None, 32, 32, 128) 0 batch_normalization_14[0][0] __________________________________________________________________________________________________ conv2d_15 (Conv2D) (None, 32, 32, 128) 147584 activation_10[0][0] __________________________________________________________________________________________________ batch_normalization_15 (BatchNo (None, 32, 32, 128) 512 conv2d_15[0][0] __________________________________________________________________________________________________ activation_11 (Activation) (None, 32, 32, 128) 0 batch_normalization_15[0][0] __________________________________________________________________________________________________ conv2d_13 (Conv2D) (None, 32, 32, 512) 131584 activation_9[0][0] __________________________________________________________________________________________________ conv2d_16 (Conv2D) (None, 32, 32, 512) 66048 activation_11[0][0] __________________________________________________________________________________________________ batch_normalization_13 (BatchNo (None, 32, 32, 512) 2048 conv2d_13[0][0] __________________________________________________________________________________________________ batch_normalization_16 (BatchNo (None, 32, 32, 512) 2048 conv2d_16[0][0] __________________________________________________________________________________________________ add_3 (Add) (None, 32, 32, 512) 0 batch_normalization_13[0][0] batch_normalization_16[0][0] __________________________________________________________________________________________________ activation_12 (Activation) (None, 32, 32, 512) 0 add_3[0][0] __________________________________________________________________________________________________ conv2d_18 (Conv2D) (None, 32, 32, 128) 65664 activation_12[0][0] __________________________________________________________________________________________________ batch_normalization_18 (BatchNo (None, 32, 32, 128) 512 conv2d_18[0][0] __________________________________________________________________________________________________ activation_13 (Activation) (None, 32, 32, 128) 0 batch_normalization_18[0][0] __________________________________________________________________________________________________ conv2d_19 (Conv2D) (None, 32, 32, 128) 147584 activation_13[0][0] __________________________________________________________________________________________________ batch_normalization_19 (BatchNo (None, 32, 32, 128) 512 conv2d_19[0][0] __________________________________________________________________________________________________ activation_14 (Activation) (None, 32, 32, 128) 0 batch_normalization_19[0][0] __________________________________________________________________________________________________ conv2d_17 (Conv2D) (None, 32, 32, 512) 262656 activation_12[0][0] __________________________________________________________________________________________________ conv2d_20 (Conv2D) (None, 32, 32, 512) 66048 activation_14[0][0] __________________________________________________________________________________________________ batch_normalization_17 (BatchNo (None, 32, 32, 512) 2048 conv2d_17[0][0] __________________________________________________________________________________________________ batch_normalization_20 (BatchNo (None, 32, 32, 512) 2048 conv2d_20[0][0] __________________________________________________________________________________________________ add_4 (Add) (None, 32, 32, 512) 0 batch_normalization_17[0][0] batch_normalization_20[0][0] __________________________________________________________________________________________________ activation_15 (Activation) (None, 32, 32, 512) 0 add_4[0][0] __________________________________________________________________________________________________ conv2d_22 (Conv2D) (None, 32, 32, 128) 65664 activation_15[0][0] __________________________________________________________________________________________________ batch_normalization_22 (BatchNo (None, 32, 32, 128) 512 conv2d_22[0][0] __________________________________________________________________________________________________ activation_16 (Activation) (None, 32, 32, 128) 0 batch_normalization_22[0][0] __________________________________________________________________________________________________ conv2d_23 (Conv2D) (None, 32, 32, 128) 147584 activation_16[0][0] __________________________________________________________________________________________________ batch_normalization_23 (BatchNo (None, 32, 32, 128) 512 conv2d_23[0][0] __________________________________________________________________________________________________ activation_17 (Activation) (None, 32, 32, 128) 0 batch_normalization_23[0][0] __________________________________________________________________________________________________ conv2d_21 (Conv2D) (None, 32, 32, 512) 262656 activation_15[0][0] __________________________________________________________________________________________________ conv2d_24 (Conv2D) (None, 32, 32, 512) 66048 activation_17[0][0] __________________________________________________________________________________________________ batch_normalization_21 (BatchNo (None, 32, 32, 512) 2048 conv2d_21[0][0] __________________________________________________________________________________________________ batch_normalization_24 (BatchNo (None, 32, 32, 512) 2048 conv2d_24[0][0] __________________________________________________________________________________________________ add_5 (Add) (None, 32, 32, 512) 0 batch_normalization_21[0][0] batch_normalization_24[0][0] __________________________________________________________________________________________________ activation_18 (Activation) (None, 32, 32, 512) 0 add_5[0][0] __________________________________________________________________________________________________ conv2d_26 (Conv2D) (None, 32, 32, 128) 65664 activation_18[0][0] __________________________________________________________________________________________________ batch_normalization_26 (BatchNo (None, 32, 32, 128) 512 conv2d_26[0][0] __________________________________________________________________________________________________ activation_19 (Activation) (None, 32, 32, 128) 0 batch_normalization_26[0][0] __________________________________________________________________________________________________ conv2d_27 (Conv2D) (None, 32, 32, 128) 147584 activation_19[0][0] __________________________________________________________________________________________________ batch_normalization_27 (BatchNo (None, 32, 32, 128) 512 conv2d_27[0][0] __________________________________________________________________________________________________ activation_20 (Activation) (None, 32, 32, 128) 0 batch_normalization_27[0][0] __________________________________________________________________________________________________ conv2d_25 (Conv2D) (None, 32, 32, 512) 262656 activation_18[0][0] __________________________________________________________________________________________________ conv2d_28 (Conv2D) (None, 32, 32, 512) 66048 activation_20[0][0] __________________________________________________________________________________________________ batch_normalization_25 (BatchNo (None, 32, 32, 512) 2048 conv2d_25[0][0] __________________________________________________________________________________________________ batch_normalization_28 (BatchNo (None, 32, 32, 512) 2048 conv2d_28[0][0] __________________________________________________________________________________________________ add_6 (Add) (None, 32, 32, 512) 0 batch_normalization_25[0][0] batch_normalization_28[0][0] __________________________________________________________________________________________________ activation_21 (Activation) (None, 32, 32, 512) 0 add_6[0][0] __________________________________________________________________________________________________ conv2d_30 (Conv2D) (None, 16, 16, 256) 131328 activation_21[0][0] __________________________________________________________________________________________________ batch_normalization_30 (BatchNo (None, 16, 16, 256) 1024 conv2d_30[0][0] __________________________________________________________________________________________________ activation_22 (Activation) (None, 16, 16, 256) 0 batch_normalization_30[0][0] __________________________________________________________________________________________________ conv2d_31 (Conv2D) (None, 16, 16, 256) 590080 activation_22[0][0] __________________________________________________________________________________________________ batch_normalization_31 (BatchNo (None, 16, 16, 256) 1024 conv2d_31[0][0] __________________________________________________________________________________________________ activation_23 (Activation) (None, 16, 16, 256) 0 batch_normalization_31[0][0] __________________________________________________________________________________________________ conv2d_29 (Conv2D) (None, 16, 16, 1024) 525312 activation_21[0][0] __________________________________________________________________________________________________ conv2d_32 (Conv2D) (None, 16, 16, 1024) 263168 activation_23[0][0] __________________________________________________________________________________________________ batch_normalization_29 (BatchNo (None, 16, 16, 1024) 4096 conv2d_29[0][0] __________________________________________________________________________________________________ batch_normalization_32 (BatchNo (None, 16, 16, 1024) 4096 conv2d_32[0][0] __________________________________________________________________________________________________ add_7 (Add) (None, 16, 16, 1024) 0 batch_normalization_29[0][0] batch_normalization_32[0][0] __________________________________________________________________________________________________ activation_24 (Activation) (None, 16, 16, 1024) 0 add_7[0][0] __________________________________________________________________________________________________ conv2d_34 (Conv2D) (None, 16, 16, 256) 262400 activation_24[0][0] __________________________________________________________________________________________________ batch_normalization_34 (BatchNo (None, 16, 16, 256) 1024 conv2d_34[0][0] __________________________________________________________________________________________________ activation_25 (Activation) (None, 16, 16, 256) 0 batch_normalization_34[0][0] __________________________________________________________________________________________________ conv2d_35 (Conv2D) (None, 16, 16, 256) 590080 activation_25[0][0] __________________________________________________________________________________________________ batch_normalization_35 (BatchNo (None, 16, 16, 256) 1024 conv2d_35[0][0] __________________________________________________________________________________________________ activation_26 (Activation) (None, 16, 16, 256) 0 batch_normalization_35[0][0] __________________________________________________________________________________________________ conv2d_33 (Conv2D) (None, 16, 16, 1024) 1049600 activation_24[0][0] __________________________________________________________________________________________________ conv2d_36 (Conv2D) (None, 16, 16, 1024) 263168 activation_26[0][0] __________________________________________________________________________________________________ batch_normalization_33 (BatchNo (None, 16, 16, 1024) 4096 conv2d_33[0][0] __________________________________________________________________________________________________ batch_normalization_36 (BatchNo (None, 16, 16, 1024) 4096 conv2d_36[0][0] __________________________________________________________________________________________________ add_8 (Add) (None, 16, 16, 1024) 0 batch_normalization_33[0][0] batch_normalization_36[0][0] __________________________________________________________________________________________________ activation_27 (Activation) (None, 16, 16, 1024) 0 add_8[0][0] __________________________________________________________________________________________________ conv2d_38 (Conv2D) (None, 16, 16, 256) 262400 activation_27[0][0] __________________________________________________________________________________________________ batch_normalization_38 (BatchNo (None, 16, 16, 256) 1024 conv2d_38[0][0] __________________________________________________________________________________________________ activation_28 (Activation) (None, 16, 16, 256) 0 batch_normalization_38[0][0] __________________________________________________________________________________________________ conv2d_39 (Conv2D) (None, 16, 16, 256) 590080 activation_28[0][0] __________________________________________________________________________________________________ batch_normalization_39 (BatchNo (None, 16, 16, 256) 1024 conv2d_39[0][0] __________________________________________________________________________________________________ activation_29 (Activation) (None, 16, 16, 256) 0 batch_normalization_39[0][0] __________________________________________________________________________________________________ conv2d_37 (Conv2D) (None, 16, 16, 1024) 1049600 activation_27[0][0] __________________________________________________________________________________________________ conv2d_40 (Conv2D) (None, 16, 16, 1024) 263168 activation_29[0][0] __________________________________________________________________________________________________ batch_normalization_37 (BatchNo (None, 16, 16, 1024) 4096 conv2d_37[0][0] __________________________________________________________________________________________________ batch_normalization_40 (BatchNo (None, 16, 16, 1024) 4096 conv2d_40[0][0] __________________________________________________________________________________________________ add_9 (Add) (None, 16, 16, 1024) 0 batch_normalization_37[0][0] batch_normalization_40[0][0] __________________________________________________________________________________________________ activation_30 (Activation) (None, 16, 16, 1024) 0 add_9[0][0] __________________________________________________________________________________________________ conv2d_42 (Conv2D) (None, 16, 16, 256) 262400 activation_30[0][0] __________________________________________________________________________________________________ batch_normalization_42 (BatchNo (None, 16, 16, 256) 1024 conv2d_42[0][0] __________________________________________________________________________________________________ activation_31 (Activation) (None, 16, 16, 256) 0 batch_normalization_42[0][0] __________________________________________________________________________________________________ conv2d_43 (Conv2D) (None, 16, 16, 256) 590080 activation_31[0][0] __________________________________________________________________________________________________ batch_normalization_43 (BatchNo (None, 16, 16, 256) 1024 conv2d_43[0][0] __________________________________________________________________________________________________ activation_32 (Activation) (None, 16, 16, 256) 0 batch_normalization_43[0][0] __________________________________________________________________________________________________ conv2d_41 (Conv2D) (None, 16, 16, 1024) 1049600 activation_30[0][0] __________________________________________________________________________________________________ conv2d_44 (Conv2D) (None, 16, 16, 1024) 263168 activation_32[0][0] __________________________________________________________________________________________________ batch_normalization_41 (BatchNo (None, 16, 16, 1024) 4096 conv2d_41[0][0] __________________________________________________________________________________________________ batch_normalization_44 (BatchNo (None, 16, 16, 1024) 4096 conv2d_44[0][0] __________________________________________________________________________________________________ add_10 (Add) (None, 16, 16, 1024) 0 batch_normalization_41[0][0] batch_normalization_44[0][0] __________________________________________________________________________________________________ activation_33 (Activation) (None, 16, 16, 1024) 0 add_10[0][0] __________________________________________________________________________________________________ conv2d_46 (Conv2D) (None, 16, 16, 256) 262400 activation_33[0][0] __________________________________________________________________________________________________ batch_normalization_46 (BatchNo (None, 16, 16, 256) 1024 conv2d_46[0][0] __________________________________________________________________________________________________ activation_34 (Activation) (None, 16, 16, 256) 0 batch_normalization_46[0][0] __________________________________________________________________________________________________ conv2d_47 (Conv2D) (None, 16, 16, 256) 590080 activation_34[0][0] __________________________________________________________________________________________________ batch_normalization_47 (BatchNo (None, 16, 16, 256) 1024 conv2d_47[0][0] __________________________________________________________________________________________________ activation_35 (Activation) (None, 16, 16, 256) 0 batch_normalization_47[0][0] __________________________________________________________________________________________________ conv2d_45 (Conv2D) (None, 16, 16, 1024) 1049600 activation_33[0][0] __________________________________________________________________________________________________ conv2d_48 (Conv2D) (None, 16, 16, 1024) 263168 activation_35[0][0] __________________________________________________________________________________________________ batch_normalization_45 (BatchNo (None, 16, 16, 1024) 4096 conv2d_45[0][0] __________________________________________________________________________________________________ batch_normalization_48 (BatchNo (None, 16, 16, 1024) 4096 conv2d_48[0][0] __________________________________________________________________________________________________ add_11 (Add) (None, 16, 16, 1024) 0 batch_normalization_45[0][0] batch_normalization_48[0][0] __________________________________________________________________________________________________ activation_36 (Activation) (None, 16, 16, 1024) 0 add_11[0][0] __________________________________________________________________________________________________ conv2d_50 (Conv2D) (None, 16, 16, 256) 262400 activation_36[0][0] __________________________________________________________________________________________________ batch_normalization_50 (BatchNo (None, 16, 16, 256) 1024 conv2d_50[0][0] __________________________________________________________________________________________________ activation_37 (Activation) (None, 16, 16, 256) 0 batch_normalization_50[0][0] __________________________________________________________________________________________________ conv2d_51 (Conv2D) (None, 16, 16, 256) 590080 activation_37[0][0] __________________________________________________________________________________________________ batch_normalization_51 (BatchNo (None, 16, 16, 256) 1024 conv2d_51[0][0] __________________________________________________________________________________________________ activation_38 (Activation) (None, 16, 16, 256) 0 batch_normalization_51[0][0] __________________________________________________________________________________________________ conv2d_49 (Conv2D) (None, 16, 16, 1024) 1049600 activation_36[0][0] __________________________________________________________________________________________________ conv2d_52 (Conv2D) (None, 16, 16, 1024) 263168 activation_38[0][0] __________________________________________________________________________________________________ batch_normalization_49 (BatchNo (None, 16, 16, 1024) 4096 conv2d_49[0][0] __________________________________________________________________________________________________ batch_normalization_52 (BatchNo (None, 16, 16, 1024) 4096 conv2d_52[0][0] __________________________________________________________________________________________________ add_12 (Add) (None, 16, 16, 1024) 0 batch_normalization_49[0][0] batch_normalization_52[0][0] __________________________________________________________________________________________________ activation_39 (Activation) (None, 16, 16, 1024) 0 add_12[0][0] __________________________________________________________________________________________________ conv2d_54 (Conv2D) (None, 8, 8, 512) 524800 activation_39[0][0] __________________________________________________________________________________________________ batch_normalization_54 (BatchNo (None, 8, 8, 512) 2048 conv2d_54[0][0] __________________________________________________________________________________________________ activation_40 (Activation) (None, 8, 8, 512) 0 batch_normalization_54[0][0] __________________________________________________________________________________________________ conv2d_55 (Conv2D) (None, 8, 8, 512) 2359808 activation_40[0][0] __________________________________________________________________________________________________ batch_normalization_55 (BatchNo (None, 8, 8, 512) 2048 conv2d_55[0][0] __________________________________________________________________________________________________ activation_41 (Activation) (None, 8, 8, 512) 0 batch_normalization_55[0][0] __________________________________________________________________________________________________ conv2d_53 (Conv2D) (None, 8, 8, 2048) 2099200 activation_39[0][0] __________________________________________________________________________________________________ conv2d_56 (Conv2D) (None, 8, 8, 2048) 1050624 activation_41[0][0] __________________________________________________________________________________________________ batch_normalization_53 (BatchNo (None, 8, 8, 2048) 8192 conv2d_53[0][0] __________________________________________________________________________________________________ batch_normalization_56 (BatchNo (None, 8, 8, 2048) 8192 conv2d_56[0][0] __________________________________________________________________________________________________ add_13 (Add) (None, 8, 8, 2048) 0 batch_normalization_53[0][0] batch_normalization_56[0][0] __________________________________________________________________________________________________ activation_42 (Activation) (None, 8, 8, 2048) 0 add_13[0][0] __________________________________________________________________________________________________ conv2d_58 (Conv2D) (None, 8, 8, 512) 1049088 activation_42[0][0] __________________________________________________________________________________________________ batch_normalization_58 (BatchNo (None, 8, 8, 512) 2048 conv2d_58[0][0] __________________________________________________________________________________________________ activation_43 (Activation) (None, 8, 8, 512) 0 batch_normalization_58[0][0] __________________________________________________________________________________________________ conv2d_59 (Conv2D) (None, 8, 8, 512) 2359808 activation_43[0][0] __________________________________________________________________________________________________ batch_normalization_59 (BatchNo (None, 8, 8, 512) 2048 conv2d_59[0][0] __________________________________________________________________________________________________ activation_44 (Activation) (None, 8, 8, 512) 0 batch_normalization_59[0][0] __________________________________________________________________________________________________ conv2d_57 (Conv2D) (None, 8, 8, 2048) 4196352 activation_42[0][0] __________________________________________________________________________________________________ conv2d_60 (Conv2D) (None, 8, 8, 2048) 1050624 activation_44[0][0] __________________________________________________________________________________________________ batch_normalization_57 (BatchNo (None, 8, 8, 2048) 8192 conv2d_57[0][0] __________________________________________________________________________________________________ batch_normalization_60 (BatchNo (None, 8, 8, 2048) 8192 conv2d_60[0][0] __________________________________________________________________________________________________ add_14 (Add) (None, 8, 8, 2048) 0 batch_normalization_57[0][0] batch_normalization_60[0][0] __________________________________________________________________________________________________ activation_45 (Activation) (None, 8, 8, 2048) 0 add_14[0][0] __________________________________________________________________________________________________ conv2d_62 (Conv2D) (None, 8, 8, 512) 1049088 activation_45[0][0] __________________________________________________________________________________________________ batch_normalization_62 (BatchNo (None, 8, 8, 512) 2048 conv2d_62[0][0] __________________________________________________________________________________________________ activation_46 (Activation) (None, 8, 8, 512) 0 batch_normalization_62[0][0] __________________________________________________________________________________________________ conv2d_63 (Conv2D) (None, 8, 8, 512) 2359808 activation_46[0][0] __________________________________________________________________________________________________ batch_normalization_63 (BatchNo (None, 8, 8, 512) 2048 conv2d_63[0][0] __________________________________________________________________________________________________ activation_47 (Activation) (None, 8, 8, 512) 0 batch_normalization_63[0][0] __________________________________________________________________________________________________ conv2d_61 (Conv2D) (None, 8, 8, 2048) 4196352 activation_45[0][0] __________________________________________________________________________________________________ conv2d_64 (Conv2D) (None, 8, 8, 2048) 1050624 activation_47[0][0] __________________________________________________________________________________________________ batch_normalization_61 (BatchNo (None, 8, 8, 2048) 8192 conv2d_61[0][0] __________________________________________________________________________________________________ batch_normalization_64 (BatchNo (None, 8, 8, 2048) 8192 conv2d_64[0][0] __________________________________________________________________________________________________ add_15 (Add) (None, 8, 8, 2048) 0 batch_normalization_61[0][0] batch_normalization_64[0][0] __________________________________________________________________________________________________ activation_48 (Activation) (None, 8, 8, 2048) 0 add_15[0][0] __________________________________________________________________________________________________ global_average_pooling2d (Globa (None, 2048) 0 activation_48[0][0] __________________________________________________________________________________________________ dense (Dense) (None, 100) 204900 global_average_pooling2d[0][0] ================================================================================================== Total params: 38,397,924 Trainable params: 38,322,276 Non-trainable params: 75,648 __________________________________________________________________________________________________ サマリー出してくれました。うれしい ただ答え合わせしてみたところ、Gobalaveratepoolingする前のhとwが1まわり小さくなっているのが気になります。またはじめのところも253x253になってたりと、もう少し直す必要がありそうです。 4回目 はじめの253になっている部分については、畳み込んだら256になってもらいたいのではZeroPadding2Dで対処します。 hとwが1周り小さくなっているのははじめのMaxPoolingしたときにstrideを2にしてしまっているのが原因っぽそうです。 結果 出力 Layer (type) Output Shape Param # Connected to ================================================================================================== input_1 (InputLayer) [(None, 224, 224, 3) 0 __________________________________________________________________________________________________ zero_padding2d (ZeroPadding2D) (None, 230, 230, 3) 0 input_1[0][0] __________________________________________________________________________________________________ conv2d (Conv2D) (None, 112, 112, 64) 9472 zero_padding2d[0][0] __________________________________________________________________________________________________ batch_normalization (BatchNorma (None, 112, 112, 64) 256 conv2d[0][0] __________________________________________________________________________________________________ activation (Activation) (None, 112, 112, 64) 0 batch_normalization[0][0] __________________________________________________________________________________________________ max_pooling2d (MaxPooling2D) (None, 55, 55, 64) 0 activation[0][0] __________________________________________________________________________________________________ conv2d_2 (Conv2D) (None, 55, 55, 64) 4160 max_pooling2d[0][0] __________________________________________________________________________________________________ batch_normalization_2 (BatchNor (None, 55, 55, 64) 256 conv2d_2[0][0] __________________________________________________________________________________________________ activation_1 (Activation) (None, 55, 55, 64) 0 batch_normalization_2[0][0] __________________________________________________________________________________________________ conv2d_3 (Conv2D) (None, 55, 55, 64) 36928 activation_1[0][0] __________________________________________________________________________________________________ batch_normalization_3 (BatchNor (None, 55, 55, 64) 256 conv2d_3[0][0] __________________________________________________________________________________________________ activation_2 (Activation) (None, 55, 55, 64) 0 batch_normalization_3[0][0] __________________________________________________________________________________________________ conv2d_1 (Conv2D) (None, 55, 55, 256) 16640 max_pooling2d[0][0] __________________________________________________________________________________________________ conv2d_4 (Conv2D) (None, 55, 55, 256) 16640 activation_2[0][0] __________________________________________________________________________________________________ batch_normalization_1 (BatchNor (None, 55, 55, 256) 1024 conv2d_1[0][0] __________________________________________________________________________________________________ batch_normalization_4 (BatchNor (None, 55, 55, 256) 1024 conv2d_4[0][0] __________________________________________________________________________________________________ add (Add) (None, 55, 55, 256) 0 batch_normalization_1[0][0] batch_normalization_4[0][0] __________________________________________________________________________________________________ activation_3 (Activation) (None, 55, 55, 256) 0 add[0][0] __________________________________________________________________________________________________ conv2d_6 (Conv2D) (None, 55, 55, 64) 16448 activation_3[0][0] __________________________________________________________________________________________________ batch_normalization_6 (BatchNor (None, 55, 55, 64) 256 conv2d_6[0][0] __________________________________________________________________________________________________ activation_4 (Activation) (None, 55, 55, 64) 0 batch_normalization_6[0][0] __________________________________________________________________________________________________ conv2d_7 (Conv2D) (None, 55, 55, 64) 36928 activation_4[0][0] __________________________________________________________________________________________________ batch_normalization_7 (BatchNor (None, 55, 55, 64) 256 conv2d_7[0][0] __________________________________________________________________________________________________ activation_5 (Activation) (None, 55, 55, 64) 0 batch_normalization_7[0][0] __________________________________________________________________________________________________ conv2d_5 (Conv2D) (None, 55, 55, 256) 65792 activation_3[0][0] __________________________________________________________________________________________________ conv2d_8 (Conv2D) (None, 55, 55, 256) 16640 activation_5[0][0] __________________________________________________________________________________________________ batch_normalization_5 (BatchNor (None, 55, 55, 256) 1024 conv2d_5[0][0] __________________________________________________________________________________________________ batch_normalization_8 (BatchNor (None, 55, 55, 256) 1024 conv2d_8[0][0] __________________________________________________________________________________________________ add_1 (Add) (None, 55, 55, 256) 0 batch_normalization_5[0][0] batch_normalization_8[0][0] __________________________________________________________________________________________________ activation_6 (Activation) (None, 55, 55, 256) 0 add_1[0][0] __________________________________________________________________________________________________ conv2d_10 (Conv2D) (None, 55, 55, 64) 16448 activation_6[0][0] __________________________________________________________________________________________________ batch_normalization_10 (BatchNo (None, 55, 55, 64) 256 conv2d_10[0][0] __________________________________________________________________________________________________ activation_7 (Activation) (None, 55, 55, 64) 0 batch_normalization_10[0][0] __________________________________________________________________________________________________ conv2d_11 (Conv2D) (None, 55, 55, 64) 36928 activation_7[0][0] __________________________________________________________________________________________________ batch_normalization_11 (BatchNo (None, 55, 55, 64) 256 conv2d_11[0][0] __________________________________________________________________________________________________ activation_8 (Activation) (None, 55, 55, 64) 0 batch_normalization_11[0][0] __________________________________________________________________________________________________ conv2d_9 (Conv2D) (None, 55, 55, 256) 65792 activation_6[0][0] __________________________________________________________________________________________________ conv2d_12 (Conv2D) (None, 55, 55, 256) 16640 activation_8[0][0] __________________________________________________________________________________________________ batch_normalization_9 (BatchNor (None, 55, 55, 256) 1024 conv2d_9[0][0] __________________________________________________________________________________________________ batch_normalization_12 (BatchNo (None, 55, 55, 256) 1024 conv2d_12[0][0] __________________________________________________________________________________________________ add_2 (Add) (None, 55, 55, 256) 0 batch_normalization_9[0][0] batch_normalization_12[0][0] __________________________________________________________________________________________________ activation_9 (Activation) (None, 55, 55, 256) 0 add_2[0][0] __________________________________________________________________________________________________ conv2d_14 (Conv2D) (None, 28, 28, 128) 32896 activation_9[0][0] __________________________________________________________________________________________________ batch_normalization_14 (BatchNo (None, 28, 28, 128) 512 conv2d_14[0][0] __________________________________________________________________________________________________ activation_10 (Activation) (None, 28, 28, 128) 0 batch_normalization_14[0][0] __________________________________________________________________________________________________ conv2d_15 (Conv2D) (None, 28, 28, 128) 147584 activation_10[0][0] __________________________________________________________________________________________________ batch_normalization_15 (BatchNo (None, 28, 28, 128) 512 conv2d_15[0][0] __________________________________________________________________________________________________ activation_11 (Activation) (None, 28, 28, 128) 0 batch_normalization_15[0][0] __________________________________________________________________________________________________ conv2d_13 (Conv2D) (None, 28, 28, 512) 131584 activation_9[0][0] __________________________________________________________________________________________________ conv2d_16 (Conv2D) (None, 28, 28, 512) 66048 activation_11[0][0] __________________________________________________________________________________________________ batch_normalization_13 (BatchNo (None, 28, 28, 512) 2048 conv2d_13[0][0] __________________________________________________________________________________________________ batch_normalization_16 (BatchNo (None, 28, 28, 512) 2048 conv2d_16[0][0] __________________________________________________________________________________________________ add_3 (Add) (None, 28, 28, 512) 0 batch_normalization_13[0][0] batch_normalization_16[0][0] __________________________________________________________________________________________________ activation_12 (Activation) (None, 28, 28, 512) 0 add_3[0][0] __________________________________________________________________________________________________ conv2d_18 (Conv2D) (None, 28, 28, 128) 65664 activation_12[0][0] __________________________________________________________________________________________________ batch_normalization_18 (BatchNo (None, 28, 28, 128) 512 conv2d_18[0][0] __________________________________________________________________________________________________ activation_13 (Activation) (None, 28, 28, 128) 0 batch_normalization_18[0][0] __________________________________________________________________________________________________ conv2d_19 (Conv2D) (None, 28, 28, 128) 147584 activation_13[0][0] __________________________________________________________________________________________________ batch_normalization_19 (BatchNo (None, 28, 28, 128) 512 conv2d_19[0][0] __________________________________________________________________________________________________ activation_14 (Activation) (None, 28, 28, 128) 0 batch_normalization_19[0][0] __________________________________________________________________________________________________ conv2d_17 (Conv2D) (None, 28, 28, 512) 262656 activation_12[0][0] __________________________________________________________________________________________________ conv2d_20 (Conv2D) (None, 28, 28, 512) 66048 activation_14[0][0] __________________________________________________________________________________________________ batch_normalization_17 (BatchNo (None, 28, 28, 512) 2048 conv2d_17[0][0] __________________________________________________________________________________________________ batch_normalization_20 (BatchNo (None, 28, 28, 512) 2048 conv2d_20[0][0] __________________________________________________________________________________________________ add_4 (Add) (None, 28, 28, 512) 0 batch_normalization_17[0][0] batch_normalization_20[0][0] __________________________________________________________________________________________________ activation_15 (Activation) (None, 28, 28, 512) 0 add_4[0][0] __________________________________________________________________________________________________ conv2d_22 (Conv2D) (None, 28, 28, 128) 65664 activation_15[0][0] __________________________________________________________________________________________________ batch_normalization_22 (BatchNo (None, 28, 28, 128) 512 conv2d_22[0][0] __________________________________________________________________________________________________ activation_16 (Activation) (None, 28, 28, 128) 0 batch_normalization_22[0][0] __________________________________________________________________________________________________ conv2d_23 (Conv2D) (None, 28, 28, 128) 147584 activation_16[0][0] __________________________________________________________________________________________________ batch_normalization_23 (BatchNo (None, 28, 28, 128) 512 conv2d_23[0][0] __________________________________________________________________________________________________ activation_17 (Activation) (None, 28, 28, 128) 0 batch_normalization_23[0][0] __________________________________________________________________________________________________ conv2d_21 (Conv2D) (None, 28, 28, 512) 262656 activation_15[0][0] __________________________________________________________________________________________________ conv2d_24 (Conv2D) (None, 28, 28, 512) 66048 activation_17[0][0] __________________________________________________________________________________________________ batch_normalization_21 (BatchNo (None, 28, 28, 512) 2048 conv2d_21[0][0] __________________________________________________________________________________________________ batch_normalization_24 (BatchNo (None, 28, 28, 512) 2048 conv2d_24[0][0] __________________________________________________________________________________________________ add_5 (Add) (None, 28, 28, 512) 0 batch_normalization_21[0][0] batch_normalization_24[0][0] __________________________________________________________________________________________________ activation_18 (Activation) (None, 28, 28, 512) 0 add_5[0][0] __________________________________________________________________________________________________ conv2d_26 (Conv2D) (None, 28, 28, 128) 65664 activation_18[0][0] __________________________________________________________________________________________________ batch_normalization_26 (BatchNo (None, 28, 28, 128) 512 conv2d_26[0][0] __________________________________________________________________________________________________ activation_19 (Activation) (None, 28, 28, 128) 0 batch_normalization_26[0][0] __________________________________________________________________________________________________ conv2d_27 (Conv2D) (None, 28, 28, 128) 147584 activation_19[0][0] __________________________________________________________________________________________________ batch_normalization_27 (BatchNo (None, 28, 28, 128) 512 conv2d_27[0][0] __________________________________________________________________________________________________ activation_20 (Activation) (None, 28, 28, 128) 0 batch_normalization_27[0][0] __________________________________________________________________________________________________ conv2d_25 (Conv2D) (None, 28, 28, 512) 262656 activation_18[0][0] __________________________________________________________________________________________________ conv2d_28 (Conv2D) (None, 28, 28, 512) 66048 activation_20[0][0] __________________________________________________________________________________________________ batch_normalization_25 (BatchNo (None, 28, 28, 512) 2048 conv2d_25[0][0] __________________________________________________________________________________________________ batch_normalization_28 (BatchNo (None, 28, 28, 512) 2048 conv2d_28[0][0] __________________________________________________________________________________________________ add_6 (Add) (None, 28, 28, 512) 0 batch_normalization_25[0][0] batch_normalization_28[0][0] __________________________________________________________________________________________________ activation_21 (Activation) (None, 28, 28, 512) 0 add_6[0][0] __________________________________________________________________________________________________ conv2d_30 (Conv2D) (None, 14, 14, 256) 131328 activation_21[0][0] __________________________________________________________________________________________________ batch_normalization_30 (BatchNo (None, 14, 14, 256) 1024 conv2d_30[0][0] __________________________________________________________________________________________________ activation_22 (Activation) (None, 14, 14, 256) 0 batch_normalization_30[0][0] __________________________________________________________________________________________________ conv2d_31 (Conv2D) (None, 14, 14, 256) 590080 activation_22[0][0] __________________________________________________________________________________________________ batch_normalization_31 (BatchNo (None, 14, 14, 256) 1024 conv2d_31[0][0] __________________________________________________________________________________________________ activation_23 (Activation) (None, 14, 14, 256) 0 batch_normalization_31[0][0] __________________________________________________________________________________________________ conv2d_29 (Conv2D) (None, 14, 14, 1024) 525312 activation_21[0][0] __________________________________________________________________________________________________ conv2d_32 (Conv2D) (None, 14, 14, 1024) 263168 activation_23[0][0] __________________________________________________________________________________________________ batch_normalization_29 (BatchNo (None, 14, 14, 1024) 4096 conv2d_29[0][0] __________________________________________________________________________________________________ batch_normalization_32 (BatchNo (None, 14, 14, 1024) 4096 conv2d_32[0][0] __________________________________________________________________________________________________ add_7 (Add) (None, 14, 14, 1024) 0 batch_normalization_29[0][0] batch_normalization_32[0][0] __________________________________________________________________________________________________ activation_24 (Activation) (None, 14, 14, 1024) 0 add_7[0][0] __________________________________________________________________________________________________ conv2d_34 (Conv2D) (None, 14, 14, 256) 262400 activation_24[0][0] __________________________________________________________________________________________________ batch_normalization_34 (BatchNo (None, 14, 14, 256) 1024 conv2d_34[0][0] __________________________________________________________________________________________________ activation_25 (Activation) (None, 14, 14, 256) 0 batch_normalization_34[0][0] __________________________________________________________________________________________________ conv2d_35 (Conv2D) (None, 14, 14, 256) 590080 activation_25[0][0] __________________________________________________________________________________________________ batch_normalization_35 (BatchNo (None, 14, 14, 256) 1024 conv2d_35[0][0] __________________________________________________________________________________________________ activation_26 (Activation) (None, 14, 14, 256) 0 batch_normalization_35[0][0] __________________________________________________________________________________________________ conv2d_33 (Conv2D) (None, 14, 14, 1024) 1049600 activation_24[0][0] __________________________________________________________________________________________________ conv2d_36 (Conv2D) (None, 14, 14, 1024) 263168 activation_26[0][0] __________________________________________________________________________________________________ batch_normalization_33 (BatchNo (None, 14, 14, 1024) 4096 conv2d_33[0][0] __________________________________________________________________________________________________ batch_normalization_36 (BatchNo (None, 14, 14, 1024) 4096 conv2d_36[0][0] __________________________________________________________________________________________________ add_8 (Add) (None, 14, 14, 1024) 0 batch_normalization_33[0][0] batch_normalization_36[0][0] __________________________________________________________________________________________________ activation_27 (Activation) (None, 14, 14, 1024) 0 add_8[0][0] __________________________________________________________________________________________________ conv2d_38 (Conv2D) (None, 14, 14, 256) 262400 activation_27[0][0] __________________________________________________________________________________________________ batch_normalization_38 (BatchNo (None, 14, 14, 256) 1024 conv2d_38[0][0] __________________________________________________________________________________________________ activation_28 (Activation) (None, 14, 14, 256) 0 batch_normalization_38[0][0] __________________________________________________________________________________________________ conv2d_39 (Conv2D) (None, 14, 14, 256) 590080 activation_28[0][0] __________________________________________________________________________________________________ batch_normalization_39 (BatchNo (None, 14, 14, 256) 1024 conv2d_39[0][0] __________________________________________________________________________________________________ activation_29 (Activation) (None, 14, 14, 256) 0 batch_normalization_39[0][0] __________________________________________________________________________________________________ conv2d_37 (Conv2D) (None, 14, 14, 1024) 1049600 activation_27[0][0] __________________________________________________________________________________________________ conv2d_40 (Conv2D) (None, 14, 14, 1024) 263168 activation_29[0][0] __________________________________________________________________________________________________ batch_normalization_37 (BatchNo (None, 14, 14, 1024) 4096 conv2d_37[0][0] __________________________________________________________________________________________________ batch_normalization_40 (BatchNo (None, 14, 14, 1024) 4096 conv2d_40[0][0] __________________________________________________________________________________________________ add_9 (Add) (None, 14, 14, 1024) 0 batch_normalization_37[0][0] batch_normalization_40[0][0] __________________________________________________________________________________________________ activation_30 (Activation) (None, 14, 14, 1024) 0 add_9[0][0] __________________________________________________________________________________________________ conv2d_42 (Conv2D) (None, 14, 14, 256) 262400 activation_30[0][0] __________________________________________________________________________________________________ batch_normalization_42 (BatchNo (None, 14, 14, 256) 1024 conv2d_42[0][0] __________________________________________________________________________________________________ activation_31 (Activation) (None, 14, 14, 256) 0 batch_normalization_42[0][0] __________________________________________________________________________________________________ conv2d_43 (Conv2D) (None, 14, 14, 256) 590080 activation_31[0][0] __________________________________________________________________________________________________ batch_normalization_43 (BatchNo (None, 14, 14, 256) 1024 conv2d_43[0][0] __________________________________________________________________________________________________ activation_32 (Activation) (None, 14, 14, 256) 0 batch_normalization_43[0][0] __________________________________________________________________________________________________ conv2d_41 (Conv2D) (None, 14, 14, 1024) 1049600 activation_30[0][0] __________________________________________________________________________________________________ conv2d_44 (Conv2D) (None, 14, 14, 1024) 263168 activation_32[0][0] __________________________________________________________________________________________________ batch_normalization_41 (BatchNo (None, 14, 14, 1024) 4096 conv2d_41[0][0] __________________________________________________________________________________________________ batch_normalization_44 (BatchNo (None, 14, 14, 1024) 4096 conv2d_44[0][0] __________________________________________________________________________________________________ add_10 (Add) (None, 14, 14, 1024) 0 batch_normalization_41[0][0] batch_normalization_44[0][0] __________________________________________________________________________________________________ activation_33 (Activation) (None, 14, 14, 1024) 0 add_10[0][0] __________________________________________________________________________________________________ conv2d_46 (Conv2D) (None, 14, 14, 256) 262400 activation_33[0][0] __________________________________________________________________________________________________ batch_normalization_46 (BatchNo (None, 14, 14, 256) 1024 conv2d_46[0][0] __________________________________________________________________________________________________ activation_34 (Activation) (None, 14, 14, 256) 0 batch_normalization_46[0][0] __________________________________________________________________________________________________ conv2d_47 (Conv2D) (None, 14, 14, 256) 590080 activation_34[0][0] __________________________________________________________________________________________________ batch_normalization_47 (BatchNo (None, 14, 14, 256) 1024 conv2d_47[0][0] __________________________________________________________________________________________________ activation_35 (Activation) (None, 14, 14, 256) 0 batch_normalization_47[0][0] __________________________________________________________________________________________________ conv2d_45 (Conv2D) (None, 14, 14, 1024) 1049600 activation_33[0][0] __________________________________________________________________________________________________ conv2d_48 (Conv2D) (None, 14, 14, 1024) 263168 activation_35[0][0] __________________________________________________________________________________________________ batch_normalization_45 (BatchNo (None, 14, 14, 1024) 4096 conv2d_45[0][0] __________________________________________________________________________________________________ batch_normalization_48 (BatchNo (None, 14, 14, 1024) 4096 conv2d_48[0][0] __________________________________________________________________________________________________ add_11 (Add) (None, 14, 14, 1024) 0 batch_normalization_45[0][0] batch_normalization_48[0][0] __________________________________________________________________________________________________ activation_36 (Activation) (None, 14, 14, 1024) 0 add_11[0][0] __________________________________________________________________________________________________ conv2d_50 (Conv2D) (None, 14, 14, 256) 262400 activation_36[0][0] __________________________________________________________________________________________________ batch_normalization_50 (BatchNo (None, 14, 14, 256) 1024 conv2d_50[0][0] __________________________________________________________________________________________________ activation_37 (Activation) (None, 14, 14, 256) 0 batch_normalization_50[0][0] __________________________________________________________________________________________________ conv2d_51 (Conv2D) (None, 14, 14, 256) 590080 activation_37[0][0] __________________________________________________________________________________________________ batch_normalization_51 (BatchNo (None, 14, 14, 256) 1024 conv2d_51[0][0] __________________________________________________________________________________________________ activation_38 (Activation) (None, 14, 14, 256) 0 batch_normalization_51[0][0] __________________________________________________________________________________________________ conv2d_49 (Conv2D) (None, 14, 14, 1024) 1049600 activation_36[0][0] __________________________________________________________________________________________________ conv2d_52 (Conv2D) (None, 14, 14, 1024) 263168 activation_38[0][0] __________________________________________________________________________________________________ batch_normalization_49 (BatchNo (None, 14, 14, 1024) 4096 conv2d_49[0][0] __________________________________________________________________________________________________ batch_normalization_52 (BatchNo (None, 14, 14, 1024) 4096 conv2d_52[0][0] __________________________________________________________________________________________________ add_12 (Add) (None, 14, 14, 1024) 0 batch_normalization_49[0][0] batch_normalization_52[0][0] __________________________________________________________________________________________________ activation_39 (Activation) (None, 14, 14, 1024) 0 add_12[0][0] __________________________________________________________________________________________________ conv2d_54 (Conv2D) (None, 7, 7, 512) 524800 activation_39[0][0] __________________________________________________________________________________________________ batch_normalization_54 (BatchNo (None, 7, 7, 512) 2048 conv2d_54[0][0] __________________________________________________________________________________________________ activation_40 (Activation) (None, 7, 7, 512) 0 batch_normalization_54[0][0] __________________________________________________________________________________________________ conv2d_55 (Conv2D) (None, 7, 7, 512) 2359808 activation_40[0][0] __________________________________________________________________________________________________ batch_normalization_55 (BatchNo (None, 7, 7, 512) 2048 conv2d_55[0][0] __________________________________________________________________________________________________ activation_41 (Activation) (None, 7, 7, 512) 0 batch_normalization_55[0][0] __________________________________________________________________________________________________ conv2d_53 (Conv2D) (None, 7, 7, 2048) 2099200 activation_39[0][0] __________________________________________________________________________________________________ conv2d_56 (Conv2D) (None, 7, 7, 2048) 1050624 activation_41[0][0] __________________________________________________________________________________________________ batch_normalization_53 (BatchNo (None, 7, 7, 2048) 8192 conv2d_53[0][0] __________________________________________________________________________________________________ batch_normalization_56 (BatchNo (None, 7, 7, 2048) 8192 conv2d_56[0][0] __________________________________________________________________________________________________ add_13 (Add) (None, 7, 7, 2048) 0 batch_normalization_53[0][0] batch_normalization_56[0][0] __________________________________________________________________________________________________ activation_42 (Activation) (None, 7, 7, 2048) 0 add_13[0][0] __________________________________________________________________________________________________ conv2d_58 (Conv2D) (None, 7, 7, 512) 1049088 activation_42[0][0] __________________________________________________________________________________________________ batch_normalization_58 (BatchNo (None, 7, 7, 512) 2048 conv2d_58[0][0] __________________________________________________________________________________________________ activation_43 (Activation) (None, 7, 7, 512) 0 batch_normalization_58[0][0] __________________________________________________________________________________________________ conv2d_59 (Conv2D) (None, 7, 7, 512) 2359808 activation_43[0][0] __________________________________________________________________________________________________ batch_normalization_59 (BatchNo (None, 7, 7, 512) 2048 conv2d_59[0][0] __________________________________________________________________________________________________ activation_44 (Activation) (None, 7, 7, 512) 0 batch_normalization_59[0][0] __________________________________________________________________________________________________ conv2d_57 (Conv2D) (None, 7, 7, 2048) 4196352 activation_42[0][0] __________________________________________________________________________________________________ conv2d_60 (Conv2D) (None, 7, 7, 2048) 1050624 activation_44[0][0] __________________________________________________________________________________________________ batch_normalization_57 (BatchNo (None, 7, 7, 2048) 8192 conv2d_57[0][0] __________________________________________________________________________________________________ batch_normalization_60 (BatchNo (None, 7, 7, 2048) 8192 conv2d_60[0][0] __________________________________________________________________________________________________ add_14 (Add) (None, 7, 7, 2048) 0 batch_normalization_57[0][0] batch_normalization_60[0][0] __________________________________________________________________________________________________ activation_45 (Activation) (None, 7, 7, 2048) 0 add_14[0][0] __________________________________________________________________________________________________ conv2d_62 (Conv2D) (None, 7, 7, 512) 1049088 activation_45[0][0] __________________________________________________________________________________________________ batch_normalization_62 (BatchNo (None, 7, 7, 512) 2048 conv2d_62[0][0] __________________________________________________________________________________________________ activation_46 (Activation) (None, 7, 7, 512) 0 batch_normalization_62[0][0] __________________________________________________________________________________________________ conv2d_63 (Conv2D) (None, 7, 7, 512) 2359808 activation_46[0][0] __________________________________________________________________________________________________ batch_normalization_63 (BatchNo (None, 7, 7, 512) 2048 conv2d_63[0][0] __________________________________________________________________________________________________ activation_47 (Activation) (None, 7, 7, 512) 0 batch_normalization_63[0][0] __________________________________________________________________________________________________ conv2d_61 (Conv2D) (None, 7, 7, 2048) 4196352 activation_45[0][0] __________________________________________________________________________________________________ conv2d_64 (Conv2D) (None, 7, 7, 2048) 1050624 activation_47[0][0] __________________________________________________________________________________________________ batch_normalization_61 (BatchNo (None, 7, 7, 2048) 8192 conv2d_61[0][0] __________________________________________________________________________________________________ batch_normalization_64 (BatchNo (None, 7, 7, 2048) 8192 conv2d_64[0][0] __________________________________________________________________________________________________ add_15 (Add) (None, 7, 7, 2048) 0 batch_normalization_61[0][0] batch_normalization_64[0][0] __________________________________________________________________________________________________ activation_48 (Activation) (None, 7, 7, 2048) 0 add_15[0][0] __________________________________________________________________________________________________ global_average_pooling2d (Globa (None, 2048) 0 activation_48[0][0] __________________________________________________________________________________________________ dense (Dense) (None, 100) 204900 global_average_pooling2d[0][0] ================================================================================================== Total params: 38,397,924 Trainable params: 38,322,276 Non-trainable params: 75,648 __________________________________________________________________________________________________ MaxPoolingした後のサイズが127になってます。こいつもZeroPaddingで対処してしまいます。 5回目 入力サイズは改めて224x224x3、出力は1000にします。 出力 Layer (type) Output Shape Param # Connected to ================================================================================================== input_1 (InputLayer) [(None, 224, 224, 3) 0 __________________________________________________________________________________________________ zero_padding2d (ZeroPadding2D) (None, 230, 230, 3) 0 input_1[0][0] __________________________________________________________________________________________________ conv2d (Conv2D) (None, 112, 112, 64) 9472 zero_padding2d[0][0] __________________________________________________________________________________________________ batch_normalization (BatchNorma (None, 112, 112, 64) 256 conv2d[0][0] __________________________________________________________________________________________________ activation (Activation) (None, 112, 112, 64) 0 batch_normalization[0][0] __________________________________________________________________________________________________ zero_padding2d_1 (ZeroPadding2D (None, 114, 114, 64) 0 activation[0][0] __________________________________________________________________________________________________ max_pooling2d (MaxPooling2D) (None, 56, 56, 64) 0 zero_padding2d_1[0][0] __________________________________________________________________________________________________ conv2d_2 (Conv2D) (None, 56, 56, 64) 4160 max_pooling2d[0][0] __________________________________________________________________________________________________ batch_normalization_2 (BatchNor (None, 56, 56, 64) 256 conv2d_2[0][0] __________________________________________________________________________________________________ activation_1 (Activation) (None, 56, 56, 64) 0 batch_normalization_2[0][0] __________________________________________________________________________________________________ conv2d_3 (Conv2D) (None, 56, 56, 64) 36928 activation_1[0][0] __________________________________________________________________________________________________ batch_normalization_3 (BatchNor (None, 56, 56, 64) 256 conv2d_3[0][0] __________________________________________________________________________________________________ activation_2 (Activation) (None, 56, 56, 64) 0 batch_normalization_3[0][0] __________________________________________________________________________________________________ conv2d_1 (Conv2D) (None, 56, 56, 256) 16640 max_pooling2d[0][0] __________________________________________________________________________________________________ conv2d_4 (Conv2D) (None, 56, 56, 256) 16640 activation_2[0][0] __________________________________________________________________________________________________ batch_normalization_1 (BatchNor (None, 56, 56, 256) 1024 conv2d_1[0][0] __________________________________________________________________________________________________ batch_normalization_4 (BatchNor (None, 56, 56, 256) 1024 conv2d_4[0][0] __________________________________________________________________________________________________ add (Add) (None, 56, 56, 256) 0 batch_normalization_1[0][0] batch_normalization_4[0][0] __________________________________________________________________________________________________ activation_3 (Activation) (None, 56, 56, 256) 0 add[0][0] __________________________________________________________________________________________________ conv2d_6 (Conv2D) (None, 56, 56, 64) 16448 activation_3[0][0] __________________________________________________________________________________________________ batch_normalization_6 (BatchNor (None, 56, 56, 64) 256 conv2d_6[0][0] __________________________________________________________________________________________________ activation_4 (Activation) (None, 56, 56, 64) 0 batch_normalization_6[0][0] __________________________________________________________________________________________________ conv2d_7 (Conv2D) (None, 56, 56, 64) 36928 activation_4[0][0] __________________________________________________________________________________________________ batch_normalization_7 (BatchNor (None, 56, 56, 64) 256 conv2d_7[0][0] __________________________________________________________________________________________________ activation_5 (Activation) (None, 56, 56, 64) 0 batch_normalization_7[0][0] __________________________________________________________________________________________________ conv2d_5 (Conv2D) (None, 56, 56, 256) 65792 activation_3[0][0] __________________________________________________________________________________________________ conv2d_8 (Conv2D) (None, 56, 56, 256) 16640 activation_5[0][0] __________________________________________________________________________________________________ batch_normalization_5 (BatchNor (None, 56, 56, 256) 1024 conv2d_5[0][0] __________________________________________________________________________________________________ batch_normalization_8 (BatchNor (None, 56, 56, 256) 1024 conv2d_8[0][0] __________________________________________________________________________________________________ add_1 (Add) (None, 56, 56, 256) 0 batch_normalization_5[0][0] batch_normalization_8[0][0] __________________________________________________________________________________________________ activation_6 (Activation) (None, 56, 56, 256) 0 add_1[0][0] __________________________________________________________________________________________________ conv2d_10 (Conv2D) (None, 56, 56, 64) 16448 activation_6[0][0] __________________________________________________________________________________________________ batch_normalization_10 (BatchNo (None, 56, 56, 64) 256 conv2d_10[0][0] __________________________________________________________________________________________________ activation_7 (Activation) (None, 56, 56, 64) 0 batch_normalization_10[0][0] __________________________________________________________________________________________________ conv2d_11 (Conv2D) (None, 56, 56, 64) 36928 activation_7[0][0] __________________________________________________________________________________________________ batch_normalization_11 (BatchNo (None, 56, 56, 64) 256 conv2d_11[0][0] __________________________________________________________________________________________________ activation_8 (Activation) (None, 56, 56, 64) 0 batch_normalization_11[0][0] __________________________________________________________________________________________________ conv2d_9 (Conv2D) (None, 56, 56, 256) 65792 activation_6[0][0] __________________________________________________________________________________________________ conv2d_12 (Conv2D) (None, 56, 56, 256) 16640 activation_8[0][0] __________________________________________________________________________________________________ batch_normalization_9 (BatchNor (None, 56, 56, 256) 1024 conv2d_9[0][0] __________________________________________________________________________________________________ batch_normalization_12 (BatchNo (None, 56, 56, 256) 1024 conv2d_12[0][0] __________________________________________________________________________________________________ add_2 (Add) (None, 56, 56, 256) 0 batch_normalization_9[0][0] batch_normalization_12[0][0] __________________________________________________________________________________________________ activation_9 (Activation) (None, 56, 56, 256) 0 add_2[0][0] __________________________________________________________________________________________________ conv2d_14 (Conv2D) (None, 28, 28, 128) 32896 activation_9[0][0] __________________________________________________________________________________________________ batch_normalization_14 (BatchNo (None, 28, 28, 128) 512 conv2d_14[0][0] __________________________________________________________________________________________________ activation_10 (Activation) (None, 28, 28, 128) 0 batch_normalization_14[0][0] __________________________________________________________________________________________________ conv2d_15 (Conv2D) (None, 28, 28, 128) 147584 activation_10[0][0] __________________________________________________________________________________________________ batch_normalization_15 (BatchNo (None, 28, 28, 128) 512 conv2d_15[0][0] __________________________________________________________________________________________________ activation_11 (Activation) (None, 28, 28, 128) 0 batch_normalization_15[0][0] __________________________________________________________________________________________________ conv2d_13 (Conv2D) (None, 28, 28, 512) 131584 activation_9[0][0] __________________________________________________________________________________________________ conv2d_16 (Conv2D) (None, 28, 28, 512) 66048 activation_11[0][0] __________________________________________________________________________________________________ batch_normalization_13 (BatchNo (None, 28, 28, 512) 2048 conv2d_13[0][0] __________________________________________________________________________________________________ batch_normalization_16 (BatchNo (None, 28, 28, 512) 2048 conv2d_16[0][0] __________________________________________________________________________________________________ add_3 (Add) (None, 28, 28, 512) 0 batch_normalization_13[0][0] batch_normalization_16[0][0] __________________________________________________________________________________________________ activation_12 (Activation) (None, 28, 28, 512) 0 add_3[0][0] __________________________________________________________________________________________________ conv2d_18 (Conv2D) (None, 28, 28, 128) 65664 activation_12[0][0] __________________________________________________________________________________________________ batch_normalization_18 (BatchNo (None, 28, 28, 128) 512 conv2d_18[0][0] __________________________________________________________________________________________________ activation_13 (Activation) (None, 28, 28, 128) 0 batch_normalization_18[0][0] __________________________________________________________________________________________________ conv2d_19 (Conv2D) (None, 28, 28, 128) 147584 activation_13[0][0] __________________________________________________________________________________________________ batch_normalization_19 (BatchNo (None, 28, 28, 128) 512 conv2d_19[0][0] __________________________________________________________________________________________________ activation_14 (Activation) (None, 28, 28, 128) 0 batch_normalization_19[0][0] __________________________________________________________________________________________________ conv2d_17 (Conv2D) (None, 28, 28, 512) 262656 activation_12[0][0] __________________________________________________________________________________________________ conv2d_20 (Conv2D) (None, 28, 28, 512) 66048 activation_14[0][0] __________________________________________________________________________________________________ batch_normalization_17 (BatchNo (None, 28, 28, 512) 2048 conv2d_17[0][0] __________________________________________________________________________________________________ batch_normalization_20 (BatchNo (None, 28, 28, 512) 2048 conv2d_20[0][0] __________________________________________________________________________________________________ add_4 (Add) (None, 28, 28, 512) 0 batch_normalization_17[0][0] batch_normalization_20[0][0] __________________________________________________________________________________________________ activation_15 (Activation) (None, 28, 28, 512) 0 add_4[0][0] __________________________________________________________________________________________________ conv2d_22 (Conv2D) (None, 28, 28, 128) 65664 activation_15[0][0] __________________________________________________________________________________________________ batch_normalization_22 (BatchNo (None, 28, 28, 128) 512 conv2d_22[0][0] __________________________________________________________________________________________________ activation_16 (Activation) (None, 28, 28, 128) 0 batch_normalization_22[0][0] __________________________________________________________________________________________________ conv2d_23 (Conv2D) (None, 28, 28, 128) 147584 activation_16[0][0] __________________________________________________________________________________________________ batch_normalization_23 (BatchNo (None, 28, 28, 128) 512 conv2d_23[0][0] __________________________________________________________________________________________________ activation_17 (Activation) (None, 28, 28, 128) 0 batch_normalization_23[0][0] __________________________________________________________________________________________________ conv2d_21 (Conv2D) (None, 28, 28, 512) 262656 activation_15[0][0] __________________________________________________________________________________________________ conv2d_24 (Conv2D) (None, 28, 28, 512) 66048 activation_17[0][0] __________________________________________________________________________________________________ batch_normalization_21 (BatchNo (None, 28, 28, 512) 2048 conv2d_21[0][0] __________________________________________________________________________________________________ batch_normalization_24 (BatchNo (None, 28, 28, 512) 2048 conv2d_24[0][0] __________________________________________________________________________________________________ add_5 (Add) (None, 28, 28, 512) 0 batch_normalization_21[0][0] batch_normalization_24[0][0] __________________________________________________________________________________________________ activation_18 (Activation) (None, 28, 28, 512) 0 add_5[0][0] __________________________________________________________________________________________________ conv2d_26 (Conv2D) (None, 28, 28, 128) 65664 activation_18[0][0] __________________________________________________________________________________________________ batch_normalization_26 (BatchNo (None, 28, 28, 128) 512 conv2d_26[0][0] __________________________________________________________________________________________________ activation_19 (Activation) (None, 28, 28, 128) 0 batch_normalization_26[0][0] __________________________________________________________________________________________________ conv2d_27 (Conv2D) (None, 28, 28, 128) 147584 activation_19[0][0] __________________________________________________________________________________________________ batch_normalization_27 (BatchNo (None, 28, 28, 128) 512 conv2d_27[0][0] __________________________________________________________________________________________________ activation_20 (Activation) (None, 28, 28, 128) 0 batch_normalization_27[0][0] __________________________________________________________________________________________________ conv2d_25 (Conv2D) (None, 28, 28, 512) 262656 activation_18[0][0] __________________________________________________________________________________________________ conv2d_28 (Conv2D) (None, 28, 28, 512) 66048 activation_20[0][0] __________________________________________________________________________________________________ batch_normalization_25 (BatchNo (None, 28, 28, 512) 2048 conv2d_25[0][0] __________________________________________________________________________________________________ batch_normalization_28 (BatchNo (None, 28, 28, 512) 2048 conv2d_28[0][0] __________________________________________________________________________________________________ add_6 (Add) (None, 28, 28, 512) 0 batch_normalization_25[0][0] batch_normalization_28[0][0] __________________________________________________________________________________________________ activation_21 (Activation) (None, 28, 28, 512) 0 add_6[0][0] __________________________________________________________________________________________________ conv2d_30 (Conv2D) (None, 14, 14, 256) 131328 activation_21[0][0] __________________________________________________________________________________________________ batch_normalization_30 (BatchNo (None, 14, 14, 256) 1024 conv2d_30[0][0] __________________________________________________________________________________________________ activation_22 (Activation) (None, 14, 14, 256) 0 batch_normalization_30[0][0] __________________________________________________________________________________________________ conv2d_31 (Conv2D) (None, 14, 14, 256) 590080 activation_22[0][0] __________________________________________________________________________________________________ batch_normalization_31 (BatchNo (None, 14, 14, 256) 1024 conv2d_31[0][0] __________________________________________________________________________________________________ activation_23 (Activation) (None, 14, 14, 256) 0 batch_normalization_31[0][0] __________________________________________________________________________________________________ conv2d_29 (Conv2D) (None, 14, 14, 1024) 525312 activation_21[0][0] __________________________________________________________________________________________________ conv2d_32 (Conv2D) (None, 14, 14, 1024) 263168 activation_23[0][0] __________________________________________________________________________________________________ batch_normalization_29 (BatchNo (None, 14, 14, 1024) 4096 conv2d_29[0][0] __________________________________________________________________________________________________ batch_normalization_32 (BatchNo (None, 14, 14, 1024) 4096 conv2d_32[0][0] __________________________________________________________________________________________________ add_7 (Add) (None, 14, 14, 1024) 0 batch_normalization_29[0][0] batch_normalization_32[0][0] __________________________________________________________________________________________________ activation_24 (Activation) (None, 14, 14, 1024) 0 add_7[0][0] __________________________________________________________________________________________________ conv2d_34 (Conv2D) (None, 14, 14, 256) 262400 activation_24[0][0] __________________________________________________________________________________________________ batch_normalization_34 (BatchNo (None, 14, 14, 256) 1024 conv2d_34[0][0] __________________________________________________________________________________________________ activation_25 (Activation) (None, 14, 14, 256) 0 batch_normalization_34[0][0] __________________________________________________________________________________________________ conv2d_35 (Conv2D) (None, 14, 14, 256) 590080 activation_25[0][0] __________________________________________________________________________________________________ batch_normalization_35 (BatchNo (None, 14, 14, 256) 1024 conv2d_35[0][0] __________________________________________________________________________________________________ activation_26 (Activation) (None, 14, 14, 256) 0 batch_normalization_35[0][0] __________________________________________________________________________________________________ conv2d_33 (Conv2D) (None, 14, 14, 1024) 1049600 activation_24[0][0] __________________________________________________________________________________________________ conv2d_36 (Conv2D) (None, 14, 14, 1024) 263168 activation_26[0][0] __________________________________________________________________________________________________ batch_normalization_33 (BatchNo (None, 14, 14, 1024) 4096 conv2d_33[0][0] __________________________________________________________________________________________________ batch_normalization_36 (BatchNo (None, 14, 14, 1024) 4096 conv2d_36[0][0] __________________________________________________________________________________________________ add_8 (Add) (None, 14, 14, 1024) 0 batch_normalization_33[0][0] batch_normalization_36[0][0] __________________________________________________________________________________________________ activation_27 (Activation) (None, 14, 14, 1024) 0 add_8[0][0] __________________________________________________________________________________________________ conv2d_38 (Conv2D) (None, 14, 14, 256) 262400 activation_27[0][0] __________________________________________________________________________________________________ batch_normalization_38 (BatchNo (None, 14, 14, 256) 1024 conv2d_38[0][0] __________________________________________________________________________________________________ activation_28 (Activation) (None, 14, 14, 256) 0 batch_normalization_38[0][0] __________________________________________________________________________________________________ conv2d_39 (Conv2D) (None, 14, 14, 256) 590080 activation_28[0][0] __________________________________________________________________________________________________ batch_normalization_39 (BatchNo (None, 14, 14, 256) 1024 conv2d_39[0][0] __________________________________________________________________________________________________ activation_29 (Activation) (None, 14, 14, 256) 0 batch_normalization_39[0][0] __________________________________________________________________________________________________ conv2d_37 (Conv2D) (None, 14, 14, 1024) 1049600 activation_27[0][0] __________________________________________________________________________________________________ conv2d_40 (Conv2D) (None, 14, 14, 1024) 263168 activation_29[0][0] __________________________________________________________________________________________________ batch_normalization_37 (BatchNo (None, 14, 14, 1024) 4096 conv2d_37[0][0] __________________________________________________________________________________________________ batch_normalization_40 (BatchNo (None, 14, 14, 1024) 4096 conv2d_40[0][0] __________________________________________________________________________________________________ add_9 (Add) (None, 14, 14, 1024) 0 batch_normalization_37[0][0] batch_normalization_40[0][0] __________________________________________________________________________________________________ activation_30 (Activation) (None, 14, 14, 1024) 0 add_9[0][0] __________________________________________________________________________________________________ conv2d_42 (Conv2D) (None, 14, 14, 256) 262400 activation_30[0][0] __________________________________________________________________________________________________ batch_normalization_42 (BatchNo (None, 14, 14, 256) 1024 conv2d_42[0][0] __________________________________________________________________________________________________ activation_31 (Activation) (None, 14, 14, 256) 0 batch_normalization_42[0][0] __________________________________________________________________________________________________ conv2d_43 (Conv2D) (None, 14, 14, 256) 590080 activation_31[0][0] __________________________________________________________________________________________________ batch_normalization_43 (BatchNo (None, 14, 14, 256) 1024 conv2d_43[0][0] __________________________________________________________________________________________________ activation_32 (Activation) (None, 14, 14, 256) 0 batch_normalization_43[0][0] __________________________________________________________________________________________________ conv2d_41 (Conv2D) (None, 14, 14, 1024) 1049600 activation_30[0][0] __________________________________________________________________________________________________ conv2d_44 (Conv2D) (None, 14, 14, 1024) 263168 activation_32[0][0] __________________________________________________________________________________________________ batch_normalization_41 (BatchNo (None, 14, 14, 1024) 4096 conv2d_41[0][0] __________________________________________________________________________________________________ batch_normalization_44 (BatchNo (None, 14, 14, 1024) 4096 conv2d_44[0][0] __________________________________________________________________________________________________ add_10 (Add) (None, 14, 14, 1024) 0 batch_normalization_41[0][0] batch_normalization_44[0][0] __________________________________________________________________________________________________ activation_33 (Activation) (None, 14, 14, 1024) 0 add_10[0][0] __________________________________________________________________________________________________ conv2d_46 (Conv2D) (None, 14, 14, 256) 262400 activation_33[0][0] __________________________________________________________________________________________________ batch_normalization_46 (BatchNo (None, 14, 14, 256) 1024 conv2d_46[0][0] __________________________________________________________________________________________________ activation_34 (Activation) (None, 14, 14, 256) 0 batch_normalization_46[0][0] __________________________________________________________________________________________________ conv2d_47 (Conv2D) (None, 14, 14, 256) 590080 activation_34[0][0] __________________________________________________________________________________________________ batch_normalization_47 (BatchNo (None, 14, 14, 256) 1024 conv2d_47[0][0] __________________________________________________________________________________________________ activation_35 (Activation) (None, 14, 14, 256) 0 batch_normalization_47[0][0] __________________________________________________________________________________________________ conv2d_45 (Conv2D) (None, 14, 14, 1024) 1049600 activation_33[0][0] __________________________________________________________________________________________________ conv2d_48 (Conv2D) (None, 14, 14, 1024) 263168 activation_35[0][0] __________________________________________________________________________________________________ batch_normalization_45 (BatchNo (None, 14, 14, 1024) 4096 conv2d_45[0][0] __________________________________________________________________________________________________ batch_normalization_48 (BatchNo (None, 14, 14, 1024) 4096 conv2d_48[0][0] __________________________________________________________________________________________________ add_11 (Add) (None, 14, 14, 1024) 0 batch_normalization_45[0][0] batch_normalization_48[0][0] __________________________________________________________________________________________________ activation_36 (Activation) (None, 14, 14, 1024) 0 add_11[0][0] __________________________________________________________________________________________________ conv2d_50 (Conv2D) (None, 14, 14, 256) 262400 activation_36[0][0] __________________________________________________________________________________________________ batch_normalization_50 (BatchNo (None, 14, 14, 256) 1024 conv2d_50[0][0] __________________________________________________________________________________________________ activation_37 (Activation) (None, 14, 14, 256) 0 batch_normalization_50[0][0] __________________________________________________________________________________________________ conv2d_51 (Conv2D) (None, 14, 14, 256) 590080 activation_37[0][0] __________________________________________________________________________________________________ batch_normalization_51 (BatchNo (None, 14, 14, 256) 1024 conv2d_51[0][0] __________________________________________________________________________________________________ activation_38 (Activation) (None, 14, 14, 256) 0 batch_normalization_51[0][0] __________________________________________________________________________________________________ conv2d_49 (Conv2D) (None, 14, 14, 1024) 1049600 activation_36[0][0] __________________________________________________________________________________________________ conv2d_52 (Conv2D) (None, 14, 14, 1024) 263168 activation_38[0][0] __________________________________________________________________________________________________ batch_normalization_49 (BatchNo (None, 14, 14, 1024) 4096 conv2d_49[0][0] __________________________________________________________________________________________________ batch_normalization_52 (BatchNo (None, 14, 14, 1024) 4096 conv2d_52[0][0] __________________________________________________________________________________________________ add_12 (Add) (None, 14, 14, 1024) 0 batch_normalization_49[0][0] batch_normalization_52[0][0] __________________________________________________________________________________________________ activation_39 (Activation) (None, 14, 14, 1024) 0 add_12[0][0] __________________________________________________________________________________________________ conv2d_54 (Conv2D) (None, 7, 7, 512) 524800 activation_39[0][0] __________________________________________________________________________________________________ batch_normalization_54 (BatchNo (None, 7, 7, 512) 2048 conv2d_54[0][0] __________________________________________________________________________________________________ activation_40 (Activation) (None, 7, 7, 512) 0 batch_normalization_54[0][0] __________________________________________________________________________________________________ conv2d_55 (Conv2D) (None, 7, 7, 512) 2359808 activation_40[0][0] __________________________________________________________________________________________________ batch_normalization_55 (BatchNo (None, 7, 7, 512) 2048 conv2d_55[0][0] __________________________________________________________________________________________________ activation_41 (Activation) (None, 7, 7, 512) 0 batch_normalization_55[0][0] __________________________________________________________________________________________________ conv2d_53 (Conv2D) (None, 7, 7, 2048) 2099200 activation_39[0][0] __________________________________________________________________________________________________ conv2d_56 (Conv2D) (None, 7, 7, 2048) 1050624 activation_41[0][0] __________________________________________________________________________________________________ batch_normalization_53 (BatchNo (None, 7, 7, 2048) 8192 conv2d_53[0][0] __________________________________________________________________________________________________ batch_normalization_56 (BatchNo (None, 7, 7, 2048) 8192 conv2d_56[0][0] __________________________________________________________________________________________________ add_13 (Add) (None, 7, 7, 2048) 0 batch_normalization_53[0][0] batch_normalization_56[0][0] __________________________________________________________________________________________________ activation_42 (Activation) (None, 7, 7, 2048) 0 add_13[0][0] __________________________________________________________________________________________________ conv2d_58 (Conv2D) (None, 7, 7, 512) 1049088 activation_42[0][0] __________________________________________________________________________________________________ batch_normalization_58 (BatchNo (None, 7, 7, 512) 2048 conv2d_58[0][0] __________________________________________________________________________________________________ activation_43 (Activation) (None, 7, 7, 512) 0 batch_normalization_58[0][0] __________________________________________________________________________________________________ conv2d_59 (Conv2D) (None, 7, 7, 512) 2359808 activation_43[0][0] __________________________________________________________________________________________________ batch_normalization_59 (BatchNo (None, 7, 7, 512) 2048 conv2d_59[0][0] __________________________________________________________________________________________________ activation_44 (Activation) (None, 7, 7, 512) 0 batch_normalization_59[0][0] __________________________________________________________________________________________________ conv2d_57 (Conv2D) (None, 7, 7, 2048) 4196352 activation_42[0][0] __________________________________________________________________________________________________ conv2d_60 (Conv2D) (None, 7, 7, 2048) 1050624 activation_44[0][0] __________________________________________________________________________________________________ batch_normalization_57 (BatchNo (None, 7, 7, 2048) 8192 conv2d_57[0][0] __________________________________________________________________________________________________ batch_normalization_60 (BatchNo (None, 7, 7, 2048) 8192 conv2d_60[0][0] __________________________________________________________________________________________________ add_14 (Add) (None, 7, 7, 2048) 0 batch_normalization_57[0][0] batch_normalization_60[0][0] __________________________________________________________________________________________________ activation_45 (Activation) (None, 7, 7, 2048) 0 add_14[0][0] __________________________________________________________________________________________________ conv2d_62 (Conv2D) (None, 7, 7, 512) 1049088 activation_45[0][0] __________________________________________________________________________________________________ batch_normalization_62 (BatchNo (None, 7, 7, 512) 2048 conv2d_62[0][0] __________________________________________________________________________________________________ activation_46 (Activation) (None, 7, 7, 512) 0 batch_normalization_62[0][0] __________________________________________________________________________________________________ conv2d_63 (Conv2D) (None, 7, 7, 512) 2359808 activation_46[0][0] __________________________________________________________________________________________________ batch_normalization_63 (BatchNo (None, 7, 7, 512) 2048 conv2d_63[0][0] __________________________________________________________________________________________________ activation_47 (Activation) (None, 7, 7, 512) 0 batch_normalization_63[0][0] __________________________________________________________________________________________________ conv2d_61 (Conv2D) (None, 7, 7, 2048) 4196352 activation_45[0][0] __________________________________________________________________________________________________ conv2d_64 (Conv2D) (None, 7, 7, 2048) 1050624 activation_47[0][0] __________________________________________________________________________________________________ batch_normalization_61 (BatchNo (None, 7, 7, 2048) 8192 conv2d_61[0][0] __________________________________________________________________________________________________ batch_normalization_64 (BatchNo (None, 7, 7, 2048) 8192 conv2d_64[0][0] __________________________________________________________________________________________________ add_15 (Add) (None, 7, 7, 2048) 0 batch_normalization_61[0][0] batch_normalization_64[0][0] __________________________________________________________________________________________________ activation_48 (Activation) (None, 7, 7, 2048) 0 add_15[0][0] __________________________________________________________________________________________________ global_average_pooling2d (Globa (None, 2048) 0 activation_48[0][0] __________________________________________________________________________________________________ dense (Dense) (None, 1000) 2049000 global_average_pooling2d[0][0] ================================================================================================== Total params: 40,242,024 Trainable params: 40,166,376 Non-trainable params: 75,648 __________________________________________________________________________________________________ 再び答え合わせしてみましたが、パラメータが異様に多い気がします(tf.keras公式だとだいたい2500万ほど)。 6回目 にらめっこしてましたが、$\bf x$のフィルターを毎度4倍にしてるのが原因っぽそうです。そういえば結合してしまえばフィルターは4倍してやる必要ないですよね。 結果 出力 Layer (type) Output Shape Param # Connected to ================================================================================================== input_1 (InputLayer) [(None, 224, 224, 3) 0 __________________________________________________________________________________________________ zero_padding2d (ZeroPadding2D) (None, 230, 230, 3) 0 input_1[0][0] __________________________________________________________________________________________________ conv2d (Conv2D) (None, 112, 112, 64) 9472 zero_padding2d[0][0] __________________________________________________________________________________________________ batch_normalization (BatchNorma (None, 112, 112, 64) 256 conv2d[0][0] __________________________________________________________________________________________________ activation (Activation) (None, 112, 112, 64) 0 batch_normalization[0][0] __________________________________________________________________________________________________ zero_padding2d_1 (ZeroPadding2D (None, 114, 114, 64) 0 activation[0][0] __________________________________________________________________________________________________ max_pooling2d (MaxPooling2D) (None, 56, 56, 64) 0 zero_padding2d_1[0][0] __________________________________________________________________________________________________ conv2d_2 (Conv2D) (None, 56, 56, 64) 4160 max_pooling2d[0][0] __________________________________________________________________________________________________ batch_normalization_2 (BatchNor (None, 56, 56, 64) 256 conv2d_2[0][0] __________________________________________________________________________________________________ activation_1 (Activation) (None, 56, 56, 64) 0 batch_normalization_2[0][0] __________________________________________________________________________________________________ conv2d_3 (Conv2D) (None, 56, 56, 64) 36928 activation_1[0][0] __________________________________________________________________________________________________ batch_normalization_3 (BatchNor (None, 56, 56, 64) 256 conv2d_3[0][0] __________________________________________________________________________________________________ activation_2 (Activation) (None, 56, 56, 64) 0 batch_normalization_3[0][0] __________________________________________________________________________________________________ conv2d_1 (Conv2D) (None, 56, 56, 256) 16640 max_pooling2d[0][0] __________________________________________________________________________________________________ conv2d_4 (Conv2D) (None, 56, 56, 256) 16640 activation_2[0][0] __________________________________________________________________________________________________ batch_normalization_1 (BatchNor (None, 56, 56, 256) 1024 conv2d_1[0][0] __________________________________________________________________________________________________ batch_normalization_4 (BatchNor (None, 56, 56, 256) 1024 conv2d_4[0][0] __________________________________________________________________________________________________ add (Add) (None, 56, 56, 256) 0 batch_normalization_1[0][0] batch_normalization_4[0][0] __________________________________________________________________________________________________ activation_3 (Activation) (None, 56, 56, 256) 0 add[0][0] __________________________________________________________________________________________________ conv2d_5 (Conv2D) (None, 56, 56, 64) 16448 activation_3[0][0] __________________________________________________________________________________________________ batch_normalization_5 (BatchNor (None, 56, 56, 64) 256 conv2d_5[0][0] __________________________________________________________________________________________________ activation_4 (Activation) (None, 56, 56, 64) 0 batch_normalization_5[0][0] __________________________________________________________________________________________________ conv2d_6 (Conv2D) (None, 56, 56, 64) 36928 activation_4[0][0] __________________________________________________________________________________________________ batch_normalization_6 (BatchNor (None, 56, 56, 64) 256 conv2d_6[0][0] __________________________________________________________________________________________________ activation_5 (Activation) (None, 56, 56, 64) 0 batch_normalization_6[0][0] __________________________________________________________________________________________________ conv2d_7 (Conv2D) (None, 56, 56, 256) 16640 activation_5[0][0] __________________________________________________________________________________________________ batch_normalization_7 (BatchNor (None, 56, 56, 256) 1024 conv2d_7[0][0] __________________________________________________________________________________________________ add_1 (Add) (None, 56, 56, 256) 0 activation_3[0][0] batch_normalization_7[0][0] __________________________________________________________________________________________________ activation_6 (Activation) (None, 56, 56, 256) 0 add_1[0][0] __________________________________________________________________________________________________ conv2d_8 (Conv2D) (None, 56, 56, 64) 16448 activation_6[0][0] __________________________________________________________________________________________________ batch_normalization_8 (BatchNor (None, 56, 56, 64) 256 conv2d_8[0][0] __________________________________________________________________________________________________ activation_7 (Activation) (None, 56, 56, 64) 0 batch_normalization_8[0][0] __________________________________________________________________________________________________ conv2d_9 (Conv2D) (None, 56, 56, 64) 36928 activation_7[0][0] __________________________________________________________________________________________________ batch_normalization_9 (BatchNor (None, 56, 56, 64) 256 conv2d_9[0][0] __________________________________________________________________________________________________ activation_8 (Activation) (None, 56, 56, 64) 0 batch_normalization_9[0][0] __________________________________________________________________________________________________ conv2d_10 (Conv2D) (None, 56, 56, 256) 16640 activation_8[0][0] __________________________________________________________________________________________________ batch_normalization_10 (BatchNo (None, 56, 56, 256) 1024 conv2d_10[0][0] __________________________________________________________________________________________________ add_2 (Add) (None, 56, 56, 256) 0 activation_6[0][0] batch_normalization_10[0][0] __________________________________________________________________________________________________ activation_9 (Activation) (None, 56, 56, 256) 0 add_2[0][0] __________________________________________________________________________________________________ conv2d_12 (Conv2D) (None, 28, 28, 128) 32896 activation_9[0][0] __________________________________________________________________________________________________ batch_normalization_12 (BatchNo (None, 28, 28, 128) 512 conv2d_12[0][0] __________________________________________________________________________________________________ activation_10 (Activation) (None, 28, 28, 128) 0 batch_normalization_12[0][0] __________________________________________________________________________________________________ conv2d_13 (Conv2D) (None, 28, 28, 128) 147584 activation_10[0][0] __________________________________________________________________________________________________ batch_normalization_13 (BatchNo (None, 28, 28, 128) 512 conv2d_13[0][0] __________________________________________________________________________________________________ activation_11 (Activation) (None, 28, 28, 128) 0 batch_normalization_13[0][0] __________________________________________________________________________________________________ conv2d_11 (Conv2D) (None, 28, 28, 512) 131584 activation_9[0][0] __________________________________________________________________________________________________ conv2d_14 (Conv2D) (None, 28, 28, 512) 66048 activation_11[0][0] __________________________________________________________________________________________________ batch_normalization_11 (BatchNo (None, 28, 28, 512) 2048 conv2d_11[0][0] __________________________________________________________________________________________________ batch_normalization_14 (BatchNo (None, 28, 28, 512) 2048 conv2d_14[0][0] __________________________________________________________________________________________________ add_3 (Add) (None, 28, 28, 512) 0 batch_normalization_11[0][0] batch_normalization_14[0][0] __________________________________________________________________________________________________ activation_12 (Activation) (None, 28, 28, 512) 0 add_3[0][0] __________________________________________________________________________________________________ conv2d_15 (Conv2D) (None, 28, 28, 128) 65664 activation_12[0][0] __________________________________________________________________________________________________ batch_normalization_15 (BatchNo (None, 28, 28, 128) 512 conv2d_15[0][0] __________________________________________________________________________________________________ activation_13 (Activation) (None, 28, 28, 128) 0 batch_normalization_15[0][0] __________________________________________________________________________________________________ conv2d_16 (Conv2D) (None, 28, 28, 128) 147584 activation_13[0][0] __________________________________________________________________________________________________ batch_normalization_16 (BatchNo (None, 28, 28, 128) 512 conv2d_16[0][0] __________________________________________________________________________________________________ activation_14 (Activation) (None, 28, 28, 128) 0 batch_normalization_16[0][0] __________________________________________________________________________________________________ conv2d_17 (Conv2D) (None, 28, 28, 512) 66048 activation_14[0][0] __________________________________________________________________________________________________ batch_normalization_17 (BatchNo (None, 28, 28, 512) 2048 conv2d_17[0][0] __________________________________________________________________________________________________ add_4 (Add) (None, 28, 28, 512) 0 activation_12[0][0] batch_normalization_17[0][0] __________________________________________________________________________________________________ activation_15 (Activation) (None, 28, 28, 512) 0 add_4[0][0] __________________________________________________________________________________________________ conv2d_18 (Conv2D) (None, 28, 28, 128) 65664 activation_15[0][0] __________________________________________________________________________________________________ batch_normalization_18 (BatchNo (None, 28, 28, 128) 512 conv2d_18[0][0] __________________________________________________________________________________________________ activation_16 (Activation) (None, 28, 28, 128) 0 batch_normalization_18[0][0] __________________________________________________________________________________________________ conv2d_19 (Conv2D) (None, 28, 28, 128) 147584 activation_16[0][0] __________________________________________________________________________________________________ batch_normalization_19 (BatchNo (None, 28, 28, 128) 512 conv2d_19[0][0] __________________________________________________________________________________________________ activation_17 (Activation) (None, 28, 28, 128) 0 batch_normalization_19[0][0] __________________________________________________________________________________________________ conv2d_20 (Conv2D) (None, 28, 28, 512) 66048 activation_17[0][0] __________________________________________________________________________________________________ batch_normalization_20 (BatchNo (None, 28, 28, 512) 2048 conv2d_20[0][0] __________________________________________________________________________________________________ add_5 (Add) (None, 28, 28, 512) 0 activation_15[0][0] batch_normalization_20[0][0] __________________________________________________________________________________________________ activation_18 (Activation) (None, 28, 28, 512) 0 add_5[0][0] __________________________________________________________________________________________________ conv2d_21 (Conv2D) (None, 28, 28, 128) 65664 activation_18[0][0] __________________________________________________________________________________________________ batch_normalization_21 (BatchNo (None, 28, 28, 128) 512 conv2d_21[0][0] __________________________________________________________________________________________________ activation_19 (Activation) (None, 28, 28, 128) 0 batch_normalization_21[0][0] __________________________________________________________________________________________________ conv2d_22 (Conv2D) (None, 28, 28, 128) 147584 activation_19[0][0] __________________________________________________________________________________________________ batch_normalization_22 (BatchNo (None, 28, 28, 128) 512 conv2d_22[0][0] __________________________________________________________________________________________________ activation_20 (Activation) (None, 28, 28, 128) 0 batch_normalization_22[0][0] __________________________________________________________________________________________________ conv2d_23 (Conv2D) (None, 28, 28, 512) 66048 activation_20[0][0] __________________________________________________________________________________________________ batch_normalization_23 (BatchNo (None, 28, 28, 512) 2048 conv2d_23[0][0] __________________________________________________________________________________________________ add_6 (Add) (None, 28, 28, 512) 0 activation_18[0][0] batch_normalization_23[0][0] __________________________________________________________________________________________________ activation_21 (Activation) (None, 28, 28, 512) 0 add_6[0][0] __________________________________________________________________________________________________ conv2d_25 (Conv2D) (None, 14, 14, 256) 131328 activation_21[0][0] __________________________________________________________________________________________________ batch_normalization_25 (BatchNo (None, 14, 14, 256) 1024 conv2d_25[0][0] __________________________________________________________________________________________________ activation_22 (Activation) (None, 14, 14, 256) 0 batch_normalization_25[0][0] __________________________________________________________________________________________________ conv2d_26 (Conv2D) (None, 14, 14, 256) 590080 activation_22[0][0] __________________________________________________________________________________________________ batch_normalization_26 (BatchNo (None, 14, 14, 256) 1024 conv2d_26[0][0] __________________________________________________________________________________________________ activation_23 (Activation) (None, 14, 14, 256) 0 batch_normalization_26[0][0] __________________________________________________________________________________________________ conv2d_24 (Conv2D) (None, 14, 14, 1024) 525312 activation_21[0][0] __________________________________________________________________________________________________ conv2d_27 (Conv2D) (None, 14, 14, 1024) 263168 activation_23[0][0] __________________________________________________________________________________________________ batch_normalization_24 (BatchNo (None, 14, 14, 1024) 4096 conv2d_24[0][0] __________________________________________________________________________________________________ batch_normalization_27 (BatchNo (None, 14, 14, 1024) 4096 conv2d_27[0][0] __________________________________________________________________________________________________ add_7 (Add) (None, 14, 14, 1024) 0 batch_normalization_24[0][0] batch_normalization_27[0][0] __________________________________________________________________________________________________ activation_24 (Activation) (None, 14, 14, 1024) 0 add_7[0][0] __________________________________________________________________________________________________ conv2d_28 (Conv2D) (None, 14, 14, 256) 262400 activation_24[0][0] __________________________________________________________________________________________________ batch_normalization_28 (BatchNo (None, 14, 14, 256) 1024 conv2d_28[0][0] __________________________________________________________________________________________________ activation_25 (Activation) (None, 14, 14, 256) 0 batch_normalization_28[0][0] __________________________________________________________________________________________________ conv2d_29 (Conv2D) (None, 14, 14, 256) 590080 activation_25[0][0] __________________________________________________________________________________________________ batch_normalization_29 (BatchNo (None, 14, 14, 256) 1024 conv2d_29[0][0] __________________________________________________________________________________________________ activation_26 (Activation) (None, 14, 14, 256) 0 batch_normalization_29[0][0] __________________________________________________________________________________________________ conv2d_30 (Conv2D) (None, 14, 14, 1024) 263168 activation_26[0][0] __________________________________________________________________________________________________ batch_normalization_30 (BatchNo (None, 14, 14, 1024) 4096 conv2d_30[0][0] __________________________________________________________________________________________________ add_8 (Add) (None, 14, 14, 1024) 0 activation_24[0][0] batch_normalization_30[0][0] __________________________________________________________________________________________________ activation_27 (Activation) (None, 14, 14, 1024) 0 add_8[0][0] __________________________________________________________________________________________________ conv2d_31 (Conv2D) (None, 14, 14, 256) 262400 activation_27[0][0] __________________________________________________________________________________________________ batch_normalization_31 (BatchNo (None, 14, 14, 256) 1024 conv2d_31[0][0] __________________________________________________________________________________________________ activation_28 (Activation) (None, 14, 14, 256) 0 batch_normalization_31[0][0] __________________________________________________________________________________________________ conv2d_32 (Conv2D) (None, 14, 14, 256) 590080 activation_28[0][0] __________________________________________________________________________________________________ batch_normalization_32 (BatchNo (None, 14, 14, 256) 1024 conv2d_32[0][0] __________________________________________________________________________________________________ activation_29 (Activation) (None, 14, 14, 256) 0 batch_normalization_32[0][0] __________________________________________________________________________________________________ conv2d_33 (Conv2D) (None, 14, 14, 1024) 263168 activation_29[0][0] __________________________________________________________________________________________________ batch_normalization_33 (BatchNo (None, 14, 14, 1024) 4096 conv2d_33[0][0] __________________________________________________________________________________________________ add_9 (Add) (None, 14, 14, 1024) 0 activation_27[0][0] batch_normalization_33[0][0] __________________________________________________________________________________________________ activation_30 (Activation) (None, 14, 14, 1024) 0 add_9[0][0] __________________________________________________________________________________________________ conv2d_34 (Conv2D) (None, 14, 14, 256) 262400 activation_30[0][0] __________________________________________________________________________________________________ batch_normalization_34 (BatchNo (None, 14, 14, 256) 1024 conv2d_34[0][0] __________________________________________________________________________________________________ activation_31 (Activation) (None, 14, 14, 256) 0 batch_normalization_34[0][0] __________________________________________________________________________________________________ conv2d_35 (Conv2D) (None, 14, 14, 256) 590080 activation_31[0][0] __________________________________________________________________________________________________ batch_normalization_35 (BatchNo (None, 14, 14, 256) 1024 conv2d_35[0][0] __________________________________________________________________________________________________ activation_32 (Activation) (None, 14, 14, 256) 0 batch_normalization_35[0][0] __________________________________________________________________________________________________ conv2d_36 (Conv2D) (None, 14, 14, 1024) 263168 activation_32[0][0] __________________________________________________________________________________________________ batch_normalization_36 (BatchNo (None, 14, 14, 1024) 4096 conv2d_36[0][0] __________________________________________________________________________________________________ add_10 (Add) (None, 14, 14, 1024) 0 activation_30[0][0] batch_normalization_36[0][0] __________________________________________________________________________________________________ activation_33 (Activation) (None, 14, 14, 1024) 0 add_10[0][0] __________________________________________________________________________________________________ conv2d_37 (Conv2D) (None, 14, 14, 256) 262400 activation_33[0][0] __________________________________________________________________________________________________ batch_normalization_37 (BatchNo (None, 14, 14, 256) 1024 conv2d_37[0][0] __________________________________________________________________________________________________ activation_34 (Activation) (None, 14, 14, 256) 0 batch_normalization_37[0][0] __________________________________________________________________________________________________ conv2d_38 (Conv2D) (None, 14, 14, 256) 590080 activation_34[0][0] __________________________________________________________________________________________________ batch_normalization_38 (BatchNo (None, 14, 14, 256) 1024 conv2d_38[0][0] __________________________________________________________________________________________________ activation_35 (Activation) (None, 14, 14, 256) 0 batch_normalization_38[0][0] __________________________________________________________________________________________________ conv2d_39 (Conv2D) (None, 14, 14, 1024) 263168 activation_35[0][0] __________________________________________________________________________________________________ batch_normalization_39 (BatchNo (None, 14, 14, 1024) 4096 conv2d_39[0][0] __________________________________________________________________________________________________ add_11 (Add) (None, 14, 14, 1024) 0 activation_33[0][0] batch_normalization_39[0][0] __________________________________________________________________________________________________ activation_36 (Activation) (None, 14, 14, 1024) 0 add_11[0][0] __________________________________________________________________________________________________ conv2d_40 (Conv2D) (None, 14, 14, 256) 262400 activation_36[0][0] __________________________________________________________________________________________________ batch_normalization_40 (BatchNo (None, 14, 14, 256) 1024 conv2d_40[0][0] __________________________________________________________________________________________________ activation_37 (Activation) (None, 14, 14, 256) 0 batch_normalization_40[0][0] __________________________________________________________________________________________________ conv2d_41 (Conv2D) (None, 14, 14, 256) 590080 activation_37[0][0] __________________________________________________________________________________________________ batch_normalization_41 (BatchNo (None, 14, 14, 256) 1024 conv2d_41[0][0] __________________________________________________________________________________________________ activation_38 (Activation) (None, 14, 14, 256) 0 batch_normalization_41[0][0] __________________________________________________________________________________________________ conv2d_42 (Conv2D) (None, 14, 14, 1024) 263168 activation_38[0][0] __________________________________________________________________________________________________ batch_normalization_42 (BatchNo (None, 14, 14, 1024) 4096 conv2d_42[0][0] __________________________________________________________________________________________________ add_12 (Add) (None, 14, 14, 1024) 0 activation_36[0][0] batch_normalization_42[0][0] __________________________________________________________________________________________________ activation_39 (Activation) (None, 14, 14, 1024) 0 add_12[0][0] __________________________________________________________________________________________________ conv2d_44 (Conv2D) (None, 7, 7, 512) 524800 activation_39[0][0] __________________________________________________________________________________________________ batch_normalization_44 (BatchNo (None, 7, 7, 512) 2048 conv2d_44[0][0] __________________________________________________________________________________________________ activation_40 (Activation) (None, 7, 7, 512) 0 batch_normalization_44[0][0] __________________________________________________________________________________________________ conv2d_45 (Conv2D) (None, 7, 7, 512) 2359808 activation_40[0][0] __________________________________________________________________________________________________ batch_normalization_45 (BatchNo (None, 7, 7, 512) 2048 conv2d_45[0][0] __________________________________________________________________________________________________ activation_41 (Activation) (None, 7, 7, 512) 0 batch_normalization_45[0][0] __________________________________________________________________________________________________ conv2d_43 (Conv2D) (None, 7, 7, 2048) 2099200 activation_39[0][0] __________________________________________________________________________________________________ conv2d_46 (Conv2D) (None, 7, 7, 2048) 1050624 activation_41[0][0] __________________________________________________________________________________________________ batch_normalization_43 (BatchNo (None, 7, 7, 2048) 8192 conv2d_43[0][0] __________________________________________________________________________________________________ batch_normalization_46 (BatchNo (None, 7, 7, 2048) 8192 conv2d_46[0][0] __________________________________________________________________________________________________ add_13 (Add) (None, 7, 7, 2048) 0 batch_normalization_43[0][0] batch_normalization_46[0][0] __________________________________________________________________________________________________ activation_42 (Activation) (None, 7, 7, 2048) 0 add_13[0][0] __________________________________________________________________________________________________ conv2d_47 (Conv2D) (None, 7, 7, 512) 1049088 activation_42[0][0] __________________________________________________________________________________________________ batch_normalization_47 (BatchNo (None, 7, 7, 512) 2048 conv2d_47[0][0] __________________________________________________________________________________________________ activation_43 (Activation) (None, 7, 7, 512) 0 batch_normalization_47[0][0] __________________________________________________________________________________________________ conv2d_48 (Conv2D) (None, 7, 7, 512) 2359808 activation_43[0][0] __________________________________________________________________________________________________ batch_normalization_48 (BatchNo (None, 7, 7, 512) 2048 conv2d_48[0][0] __________________________________________________________________________________________________ activation_44 (Activation) (None, 7, 7, 512) 0 batch_normalization_48[0][0] __________________________________________________________________________________________________ conv2d_49 (Conv2D) (None, 7, 7, 2048) 1050624 activation_44[0][0] __________________________________________________________________________________________________ batch_normalization_49 (BatchNo (None, 7, 7, 2048) 8192 conv2d_49[0][0] __________________________________________________________________________________________________ add_14 (Add) (None, 7, 7, 2048) 0 activation_42[0][0] batch_normalization_49[0][0] __________________________________________________________________________________________________ activation_45 (Activation) (None, 7, 7, 2048) 0 add_14[0][0] __________________________________________________________________________________________________ conv2d_50 (Conv2D) (None, 7, 7, 512) 1049088 activation_45[0][0] __________________________________________________________________________________________________ batch_normalization_50 (BatchNo (None, 7, 7, 512) 2048 conv2d_50[0][0] __________________________________________________________________________________________________ activation_46 (Activation) (None, 7, 7, 512) 0 batch_normalization_50[0][0] __________________________________________________________________________________________________ conv2d_51 (Conv2D) (None, 7, 7, 512) 2359808 activation_46[0][0] __________________________________________________________________________________________________ batch_normalization_51 (BatchNo (None, 7, 7, 512) 2048 conv2d_51[0][0] __________________________________________________________________________________________________ activation_47 (Activation) (None, 7, 7, 512) 0 batch_normalization_51[0][0] __________________________________________________________________________________________________ conv2d_52 (Conv2D) (None, 7, 7, 2048) 1050624 activation_47[0][0] __________________________________________________________________________________________________ batch_normalization_52 (BatchNo (None, 7, 7, 2048) 8192 conv2d_52[0][0] __________________________________________________________________________________________________ add_15 (Add) (None, 7, 7, 2048) 0 activation_45[0][0] batch_normalization_52[0][0] __________________________________________________________________________________________________ activation_48 (Activation) (None, 7, 7, 2048) 0 add_15[0][0] __________________________________________________________________________________________________ global_average_pooling2d (Globa (None, 2048) 0 activation_48[0][0] __________________________________________________________________________________________________ dense (Dense) (None, 1000) 2049000 global_average_pooling2d[0][0] ================================================================================================== Total params: 25,636,712 Trainable params: 25,583,592 Non-trainable params: 53,120 __________________________________________________________________________________________________ オッケーです! パラメータが公式実装のものと一致してくれました! 最後に モデル構築面白いです。次はUNetかDenseNet辺りでしょうか。 近いうちに記事にできればと思います。 書いたコード(最終結果) import os import warnings os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' warnings.simplefilter('ignore') from typing import Union import tensorflow as tf from tensorflow.keras.layers import (Activation, Add, BatchNormalization, Conv2D, Dense, GlobalAveragePooling2D, Input, MaxPooling2D, ZeroPadding2D) from tensorflow.keras.models import Model class ResNet(): """ResNet Architecture""" __LAYER_LOOPS = { '18' : [2,2,2,2], '34' : [3,4,6,3], '50' : [3,4,6,3], '101' : [3,4,23,3], '152' : [3,8,36,3] } def __init__(self, input_ch:tuple, output_ch:int, layers:str): try: self._range = self.__LAYER_LOOPS[layers] except KeyError: raise ValueError('ResNet layers must be [18, 34, 50, 101, 152].') self.input_ch = input_ch self.output_ch = output_ch self.layers = layers self.index = 0 def conv_bn_act(self, x, filters:Union[int, tuple, list], kernel_size:Union[int, tuple, list], strides:Union[int, tuple, list], skip_activation=False, **kwargs): """ Conv2D + BatchNormalization + Relu """ x = Conv2D(filters=filters, kernel_size=kernel_size, strides=strides, **kwargs)(x) x = BatchNormalization()(x) if not skip_activation: x = Activation('relu')(x) return x def conv_x(self, x, times, initial_strides=2): """conv{n}_x""" filters = 64*(2**times) for i in range(self._range[self.index]): if i==0: strides = initial_strides y = self.conv_bn_act(x, 4*filters, 1, strides=strides, skip_activation=True) else: strides = 1 y = x if self.layers == 18 or self.layers == 34: x = self.conv_bn_act(x, filters, 3, 2, padding='same') x = self.conv_bn_act(x, filters, 3, 1, skip_activation=True, padding='same') else: x = self.conv_bn_act(x, filters, 1, strides=strides) x = self.conv_bn_act(x, filters, 3, 1, padding='same') x = self.conv_bn_act(x, 4*filters, 1, 1, skip_activation=True) x = Add()([y, x]) x = Activation('relu')(x) self.index += 1 return x def build_resnet(self): input = Input(shape=self.input_ch) # 7x7 conv, 64, /2 x = ZeroPadding2D(padding=3)(input) x = self.conv_bn_act(x, filters=64, kernel_size=7, strides=(2,2)) # pool, /2 x = ZeroPadding2D()(x) x = MaxPooling2D(pool_size=(3,3), strides=2)(x) # conv2_x x = self.conv_x(x, 0, initial_strides=1) # conv3_x x = self.conv_x(x, 1) # conv4_x x = self.conv_x(x, 2) # conv5_x x = self.conv_x(x, 3) # average pool, softmax x = GlobalAveragePooling2D()(x) x = Dense(units = self.output_ch, activation='softmax')(x) model = Model(inputs = input, outputs = x) return model resnet_50 = ResNet(input_ch = (224, 224, 3), output_ch=1000, layers='50') model = resnet_50.build_resnet() model.summary()
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

python で MemoryError を捕捉する方法

Overview けっこう昔にこんな投げっぱなしな感じの記事書いたんですけど、 https://qiita.com/arc279/items/d400c92d6019afc665eb その派生というか、 docker 内のプロセスが OOMKiller に始末されるのを避けて MemoryError を捕捉する方法です。 事前準備と予備知識 とりあえずメモリを500MB に制限して docker で python を起動します。 docker周り たまたま手元にあったのが python:3.7.6-slim だったので別に深い意味はないです。 docker-compose.yml version: '3.9' services: node: image: python:3.7.6-slim volumes: - .:/mnt deploy: resources: limits: memory: 500M reservations: memory: 500M tty: true command: bash bash # 起動して $ docker-compose up # コンテナに入る $ docker-compose exec node bash コンテナ内で確認  docker のメモリ制限は cgroup で制限されてるので、確認はこう。 bash root@33fc41fd23a2:/# cat /sys/fs/cgroup/memory/memory.limit_in_bytes 524288000 500MB に制限されてますね。 memory_swap を設定しない場合の swap はメモリ指定の2倍になってるそうです。 ちなみに free とか /proc/meminfo には反映されないので注意。 ホストから14GB割り当ててる場合の図 root@33fc41fd23a2:/# cat /proc/meminfo | grep Mem MemTotal: 14334276 kB MemFree: 13063124 kB MemAvailable: 13221092 kB root@33fc41fd23a2:/# free total used free shared buff/cache available Mem: 14334276 468032 12900708 409740 965536 13210688 Swap: 1048572 43808 1004764 python でヒープサイズの上限 特に指定しないと無制限になってるので、 python >>> import resource >>> resource.getrlimit(resource.RLIMIT_DATA) (-1, -1) メモリ 500MB の状況で 4GB くらい確保しようとすると python >>> try: ... bytearray(4000 * 1024 ** 2) ... except Exception as e: ... print(type(e), e) ... Killed except できず問答無用で OOM Killer に始末されて死んじゃいます。 ヒープサイズに制限をかける で、無言で死んでしまうとちょっと困るので、これをなんとか捕捉したい。 上限を設定します ヒープサイズの上限を500MBに設定した! >>> import resource >>> resource.setrlimit(resource.RLIMIT_DATA, (524288000, -1)) >>> print(resource.getrlimit(resource.RLIMIT_DATA)) (524288000, -1) で、再度実行 python >>> try: ... bytearray(4000 * 1024 ** 2) ... except Exception as e: ... print(type(e), e) ... <class 'MemoryError'> except で補足できました。 ちなみに MemoryError は無口なので str(e) しても特に文言がありません。 なので type(e) しないと分かりづらいので注意。 上記をまとめると ヒープサイズの上限を /sys/fs/cgroup/memory/memory.limit_in_bytes の値に設定してやれば良さそうです。 trap_memory_error.py import resource # 500MB しかなくても 4GB確保したい alloc_size = 4000 * 1024 ** 2 with open("/sys/fs/cgroup/memory/memory.limit_in_bytes", "r") as fp: memory_limit_in_bytes = int(fp.read()) print("alloc_size", alloc_size) print("/sys/fs/cgroup/memory/memory.limit_in_bytes", memory_limit_in_bytes) resource.setrlimit(resource.RLIMIT_DATA, (memory_limit_in_bytes, -1)) print(resource.getrlimit(resource.RLIMIT_DATA)) try: bytearray(alloc_size) print("OK") except MemoryError as e: print(type(e), e) bash root@33fc41fd23a2:/mnt# python trap_memory_error.py alloc_size 4194304000 /sys/fs/cgroup/memory/memory.limit_in_bytes 524288000 (524288000, -1) <class 'MemoryError'> なお、ヒープ上限を設定しないと 上記の resource.setrlimit の行をコメントアウトして実行すると、普通に OOM Killer に始末されて死にます。 root@33fc41fd23a2:/mnt# python no-trap_memory_error.py alloc_size 4194304000 /sys/fs/cgroup/memory/memory.limit_in_bytes 524288000 (-1, -1) Killed っていう話。 プロセスの確保可能なヒープサイズに上限を設定することでプロセス内で捕捉するのが肝なので、 同様の手段があれば python 以外でもできると思います。 cf. https://docs.python.org/ja/3/library/resource.html https://qiita.com/toshihirock/items/236b7541016929060cc0 https://yanomy.hatenablog.com/entry/2018/07/31/221957
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

WSL2上でyoloを動かしてみる

TL;DR 練習がてらv2でもv3でもない無印yoloをWSL2上で動かしてみました。 以下の記事とサイトを参考にさせていただきました。 モチベーション なんか画像系AIさわってみたい。でもGPUは極力使いたくない。 とりあえず流行りのyoloにさわってみよう。 コンテナ用意 docker-composeで用意しました。 Dockerfile FROM python:3.7-buster WORKDIR /opt/work docker-compose.yml version: '3' services: yolo: build: context: . dockerfile: Dockerfile container_name: 'python371' tty: true volumes: - ./work:/opt/work コンテナ環境の整備 コンテナに入ったらひたすらコマンドを叩きます。 apt update && apt -y upgrade apt install -y libgl1-mesa-dev git git clone https://github.com/thtrieu/darkflow.git pip install --upgrade pip pip install numpy -U pip install opencv-python==3.4.5.20 pip install tensorflow==1.15 pip install Cython cd darkflow python setup.py build_ext --inplace pip install -e . pip install . mkdir bin weightsを用意 上の作業で作成したbin/に以下のyolo.weightsを設置します。 GoogleDriveからweightsをDLLします。 動作確認 とりあえず動くかだけ確認します。 from darkflow.net.build import TFNet import os import cv2 os.chdir('darkflow') option = {"model": "cfg/yolo.cfg", "load": "bin/yolo.weights", "threshold": 0.1} tf = TFNet(option) imgcv = cv2.imread("/opt/work/src/hogehoge.jpg") print(tf.return_predict(imgcv)) 結果 無事動作を確認できました。 別のプログラムで人を検出するところまでは確認できました。 今回はここまでとして、具体的に動かす部分は別途試していきたいです。 最後に 学習済みモデルでも結構色々遊べるみたいです。 学習者側からすると嬉しい限りです。 注意および免責事項 本記事の内容はあくまで私個人の見解であり、所属する組織の公式見解ではありません。 本記事の内容を実施し、利用者および第三者にトラブルが発生しても、筆者および所属組織は一切の責任を負いかねます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ただの単語だけじゃなくて文章内の単語に反応してくれるdiscord botを作る方法

・前書き 今回はdiscordで文章を送るとその文章内の特定の単語に反応してメッセージを返してくれるbotの作り方の解説です。 (※「特定の単語」は一つではなくて、リストを使い複数の特定の単語に反応するbotを作ります。) ・前準備 botとかのいろいろな準備はこちらを参照。 Pythonで簡単なDiscord Botの作り方 環境はpython 3.8.5です。 ・他と何が違うのか こういうbotの作り方をネットで探すと、特定の単語に反応してメッセージを返してくれるbotの作り方はたくさんあります。 例文でいえば import discord client = discord.Client() Token = 'your token' #←トークンを入れてください @client.event async def on_ready(): print("ready") @client.event async def on_message(message): list_1 = ['ねこ', '猫', 'neko'] if message.author.bot: #botからのメッセージは避けます return for list_2 in list_1: #リストを使っているのでfor文で繰り返し if message.content == list_2 #送られてきたメッセージがリストの中にあったら「にゃーん」というメッセージを送る await message.channel.send("にゃーん") return client.run(Token) これはリストにまとめた「ねこ」、「猫」、「neko」と送信するとbotから「にゃーん」と返ってくるプログラムです。 これを動かすと下の画像のようになります。 しかし上のように「ねこちゃん」など特定の単語を含む文章になるとbotが反応しなくなります。 この方法を解説していきます。 ・本題 ・方法 というわけで文章中の単語に反応するbotを作るわけですが、方法は簡単です。 "in"を使うだけです。 inは今回の場合、 特定の単語の入った変数 in 入力された文字列が入った変数 といったように使い、「入力された文字列が入った変数」の中に「特定の単語の入った変数」が存在するときにTrueを返します。これを使ってユーザーが送ったメッセージに特定の単語が含まれているか判別します。 ・サンプルコード import discord client = discord.Client() token = 'your token' #トークンを入れてください @client.event async def on_ready(): #ここは適当に print("ready") @client.event async def on_message(message): list_1 = ['ねこ', '猫', 'neko'] #好きな単語を入れましょう if message.author.bot: return for list_2 in list_1: word = list_2 in message.content if word is True: #この後にrandomなどと組み合わせることで様々な返答をランダムに返させることもできます await message.channel.send("にゃーん") client.run(token) ~解説~ 1.(15行目)まず、for文のところで"list_1"内に入っている単語の数分ループし、ループした際の単語を"list_2"に代入します。 2.そのあと word = list_2 in message.content で"message.content(=ユーザーによって鯖内で送信された文章)の中に"list_2"が表す単語が入っていればTrue、入っていなければFalseという結果を変数の"word"に代入します。 3.そして最後に"word"の値がTrueならば await message.channel.send("にゃーん") が送信されます。 もちろん"word"の値がFalseならばif文の処理は実行されず、botは何も送信しません。 ・試しに実行してみる 画像のようにちゃんと機能してます。 「ねこちゃん」とかの文章でもbotが反応してくれてますね。 ・あとがき 今回はpythonで文章内の単語に反応してくれるdiscord botを作りました。 めちゃくちゃ楽しいのでやってみてください。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Flutterのproviderパターンでページを追加するプログラムを書いてみた

どうもみやジックです。 僕は普段providerパターンでflutterのアプリ開発をしています。 providerパッケージを用いたMVVMモデルの開発です。 ここではproviderパターンの説明はしませんが、ざっくり言うとアプリの画面の見た目を構成するViewとロジックを書くModelを用意してアプリを開発していく感じです(かなり不十分な説明)。 つまり、アプリの画面1ページにつき2つのdartファイルが必要です。今までは一つ画面を増やすたびに、ディレクトリ作成、ファイル作成、それぞれコピペしてきて、クラス名等を書き換えていました。 何度も同じことを繰り返す作業は自動化するのがエンジニアの性なので上記のファイルを自動生成するプログラムを書きました。これを紹介します。 やりたいこと ・新しいディレクトリを作成(作成するページ名のディレクトリ、今回はhogeとする) ・作成したディレクトリにdartファイルを作成(hoge_page.dart,hoge_model.dart) ・最小限のページを表示できるHogePageクラスとHogeModelクラスをコピペする 実装していく 上記のやりたいことを実現するプログラムをPythonで書くことにした。 理由は僕が一番慣れているから、、、 多分今回やりたいことを一番簡単にできる言語はPythonだと思う。知らんけど 今回のやりたいことから実装することを整理すると以下の4つの工程に分けられる。 ・ページ名を取得する ・適切なパスにディレクトリを作成する ・作成したディレクトリにファイルを作成する ・上記のファイルにテキストを貼り付ける 開発しているアプリのディレクトリに今回のプロジェクトを入れたくはなかったので、同じ階層にプロジェクトを作成。 下記に必要なところだけ抜粋したプロジェクト構成を示す。SepakJudgeがFlutterプロジェクトでPageCreateがPythonプロジェクトのディレクトリである。赤字で示しているのはPythonプログラムによって追加されるディレクトリとファイルである。青字で示しているのは新しく作成したファイルにコピペするためのテキストファイルである。 ├SepakJudge  └ lib   └ presentation    └ hoge     ├ hoge_page.dart     └ hoge_model.dart └PageCreate  ├ main.py  ├ create_page_for_mobile.py  ├ mobile_page.txt  └ mobile_model.txt 最初にmain()を定義してPythonのおまじないも書いておく。 main.py def main(): print('新しく作成するページ名を入力してください(UpperCamelCase)') new_page_name = input() ## アッパキャメルケースを想定 print('新しく', new_page_name, 'ページを作成しますか? y/N') isOK = input() if __name__ == '__main__': main() まず初めにページ名を入力している。 ページ名はアッパーキャメルケースで要求している。クラスの定義に使う用である。 多分dartの慣習であるが、自分は ファイル名はスネークケース クラス名はアッパーキャメルケース 変数名はロワーキャメルケース で書いているため、受け取ったページ名を後から適宜編集する必要がある。(英語を無理矢理カタカナで書くと頭悪そう) 次にCreatePageForMobileクラスを定義、ここの中でディレクトリやファイルを作成したりしていく。 なぜForMobileかというとFlutterWebはFlutterWebでクラスを定義したいから。 CreatePafeForMobileではコンストラクタとしてさっきのpage名とかを取得したい。 create_page_for_mobile.py import inflection class CreatePageForMobile(): def __init__(self, newPageName: str): self.newPageName = newPageName self.newPageNameSnakeCase = inflection.underscore(newPageName) inflectionをインポートしてinflection.underscoreでアッパーケースからスネークケースを取得している。便利 次にディレクトリ作成メソッドを記述する。 create_page_for_mobile.py def create_the_directory(self): path = '../SepakJudge/lib/presentation/' + self.newPageNameSnakeCase os.mkdir(path) ※osモジュールをインポートする必要あり ディレクトリ階層に注意してpresentation配下にスネークケースでディレクトリ作成 次にファイル作成メソッドを記述する。 今回はpageかmodelを引数にとってメソッド内で条件分岐させてファイルを生成する。mainで2回呼ぶことになる。 create_page_for_mobile.py def create_the_dart_file(self, temp: str): ##tempには'page'or'model' ### テキストファイルの読み込み originalFile = open('./mobile_%s.txt' % temp, 'r') originalText = originalFile.read().replace('Temp', self.newPageName) if temp == 'page': originalText = originalText.replace('//pythonプログラムによって自動生成', "import '%s_model.dart';" % self.newPageNameSnakeCase) originalFile.close() ### dartファイルの作成 path = '../SepakJudge/lib/presentation/' + self.newPageNameSnakeCase f = open(path + '/' + self.newPageNameSnakeCase + '_%s.dart' % temp, 'w') f.write(originalText) f.close() まず、用意しておいたテキストファイルを読み込む。orginalTextに文字列として格納する。 ここで、replaceメソッドを使ってテキストファイル内のTempを新しいページの名前に置き換える。 また、pageの方ではmodelをインポートする必要があるので、インポート分も差し込む。 replaceを使うための印として//pythonプログラムによって自動生成とテキストファイルに入れておくことでこの文とインポート文を置き換えている。 次に新しく生成するファイルを開き、originalTextを書き込む。 今回読み込んだテキストファイルは以下の二つになっている。 今回は汎用性を高めるためにかなり最小限の記述しかしていないが、毎回かくWidgetやコンストラクタも書いておくと便利かもしれない。 mobile_page.txt import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; //pythonプログラムによって自動生成 class TempPage extends StatelessWidget { @override Widget build(BuildContext context) { return ChangeNotifierProvider<TempModel>( create: (_) => TempModel(), //TempModelを作成 child: Scaffold( appBar: AppBar( title: Text('TempPage'), ), body: Consumer<TempModel>( builder: (context, model, child) { return Container(); }, ), ), ); } } mobile_model.txt import 'package:flutter/material.dart'; class TempModel extends ChangeNotifier {} 以上でページ作成のクラスは出来上がり! これらをmain()で呼んであげる必要がある。 main.py from create_page_for_mobile import CreatePageForMobile def main(): print('新しく作成するページ名を入力してください(UpperCamelCase)') new_page_name = input() ## アッパキャメルケースを想定 print('新しく作成するページのタイトルを入力してください') new_page_title = input() print('新しく', new_page_name, 'ページを作成しますか? y/N') isOK = input() if isOK == 'y' or isOK == 'yes': createPage = CreatePageForMobile(new_page_name, new_page_title) createPage.create_the_directory() createPage.create_the_dart_file('page') createPage.create_the_dart_file('model') if __name__ == '__main__': main() できたこと まずは実行した時の流れを示す。 新しく作成するページ名を入力してください(UpperCamelCase) >hoge 新しく Hoge ページを作成しますか? y/N >y 次に作成されたファイルを示す。 hoge_page.dart import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'hoge_model.dart'; class HogePage extends StatelessWidget { @override Widget build(BuildContext context) { return ChangeNotifierProvider<HogeModel>( create: (_) => HogeModel(), //HogeModelを作成 child: Scaffold( appBar: AppBar( title: Text('HogePage'), ), body: Consumer<HogeModel>( builder: (context, model, child) { return Container(); }, ), ), ); } } hoge_model.dart import 'package:flutter/material.dart'; class HogeModel extends ChangeNotifier {} 読み込んだテキストファイルと比べると必要なところが書き換えられていることがわかる。 また出来上がったページはこんな感じである。 このページへの導線は引く必要があるが画面を追加するための手間が少し楽になった。 webの方ではもう少しだけやらなければいけないことがあるので記事にするか迷ってる。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

macのOpenCVで利用されるCameraのDevice Listの取得方法

こんなこと、ありませんか?解決できます! コードを変えていないのに、カメラが別のカメラに切り替わってしまう! チームメンバーの環境で試してもらうときに、独自定数 camera_device_index をいくつか試すように伝えないといけない! system_profiler -json SPCameraDataTypeを使えばデバイスリストを取得できると聞いたのに、異なるカメラに接続されてしまうケースが頻発! swiftスクリプトでデバイスリストを取得できます! 私が公開しているこのスクリプトで信頼できるリストがつくれます! 前提 macOS (私はmacOS 11.3) OpenCVのcv::VideoCaptureを利用している。 Capture API backendsにCAP_ANYかCAP_AVFOUNDATIONかCAP_FFMPEGを使っている。 仕組み macのcv::VideoCaptureはCapture API backendsに様々なものを利用できるようになっています。(リスト) 特殊な設定をしていなければmacではCAP_ANYにすると、CAP_AVFOUNDATIONかCAP_FFMPEGが選択されます。 Capture API backendsがどちらであったとしても、macでは最終的にはAVFoundationが使われてビデオキャプチャしています。ffmpegの場合、ffmpegのAVFoundationプラグインが利用されます。 したがって、camera_device_indexはAVFoundationのリストと整合すればよいのです。 AVFoundationのカメラデバイスリストの取得方法 残念ながら標準のコマンドは存在しないようですし、pythonやc++から直接使うには骨が折れます。 ですが、AVFoundationはswiftからなら非常に簡単に取得できます。 またmacではswiftを特殊なビルドなくスクリプトのように利用できます! swiftスクリプトでリストをつくりstdoutに出力しさえすれば、あとはpythonやC++からコマンド呼び出ししてstdoutを捕まえてあげればok SwiftでのAVFoundationのカメラリスト取得コード あまりにも簡単すぎで説明が必要ないですね。メソッドの詳細を知りたい人は検索すればAppleのページで詳しく説明してくれています。 import AVFoundation let discovery = AVCaptureDevice.DiscoverySession( deviceTypes: [ AVCaptureDevice.DeviceType.builtInWideAngleCamera, AVCaptureDevice.DeviceType.externalUnknown, ], mediaType: AVMediaType.video, position: AVCaptureDevice.Position.unspecified ) let devices = discovery.devices 所感 かなり振り回されました。この半年ひどくハマりました。チームメンバーにも迷惑を掛けたと思います。 結局、OpenCVのコードを追いかけて、ffmpegのコードを追いかけてやっとここまでたどり着きました。どちらもプラグインという概念で拡張しているためコードを追うのは一苦労です。cmakeやconfigureの引数でリンクするコードが変わってしまいます。 やっと安心してVideoCaptureを利用できそうです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Google colab上で動画生成

はじめに Google colab上で動画を生成する際、MatplotlibのArtistsAnimationを使う方法があるが、毎回うまく動かずハマる。試行錯誤の末、Matplotlibを使わず、ムービーファイルをシェルコマンドで生成してしまうのが早いことがわかった。 画像の生成 まず、自分のディレクトリ上に連番のファイルを生成する generateAndSaveMovie.ipynb import numpy as np import matplotlib.pyplot as plt from matplotlib.animation import ArtistAnimation fig = plt.figure() ax = fig.add_subplot(1, 1, 1) # 0 <=x < 2pi の範囲の点列を作成。 x = np.linspace(0, 2*np.pi, 101)[: -1] # 各コマの画像を格納する配列 image_list = [] for i in range(100): y = np.sin(np.roll(x, -i)) plt.plot(x, y) plt.savefig("image_"+(str(i).zfill(2))+".jpg") plt.clf() ムービー変換 次に、ffmpegを用いて連番のファイルをmp4等のムービーに変換する。 !ffmpeg -r 30 -i image_%02d.jpg -vcodec libx264 -pix_fmt yuv420p -r 60 out.mp4 画像ファイル消去 画像ファイルはrmを使って消去する !rm *.jpg
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

tf-idf

tf-idf tf-idfとはある文書中に含まれる単語の重要度を評価する手法の1つである。tf-idfはtfとidfの二つの指標を持って計算する。まず二つを分けて説明する。 tf tfとはterm frequencyの略であり、ある単語$w_j$が文章$d_i$に出現する頻度である。つまり、単語$w_j$が文章$d_i$に出現する回数を文章$d_i$の総単語数で割ったものである。単語$w_j$が文章$d_i$に出現する回数を関数$f(d_i, w_j)$で求められるとすると、tfは以下のように書ける。 $$ tf = \frac{f(d_i, w_j)}{\sum_{k\in d_i}f(d_i, w_k)} $$ pythonでtfを実装すると以下のようなプログラムになる。 import MeCab mecab = MeCab.Tagger("-Owakati") # 文章 doc = "国境の長いトンネルを抜けると雪国であった。夜の底が白くなった。信号所に汽車が止まった。" # 単語 word = "雪国" # 文章を分かち書きし、単語リストに変換する。 doc_wakati_list = mecab.parse(doc).split() # 文章の単語数 word_count = len(doc_wakati_list) # 単語の出現数 word_emergency_count = doc_wakati_list.count(word) # tfを求め出力 単語の出現数/文章の単語数 print('tf', word_emergency_count/word_count) このプログラムは文章が「国境の長いトンネルを抜けると雪国であった。夜の底が白くなった。信号所に汽車が止まった。」、単語が「雪国」で実装したものである。 idf idfとはinverse document frequencyの略であり、全文章中に単語$w_j$が含まれる確率の逆数の対数(底2)をとったものである(逆文章頻度)。idfは言い換えると、文章中に単語$w_j$があるという情報量である。全文章数を$N$、全文章のうち単語$w_j$が含まれる文章数を$g(w_j)$とすると、単語$w_j$のidfは以下のように書ける $$ idf_j = \log_2(\frac{N}{g(w_j)}) $$ この式からidfは文章中に単語が出てくる回数が少なければ少ない単語ほど値が大きくなることがわかる(idfが情報量を表していると言っているから当然だけど)。 pythonでidfを実装すると以下のようなプログラムになる。 import numpy as np import MeCab mecab = MeCab.Tagger("-Owakati") # 文章 doc_list = ["国境の長いトンネルを抜けると雪国であった。夜の底が白くなった。信号所に汽車が止まった。", "道がつづら折りになって、いよいよ天城峠に近づいたと思う頃、雨足が杉の密林を白く染めながら、すさまじい早さで麓から私を追ってきた。", "えたいの知れない不吉な塊が私の心を始終圧えつけていた。焦燥と云おうか、嫌悪と云おうか― 酒を飲んだあとに宿酔があるように、酒を毎日飲んでいると宿酔に相当した時期がやって来る。"] # 単語 word = "雪国" # 文章の単語数 word_count = 0 # 単語の出現数 word_emergency_count = 0 # 文章ごとに計算する for doc in doc_list: doc_wakati_list = mecab.parse(doc).split() word_count += len(doc_wakati_list) word_emergency_count += doc_wakati_list.count(word) # tfを求め出力 単語の出現数/文章の単語数 print('idf', np.log2(word_count/(word_emergency_count+1))) このプログラムは文章が「国境の長いトンネルを抜けると雪国であった。夜の底が白くなった。信号所に汽車が止まった。」などのいくつかの文章群、単語が「雪国」で実装したものである。説明なく$\log_2$の分母に+1しているが、これは単語が全文章中にない時に分母が0になることを防ぐためによく使われる手法である。 合体 tf-idfはtfとidfをかけ合わせたものである。 $$  \mathrm{tf-idf}(d_i,w_j) = \mathrm{tf}(d_i, w_j) \times \mathrm{idf}(w_j) $$ tf-idfは文章$d_i$中に単語$w_j$が出現する頻度が高ければ高いほど大きくなり(tf)、全文章中に単語$w_j$が出現する頻度が低ければ低いほど小さくなる(idf)。td-idfは単語が注目している文章中に出現する頻度に文章全体でのその単語の情報量で重み付けしたものとも考えられる。 pythonでtf-idfを実装すると以下のようなプログラムになる。 import numpy as np import MeCab mecab = MeCab.Tagger("-Owakati") # 文章 doc_list = ["国境の長いトンネルを抜けると雪国であった。夜の底が白くなった。信号所に汽車が止まった。", "道がつづら折りになって、いよいよ天城峠に近づいたと思う頃、雨足が杉の密林を白く染めながら、すさまじい早さで麓から私を追ってきた。", "えたいの知れない不吉な塊が私の心を始終圧えつけていた。焦燥と云おうか、嫌悪と云おうか― 酒を飲んだあとに宿酔があるように、酒を毎日飲んでいると宿酔に相当した時期がやって来る。"] # 対象の文章 doc_tar_idx = 0 # 単語 word = "雪国" # 文章の単語数 all_word_count = 0 # 単語の出現数 all_word_emergency_count = 0 for i, doc in enumerate(doc_list): doc_wakati_list = mecab.parse(doc).split() word_count = len(doc_wakati_list) all_word_count += word_count word_emergency_count = doc_wakati_list.count(word) all_word_emergency_count += word_emergency_count if i == doc_tar_idx: tf = word_emergency_count / word_count idf = np.log2(all_word_count/(all_word_emergency_count+1)) # tfを求め出力 単語の出現数/文章の単語数 print('tf-idf', tf*idf) このプログラムは先ほど同様に文章が「国境の長いトンネルを抜けると雪国であった。夜の底が白くなった。信号所に汽車が止まった。」などの文章群、単語が「雪国」で実装したものである。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

pythonで Azure Blob、AWS S3からMD5ハッシュ値を取得する

はじめに 本年度から業務内容がWindowsアプリ開発からAWS関連の業務に代わり、 最初のタスクが「Azure Blob Storageから AWS S3に移行されたデータが正しく移行されているかの検証」でした。 aws s3にはアップロード時に、アップロード前と後のオブジェクトの整合性を検証する手段があるのですが、今回は既に全データ移行済みだったため、BlobとS3のメタデータを取得して格納されているMD5ハッシュ値で検証を実施しました。 ちなみに言語はpythonを使っています。 結論 オブジェクトのメタデータ取得(S3編) オブジェクトのメタデータ取得(Blob編) 終わり オブジェクトのメタデータ取得(S3編) pythonかつaws s3のメタデータを取得する方法は探せば多くの情報が見つかると思います。 下記のコードもその一例になります。 from azure.storage.blob import BlobServiceClient # AWS CLIの aws configure コマンドで .aws/credentialsファイルに書き込むこと aws_access_key_id = '' aws_secret_access_key = '' bucket_name = '' key_name = '' s3_cli = boto3.client('s3',aws_access_key_id, aws_secret_access_key) # オブジェクトのメタデータを取得 s3_resp = s3_cli.head_object(bucket_name, key_name) # レスポンスからMD5ハッシュが格納されているEtagを取得 s3obj_etag = s3_resp['ETag'].strip('"') return s3obj_etag key_idやbucket_nameは自分の環境にあわせて値を代入してください。 boto3.client()でs3へアクセスするオブジェクトをまず取得します。 その後、head_object()でオブジェクトのメタデータを取得します。 # オブジェクトのメタデータを取得 s3_resp = s3_cli.head_object(bucket_name, key_name) s3_respはjsonが返ってきます。返り値の中身は下記のようなデータが入っています。 "s_respの中身の例" {'ResponseMetadata': {'RequestId': '9dad3fc3-0e30-1dbc-a754-06bdfcde1d5e', 'HostId': '', 'HTTPStatusCode': 200, 'HTTPHeaders': {'date': 'Sun, 13 Dec 2020 22:43:10 GMT', 'x-amz-request-id': '9dad3fc3-0e30-1dbc-a754-06bdfcde1d5e', 'last-modified': 'Sun, 13 Dec 2020 22:40:57 GMT', 'etag': '"669fdad9e309b552f1e9cf7b489c1f73-2"', 'content-type': 'binary/octet-stream', 'x-amz-server-side-encryption': 'AES256', 'x-amz-version-id': 'fe14c26b-bba0-6edf-a754-06bdfcde1d5e', 'accept-ranges': 'bytes', 'content-length': '10485760', 'server': 'CloudianS3'}, 'RetryAttempts': 0}, 'AcceptRanges': 'bytes', 'LastModified': datetime.datetime(2020, 12, 13, 22, 40, 57, tzinfo=tzutc()), 'ContentLength': 10485760, 'ETag': '"669fdad9e309b552f1e9cf7b489c1f73-2"', 'VersionId': 'fe14c26b-bba0-6edf-a754-06bdfcde1d5e', 'ContentType': 'binary/octet-stream', 'ServerSideEncryption': 'AES256', 'Metadata': {}} 返り値の参考例 https://zenn.dev/nowko/books/550bcd398f3122/viewer/ce44b4 head_objectの返り値にETagというキーがあります。この値がMD5ハッシュ値になります。 'ETag': '"669fdad9e309b552f1e9cf7b489c1f73-2"' 数字型として使う場合は、下記のようにstrip()で "" を削除して使いましょう。 # レスポンスからMD5ハッシュが格納されているEtagを取得 # ""を除去 s3obj_etag = s3_resp['ETag'].strip('"') 以上でaws s3のMD5ハッシュ取得については終了です。 オブジェクトのメタデータ取得(Blob編) s3と違ってazure blobのメタデータ取得については、探すのに時間がかかりました。 なので、ここからは皆さんのお役になる情報だと思います。 from azure.storage.blob import BlobServiceClient # BLOB接続文字列 connectionString = '' container_name = '' blob_name = '' blob_service_client = BlobServiceClient.from_connection_string(connectionString) blob_client = blob_service_client.get_blob_client(container_name, blob_name) # BLOBのすべてのユーザー定義メタデータ、標準HTTPプロパティ、およびシステムプロパティを受け取る prop = blob_client.get_blob_properties() bytearray = prop['content_settings']['content_md5'] return bytearray.hex() 以下、解説になります。 from_connection_string()、get_blob_client()を使ってBlobClientを取得します。 blob_service_client = BlobServiceClient.from_connection_string(connectionString) blob_client = blob_service_client.get_blob_client(container_name, blob_name) BlobClientクラスにはget_blob_properties()というAPIがあり、このAPIがBLOBのメタデータ(BlobProperties)を返してくれます。 ここで注意点なのですが、BlobPropertiesにはetagというキーがありますが、今回欲しいハッシュ値は、content_settingsキーの値ContentSettingsにcontent_md5というキーがありこちらになります。 prop = blob_client.get_blob_properties() bytearray = prop['content_settings']['content_md5'] return bytearray.hex() content_md5はbytearray型なので、hex()で変換することでs3で取得した値と同じものになるかと思います。 終わり 以上になります。 先にs3のハッシュを取得できていたため、BlobPropertiesにはetagを見つけて返り値を確認した時は、なぜs3の返り値と値が異なるのかと頭を抱えていました。 Microsoftのドキュメントをきちんと確認することはやはり大事ですね。 皆さんはデータ移行時は必ずアップロード時に整合性を確認して、失敗した場合はリトライなどの処理をしましょう。データ数が多いので、移行後の整合性確認はお金の無駄でしかありません。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Arduino UNOをPCのDigital I/Oとして活用する

Windows PCには単純なInput/Output ADなどが使うことができません。 過去にWindows PCにはプリンタポートやシリアルポートなど組み込み用途と使える インターフェースがありましたが、最近のPCはそれら古いインターフェスは省略されています。 Arduino UNOはスケッチを使って簡単に組み込みプログラムを動作できるのですが 組み込みプログラムをある程度知識が必要です。 ArduinoにはPCと接続を意識したFimata というFWが準備されています。 これを使えばPythonプログラミングでI/O操作を行うべく使えるようになります。 サポートされているI/Oインターフェスを記載します。 現在、ArduinoのFirmataに接続するPythonインターフェースは大きく分けて2つあるようです。 pyFirmata I/O Pin ADC Input PWM output I2C SPI UART 〇 〇 〇 × × × pyMata I/O Pin ADC Input PWM output I2C SPI UART 〇 〇 〇 〇 × × UARTはFirmataの制御用で使えないので仕方ないですが SPIが対応していないのが惜しいところ。pyMataであればI2C対応しているので センサー機器をつないで制御するには向いています。 簡単に使うのであればpyFimataの方が使いやすいかもしれません。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MIDASを用いた我が国GDPのナウキャスティング

目的 『わが国のGDPのナウキャスティングに関する検討』の再現性の確認(MIDAS手法とブリッジ方程式手法のみ) わが国のGDPのナウキャスティングに関する検討 repositoryはこちら 前書き 混合データサンプリング法(以下、MIDAS(マイダス)と記す)の有効性を調査するため、MIDASとブリッジ方程式を使用した。 使用した指数は鉱工業指数(生産指数) 鉱工業総合(以下、iipと記す)とGDPの四半期速報値である。 なお、使用したデータは、e-statのデータを前処理を行なった上で使用した。 ブリッジ方程式 y_t = \alpha + \sum_{i=1}^{N} \beta_i x^Q_{i,t} + \varepsilon _t \\ x^Q_{i,t} = \frac{1}{3}(x^M_{i,3t} + 2 x^M_{i,3t-1} + 3 x^M_{i,3t-2} + 2 x^M_{i,3t-3} + x^M_{i,3t-4}) [1]より参照 # ブリッジ方程式モデル(単回帰分析) df4 = pd.merge(gdp, iip, left_index=True, right_index=True, how='outer') df5 = pd.DataFrame(columns=['BRIDGE']) x = np.array([]) flag = False for date, IIP_YOY in zip(df4.index, df4['IIP_YOY']): x = np.append(x, IIP_YOY) if flag == False: if date == '2013-07-01': flag = True if flag: x3t = x[-1] x3tm1 = x[-2] x3tm2 = x[-3] x3tm3 = x[-4] x3tm4 = x[-5] xt = (x3t + 2*x3tm1 + 3*x3tm2 + 2*x3tm3 + x3tm4)/3 record = pd.Series([xt], index=df5.columns, name=date) df5 = df5.append(record) df5.index.name = 'DATE' df6 = pd.merge(df4, df5, left_index=True, right_index=True, how='outer') df6 = df6.dropna() # 目的変数(Y)、説明変数(X) Y2 = df6['GDP_CYOY'] X2 = df6[['BRIDGE']] # 線形回帰をする model = linear_model.LinearRegression() model.fit(X2, Y2) # パラメータ算出 reg_a = model.coef_[0] reg_b = model.intercept_ df6['NOWCAST'] = df6.apply(lambda x: reg_b + reg_a*x['BRIDGE'], axis=1) MIDAS y_t = \alpha + \sum_{i=1}^{K} \sum_{j=0}^{l_i} \beta_{i,j} x^M_{i,3t - j} + \varepsilon _t # 日本の会計年度が4月始まりのため、4月を起点としている。 df['period'] = pd.to_datetime(df.index.to_series()).apply( lambda x: 3 if x.month in [1, 4, 7, 10] else (1 if x.month in [2, 5, 8, 11] else 2)) df = df[df.index != '2013-01-01'] df2 = pd.DataFrame(columns=[ 'GDP_CYOY', 'IIP_YOY_Q1', 'IIP_YOY_Q2', 'IIP_YOY_Q3']) for date, GDP_CYOY, IIP_YOY, period in zip(df.index, df.GDP_CYOY, df.IIP_YOY, df.period): if period == 1: q1 = IIP_YOY elif period == 2: q2 = IIP_YOY else: record = pd.Series([GDP_CYOY, q1, q2, IIP_YOY], index=df2.columns, name=date) df2 = df2.append(record) df2.index.name = 'DATE' # 目的変数(Y)、説明変数(X) Y = np.array(df2['GDP_CYOY']) X = np.array(df2[['IIP_YOY_Q1', 'IIP_YOY_Q2', 'IIP_YOY_Q3']]) # 予測モデルを作成 clf.fit(X, Y) # 偏回帰係数 ab = pd.DataFrame({"Name": ['IIP_YOY_Q1', 'IIP_YOY_Q2', 'IIP_YOY_Q3'], "Coefficients": clf.coef_}).sort_values(by='Coefficients') for index, row in ab.iterrows(): if row.Name == 'IIP_YOY_Q3': b3 = row.Coefficients elif row.Name == 'IIP_YOY_Q2': b2 = row.Coefficients else: b1 = row.Coefficients # 切片 print(clf.intercept_) a = clf.intercept_ df2['NOWCAST'] = df2.apply(lambda x: a + b1*x['IIP_YOY_Q1'] + b2*x['IIP_YOY_Q2'] + b3*x['IIP_YOY_Q3'], axis=1) 参考文献 [1] [2]
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

pytzを使うとdiscordのbotがオフラインになってしまった

・前書き プログラミング初心者の初記事になります。 環境はpython3.8.5 githubとHerokuを使ったbotです。 ・botがオフラインに 今回はDiscordの定期時間になるとメッセージを送信するbotを作っていた際に、datetimeを使うとロンドン標準時間になっていたので、"pytz"というライブラリを使って日本標準時間にしたのですが 「あれ、botが突然オフラインに...?」 ということがあったので書きました。 botはgithubとHerokuを使い動かしましたが、githubにpytzを使ったコードをコミットすると数分後、突然オフラインになってしまいました。 ・その後 解決策を見つけようとしましたが、時間がなかったので結局、pytzは使わずにbotが送信するメッセージを時差の分だけずらすことで無理やり解決させました。(他の技術を使って解決するほど経験がないもので) pytzの部分を消すとbotは無事再稼働。 なのでこのようなdatetimeを使ったbotを作る際、時差を日本時間に合わせるのにpytzはおすすめしません。 ・あとがき 駄文ですが呼んでくれてありがとうございました。 かなり用語を知らない初心者なので、間違えてる部分があればご指摘お願いします。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

画像認識で音楽ゲームのスコアを記録するシステムをつくる(AWS・Cloud Vsion API)

はじめに クラウドサービス(AWSとGCP)の学習をかねて、プロジェクトセカイカラフルステージの音楽ゲームの結果画面の画像から、画像認識を行なって結果を保存するシステムを作りました。また、以下の記事やサイトを参考にしました。 参考 https://dev.classmethod.jp/articles/ocr-with-lambda-using-cloud-vision-api/ https://docs.aws.amazon.com/cdk/latest/guide/hello_world.html https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-s3-tutorial.html#with-s3-tutorial-create-function-createfunction https://aws.amazon.com/jp/premiumsupport/knowledge-center/lambda-layer-simulated-docker/ システムの構成 このシステムは以下のような構成で作られています。 おそらく基本的なAWSのサーバレスの構成に近いのかなと思っています。S3に画像が上げられるとそれをフックにLambda起動し、CloudVisionAPIを通して画像認識を行い、それから得られた結果をS3とDynamoDBに保存するといった流れになっています。 また、AWSのリソースをいい感じに作ってくれるものはいくつかありますが、今回はAWSCDKを利用してみました。CDK自体は様々な言語で利用ができますが、今回はPythonでつくりました。 CloudFormationを直に書いて作るより、これぐらいシンプルな構成だとわかりやすく作れるのでいいのかなと思いました。できないこともあるのかもしれないですが、コードを書くようにリソースを定義できるので見やすかったり、エラーが事前に出てくれるのでわかりやすいのかなとも思います。 事前準備 AWSを使うためにIAMユーザーやCredentialなどの準備が必要です。また、画像認識のためにGCPも利用しているのでそこらへんの準備もします。お金は多分かからないですが、従量課金のサービスなので使いすぎるとかかります。 また、PythonのライブラリをLambdaでも使えるようにするためにDockerを利用しました。 CloudVisionAPIを使えるようにする CloudVisionAPIを有効化する。 サービスアカウントを作成する。 サービスアカウントのキーから鍵を追加、新しい鍵を作成でJSONのファイルをダウンロードする。 権限周りでも少し設定がいるのかもしれませんが、自分はこれで利用することができました。 AWSCDKのインストールと初期化 $ npm install -g aws-cdk # cdkインストール $ cdk bootstrap # デプロイ用のS3バケット作成 CDKでつくる 以下のようにするとCDKので作成するためのテンプレートが生成されます。また、このCDKで作られたアプリケーション専用のPython環境を使えるようにVirtualenvが用意されていますが、ここらへんは自分が使いやすい方法で大丈夫です。今回は、用意されたものを利用します。 $ mkdir score-record $ cd score-record $ cdk init app --language python # pythonでcdkを作る $ source .venv/bin/activate # このアプリケーション専用のPython環境を使う(好きな環境で) requirement.txtの変更とインストール requirement.txtを修正します。これらは、AWSのリソースを作成するのに必要なものです。また、一応Lambdaで利用するライブラリもインストールします。 requirements.txt aws-cdk.core aws-cdk.aws-s3 aws-cdk.aws-lambda aws-cdk.aws-dynamodb aws-cdk.aws-s3-notifications google-cloud-vision boto3 pillow pandas $ python -m pip install -r requirements.txt つくっていくよ フォルダ構成 score-record ├── function │ │── gcp.json │ └── index.py ├── layers │ └── requirements.txt ├── score_record │ └── score_record_stack.py ├── .venv │ └── .... │ ├── app.py ├── cdk.json └── requirements.txt AWSのリソース作成 score_record_stack.py from aws_cdk import ( core, aws_s3, aws_s3_notifications, aws_lambda, aws_dynamodb) class ScoreRecordStack(core.Stack): def __init__(self, scope: core.Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) # The code that defines your stack goes here # 画像を入れるところのバケット score_image_bucket = aws_s3.Bucket( self, "ScoreImageBucket", bucket_name="score-image-bucket", #ここの名前は他の人が使うと使えない removal_policy=core.RemovalPolicy.DESTROY) #アプリケーションを消すとバケットが消える # 記録を保存するためのバケット score_data_bucket = aws_s3.Bucket( self, "ScoreDataBucket", bucket_name="score-data-bucket", #ここの名前は他の人が使うと使えない removal_policy=core.RemovalPolicy.DESTROY) #アプリケーションを消すとバケットが消える # 記録を保存するためのDynamoDBテーブル score_data_table = aws_dynamodb.Table( self, "score_table", # テーブル名 partition_key=aws_dynamodb.Attribute( # Dynamodbテーブルpartition_keyの設定 name="id", type=aws_dynamodb.AttributeType.STRING ), removal_policy=core.RemovalPolicy.DESTROY) #アプリケーションを消すとテーブルが消える # Lambdaからライブラリを使うためのLayer score_lambda_layer = aws_lambda.LayerVersion( self, "ScoreLambdaLayer", code=aws_lambda.AssetCode("layers/"), compatible_runtimes=[aws_lambda.Runtime.PYTHON_3_8]) # Lambda関数 lambdaFn = aws_lambda.Function( self, "ScoreVisionFunction", code=aws_lambda.Code.from_asset("function/"), runtime=aws_lambda.Runtime.PYTHON_3_8, # python3.8で行う handler="index.handler", # 起動場所 function_name="score_vision_function", layers=[score_lambda_layer], # score_lambda_layerを利用する timeout=core.Duration.seconds(30)) # タイムアウト30秒に # 環境変数設定 lambdaFn.add_environment("GOOGLE_APPLICATION_CREDENTIALS", "gcp.json") lambdaFn.add_environment("SCORE_BUCKET_NAME", score_data_bucket.bucket_name) lambdaFn.add_environment("SCORE_TABLE_NAME", score_data_table.table_name) # 画像が入ったのをフックにLambdaを起動 notification = aws_s3_notifications.LambdaDestination(lambdaFn) score_image_bucket.add_event_notification(aws_s3.EventType.OBJECT_CREATED, notification) # 各S3とDynamoDBにアクセス権限をLambdaに与える score_image_bucket.grant_read_write(lambdaFn) score_data_bucket.grant_read_write(lambdaFn) score_data_table.grant_read_write_data(lambdaFn) LambdaLayerの作成 layers/requirements.txt google-cloud-vision Pillow pandas $ cd layers $ docker run --rm -v "$PWD":/var/task "public.ecr.aws/sam/build-python3.8" /bin/sh -c "pip install -r requirements.txt -t python/lib/python3.8/site-packages/; exit" このようにするとlayersのフォルダにLambdaで実行するようのライブラリをインストールすることができます。 score-record ├── function │ │── gcp.json │ └── index.py ├── layers │ │── requirements.txt │ └── python # ここから下が追加される │ └── lib │ └── python3.8 │ └── site-packages │ │── ライブラリ │ └── ライブラリ ├── score_record │ └── score_record_stack.py ├── .venv │ └── .... │ ├── app.py ├── cdk.json └── requirements.txt LambdaFunctionの作成 function/index.py import boto3 import uuid import os import pandas as pd import datetime import re from urllib.parse import unquote_plus from PIL import Image, ImageDraw from google.cloud import vision s3 = boto3.client('s3') dynamodb = boto3.resource('dynamodb') # 画像編集関連 def edit_image(image_path, edited_path): with Image.open(image_path) as image: img_width, img_height = image.size img = image.crop((0, 0, 1300, img_height)) draw = ImageDraw.Draw(img) draw.rectangle((0, 0, 170, 170), fill=(0, 0, 0)) draw.rectangle((0, 170, 1300, 550), fill=(0, 0, 0)) draw.rectangle((0, 820, 1300, 940), fill=(0, 0, 0)) draw.rectangle((0, 700, 500, 850), fill=(0, 0, 0)) draw.rectangle((0, 400, 80, 850), fill=(0, 0, 0)) draw.rectangle((880, 0, 1300, 850), fill=(0, 0, 0)) draw.rectangle((0, 820, 250, img_height), fill=(0, 0, 0)) draw.rectangle((0, 1260, img_width, img_height), fill=(0, 0, 0)) filter_img = img.convert('L') filter_img.save(edited_path) def handler(event, context): # 保存するデータのカラム columns = ["name", "difficulty","score", "combo", "perfect", "great", "good", "bad", "miss"] allSekaiScore_df = pd.DataFrame(columns=columns) for record in event['Records']: bucket = record['s3']['bucket']['name'] key = unquote_plus(record['s3']['object']['key']) print("start recognize" + key) tmpkey = key.replace('/', '') download_path = '/tmp/{}{}'.format(uuid.uuid4(), tmpkey) edited_path = '/tmp/edited-{}'.format(tmpkey) s3.download_file(bucket, key, download_path) # バケットから画像をダウンロード edit_image(download_path, edited_path) # 画像編集 with open(edited_path, "rb") as f: content = f.read() client = vision.ImageAnnotatorClient() image = vision.Image(content=content) print("start recognize" + key) # CloudVisionAPIで文字認識 response = client.document_text_detection( image=image, image_context={'language_hints': ['ja']} ) # 認識結果を表示 print(response.full_text_annotation.text) words = response.full_text_annotation.text.replace(" ", "").split("\n") print(len(words)) print(words) # ここらへんは画像処理によって変わる if len(words) == 16: name, difficulty, score, _, combo = words[:5] score = re.sub("\\D", "", score[:8]) # 数字以外を取り除く combo = re.sub("\\D", "", combo) # 数字以外を取り除く perfect, great, good, bad, miss = words[10:15] print("name: " + name) print("difficulty: " + difficulty) print("score: " + score) print("combo: " + combo) print("perfect: " + perfect) print("great: " + great) print("good: " + good) print("bad: " + bad) print("miss: " + miss) perfect, great, good, bad, miss = int(perfect), int(great), int(good), int(bad), int(miss) score, combo = int(score), int(combo) sekaiscore_df = pd.DataFrame([[name, difficulty, score, combo, perfect, great, good, bad, miss]], columns=columns) allSekaiScore_df = allSekaiScore_df.append(sekaiscore_df) # DynamoDBにデータを保存 TABLE_NAME = os.environ["SCORE_TABLE_NAME"] score_data_table = dynamodb.Table(TABLE_NAME) score_data_table.put_item( Item={ 'id': str(uuid.uuid4()), 'name': name, 'difficulty': difficulty, 'score': score, 'combo': combo, 'perfect': perfect, 'great': great, 'good': good, 'bad': bad, 'miss': miss } ) print("dynamodb put") # 画像を削除 s3.delete_object( Bucket=bucket, Key=key ) if response.error.message: raise Exception( '{}\nFor more info on error messages, check: ' 'https://cloud.google.com/apis/design/errors'.format( response.error.message)) allSekaiScore_df = allSekaiScore_df.reset_index() allSekaiScore_df = allSekaiScore_df[columns] dt = datetime.datetime.now() csv_key = "csv/{0:%Y-%m-%d-%H-%M-%S}.csv".format(dt) score_data_bucket = os.environ["SCORE_BUCKET_NAME"] # csvデータの保存 s3.put_object( Bucket=score_data_bucket, Body=allSekaiScore_df.to_csv(index=False).encode(), Key=csv_key, ) print("save csv") return allSekaiScore_df.to_csv(index=False).encode("utf-8") 画像編集関連 このまま画像認識を行うと曲や背景などによって結果が変わってしまうので、なるべく同じような形の結果になるように画像を編集します。 この編集ではiPadPro10.5インチで撮影したものを利用しています。他の端末や画像サイズが違う場合は変わるので気をつけてください。 元画像 編集後の画像 認識の結果 デプロイするよ $ cdk deploy 動作確認 S3バケットに画像をアップロードします。 無事に動作していればS3にはcsvファイルが、DynamoDBテーブルを見ると記録が保存されています。また、画像をアップロードしたバケットは空になっています。 おわりに 必要がなければ、以下のコマンドで今回作成した環境を消しましょう。 cdk destroy
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

引っ張りを可視化してみた

はじめに 引張試験で、ヤング率とかポアソン比が変わるとどう変化するのか、pythonを使って近いものを作れないかと思ったのがきっかけ。 計算式は下記のURLを参考にした。 https://www.jsme.or.jp/kaisi/1202-36/ 環境 Windows10 Python 3.8.5 コード import numpy as np import matplotlib.pyplot as plt import matplotlib.patches as pat #四角の描画に使う import cv2 %matplotlib inline #初期座標 x1=0 x2=3 y1=0 y2=3 #各種パラメータ power=10 #外力 area=9 #断面積 stress=power/area #応力 young=0.8 #ヤング率 x_strain=stress/young #x方向のひずみ x_strain=stress/young delta_x=x_strain*x2 #元の長さからどれぐらい伸びたか x3=delta_x+x2 #伸ばした時のx座標 poisson=0.458 #ポアソン比 y_strain=-poisson*x_strain #y方向のひずみ(定義式では負になるので、絶対値にしている) y3=y2+y2*y_strain #伸ばした時のy座標 #描画(試しに最初と最後の画像を作成) fig=plt.figure(figsize=(10,10)) ax1=fig.add_subplot(2,2,1) plt.xlim(0,10) plt.ylim(0,5) plt.title('Before') ax2=fig.add_subplot(2,2,2) plt.xlim(0,10) plt.ylim(0,5) plt.title('After') p1=pat.Polygon(xy=[(x1,y1),(x2,y1),(x2,y2),(x1,y2)],color='peru') #座標から四角形を描写する p2=pat.Polygon(xy=[(x1,y1),(x3,y1),(x3,y3),(x1,y3)],color='peru') ax1.add_patch(p1) #貼り付ける ax2.add_patch(p2) 左側が伸ばす前、右側が伸ばした結果。 ヤング率を10にしてみると、伸びが悪くなることが分かる。 最後に 実際に実験しなくても、なんとなくのイメージが持てた。可視化はやっぱりいい(こんなことしなくてもわかる人が多いだけかもしれない)。 単位はきちんとしているわけではないので、参考程度(あまりにも大きい数字を入れたりすると範囲を超えてしまうので注意)。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PythonでSymbolブロックチェーンの送金プログラムを書いてみる。

ブロックチェーンSymbol from nemのパブリックチェーンからはやくも一か月以上が経ちました。 Python版sdkがリリースされたということで、さっそく試してみます。 今回使用するライブラリはこちらです(Python3.7以上)。 まずインストールします。 pip install symbol-sdk-core-python KeyPair生成 from binascii import unhexlify from symbolchain.core.CryptoTypes import PrivateKey from symbolchain.core.sym.KeyPair import KeyPair b = unhexlify("896E43895B908AF5847ECCB2645543751D94BD87E71058B003417FED5123****") prikey = PrivateKey(b) keypair = KeyPair(prikey) 秘密鍵をバイナリ変換してPrivateKeyクラスを生成し、Keypairを作成します。 PublicKey生成 pubkey = keypair.public_key print(str(keypair.public_key)) keypairクラスから公開鍵を導出します。 Symbolのファサード生成 from symbolchain.core.facade.SymFacade import SymFacade facade = SymFacade('public_test') Symbolのパラメータがセットされたファサードクラスを生成します。NIS1版のファサードもあるようです。 アドレス生成 address = facade.network.public_key_to_address(pubkey) print(str(address)) Symbolファサードを利用して公開鍵からアドレスを導出します。 トランザクションの有効期限を設定 import datetime deadline = (int((datetime.datetime.today() + datetime.timedelta(hours=2)).timestamp()) - 1616694977) * 1000 1616694977 というのはSymbolが誕生したUTC秒になります。この時刻を基準にネットワーク内部で時刻が同期されています。2時間後を有効期限とします。 トランザクション作成 tx = facade.transaction_factory.create({ 'type': 'transfer', 'signer_public_key': pubkey, 'fee': 100000, 'deadline': deadline, 'recipient_address': address, 'mosaics': [(0x091F837E059AE13C, 1000000)], 'message': bytes(1) + "test".encode('utf8') }) 0x091F837E059AE13C がXYMのモザイクIDになります。 送金量は可分性が6なので 1000000倍した数値を指定します。今回は1XYMを送金します。 署名 signature = facade.sign_transaction(keypair, tx) tx.signature = signature.bytes 署名して、トランザクションに含めます。 JSON化 from binascii import hexlify payload = {"payload": hexlify(tx.serialize()).decode('utf8').upper()} import json json = json.dumps(payload) 署名をjson化します。 アナウンス headers = {'Content-type': 'application/json'} import http.client conn = http.client.HTTPConnection("sym-test-01.opening-line.jp",3000) conn.request("PUT", "/transactions", json,headers) response = conn.getresponse() print(response.status, response.reason) テストネットにアナウンスして結果を受け取ります。 確認 hash = facade.hash_transaction(tx) print('https://sym-test-01.opening-line.jp:3001/transactionStatus/' + str(hash)) ハッシュ値を取得して状態を確認します。 Successになればエクスプローラーで確認してみましょう。 これでPythonを使ってSymbolブロックチェーンで送金することができました。 今回pythonで対話式に解説しましたが、実はJavaScriptを使ってブラウザのコンソールでも同じように送金を体験することができます。 ブロックチェーンSymbolにとって送金はまだほんの序の口です。ぜひいろいろな機能にチャレンジしてみてください。 最後に、全スクリプトを載せておきます。 from binascii import unhexlify from symbolchain.core.CryptoTypes import PrivateKey from symbolchain.core.sym.KeyPair import KeyPair from symbolchain.core.facade.SymFacade import SymFacade import datetime from binascii import hexlify import json import http.client facade = SymFacade('public_test') b = unhexlify("896E43895B908AF5847ECCB2645543751D94BD87E71058B003417FED5123****") prikey = PrivateKey(b) keypair = KeyPair(prikey) pubkey = keypair.public_key address = facade.network.public_key_to_address(pubkey) deadline = (int((datetime.datetime.today() + datetime.timedelta(hours=2)).timestamp()) - 1616694977) * 1000 tx = facade.transaction_factory.create({ 'type': 'transfer', 'signer_public_key': pubkey, 'fee': 100000, 'deadline': deadline, 'recipient_address': address, 'mosaics': [(0x091F837E059AE13C, 1000000)], 'message': bytes(1) + "test".encode('utf8') }) signature = facade.sign_transaction(keypair, tx) tx.signature = signature.bytes payload = {"payload": hexlify(tx.serialize()).decode('utf8').upper()} json = json.dumps(payload) headers = {'Content-type': 'application/json'} conn = http.client.HTTPConnection("sym-test-01.opening-line.jp",3000) conn.request("PUT", "/transactions", json,headers) response = conn.getresponse() print(response.status, response.reason) hash = facade.hash_transaction(tx) print('https://sym-test-01.opening-line.jp:3001/transactionStatus/' + str(hash))
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

electronでpython ファイルを使用する際の覚書

概要 electronはHTML, CSS, Javascriptを使って簡単にWindows, mac, linux のマルチプラットフォームにアプリを作成できるフレームワークです。 今回electronとpythonコードを連携させる際のファイル構造に関しての覚書です。 electronにおけるFrontend,Backend間の情報のやり取りの変遷 https://qiita.com/pochman/items/64b34e9827866664d436 こちらの記事に詳しく書かれていますが、electronはこれまでversionが上がるたびにSecurityの観点からipc通信の仕様を変更しています。これから先も変更になる可能性はありますが、2021年4月の時点の情報です。 全体の構成図 main.js設定 const electron = require('electron'); const app = electron.app; const path = require("path"); const BrowserWindow = electron.BrowserWindow; const ipcMain = electron.ipcMain; const ipcRenderer = electron.ipcRenderer; //ここでpyhonshell library を呼び出す const {PythonShell} = require("python-shell"); let mainWindow; function createWindow() { // メインウィンドウを作成します mainWindow = new BrowserWindow({ width:1100, height: 1000, webPreferences: { nodeIntegration: false, contextIsolation: true, preload: path.join(__dirname, 'preload.js') }, }); // メインウィンドウに表示するURLを指定します // (今回はmain.jsと同じディレクトリのindex.html) mainWindow.loadFile('index.html'); // デベロッパーツールの起動 mainWindow.webContents.openDevTools(); // メインウィンドウが閉じられたときの処理 mainWindow.on('closed', () => { mainWindow = null; }); } // 初期化が完了した時の処理 app.on('ready', createWindow); // 全てのウィンドウが閉じたときの処理 app.on('window-all-closed', () => { // macOSのとき以外はアプリケーションを終了させます if (process.platform !== 'darwin') { app.quit(); } }); // アプリケーションがアクティブになった時の処理(Macだと、Dockがクリックされた時) app.on('activate', () => { // メインウィンドウが消えている場合は再度メインウィンドウを作成する if (mainWindow === null) { createWindow(); } }); //ここでpreload.jsからのipc通信を受け取り、python-shellを起動 //pythonで書かれたコードを呼び出す ipcMain.handle('hoge',async (event, data) => {  //pythonに渡す何らかのパラメーター var options = { data:data } //ここでパラメーターと共に渡す let pyshell =await new PythonShell('hogehoge.py', options);  //pythonでのコード処理が終わったらpythonからexportされたメッセージを受け取る //preload.jsにpythonから吐き出されたデータを送る pyshell.on('message', async function(message) { event.sender.send("return_data", message) }) }) preload.js const { contextBridge, ipcRenderer} = require("electron") //main.jsに書かれた"hoge" handlerを起動している contextBridge.exposeInMainWorld('api', { send: async (data) => await ipcRenderer.invoke('hoge', data), on: (channel, func) => { ipcRenderer.on(channel, (event, data) => func(data)); } } ); index.html <script> //ここでpreload.jsで作成されたapiを呼び出して何らかのデータを渡す const message= window.api.send({"send_data":send_data}) const message2=window.api.on("return_data", async (data)=>{ //returnされたデータを使った処理をこちらに書く }) </script> 最後に electronを使用してpythonコードをつかったアプリを作る必要があったため、自分用としてまとめておきました。非常にざっくりとした記事ですが、どなたかのお役に立てれば幸いです。 もし不備などありましたらお知らせいただけると幸いです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

初めてのQiita

はじめに こんにちは! Python初学者です。 現在pythonを勉強中なのですが、言語を勉強していく中で、QiitaやGitを使ってアウトプットをしていきたいと思います。 今日の学び 中途半端ですが今日の学びを書いていきたいと思います。 -GitHubの操作(ターミナルを使う) 1. ブラウザでリポジトリを作る 2. ターミナル上でgit clone urlを入力 3. cd ファイル名でカレントディレクトリに移動しておく 4. touch ファイル名で新規のファイルを作る 5. 新規のファイルをエディタで開き、適当なコードを入力する 6. git add 新規のファイル名でインデックスに追加 (インデックスとは新たに書いた内容や追加変更した内容を一時的に保存する場所と理解している) 7. git commit -m "追加変更した内容を書く" (この段階でインデックスに追加し内容をローカルリポジトリに保存すると理解している) 8. git push -u origin master (8の作業でマスターリポジトリに内容を反映させる) 現在はこの方法でGithubの操作を理解しています マークダウンの練習 この投稿も含めて簡単なマークダウンの練習をしています コード Python class Human: def __init__(self, name, age): self.name = name self.age = age def say_name(self, name, age): print('{} {}'.format(name, age)) human = Human('山本', 30) human.say_name('山田', 22) 結果 Pyton(2) 山田 22 (say_name関数を呼び出した結果{}の中に 山田と22 が入る) 上記はコードを挿入する練習ですので中身は特に意味はありません 感想 Qiitaに投稿する、GitHubをターミナルで操作する,マークダウン記法で記述する ということを今までは知識で知ってはいましたが、今までは少しアレルギー反応を示していました。 ですが、実際にやってみると思ったよりは難しくなかったので、少しずつできることを増やしていきたいと思えました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Pyinstaller でsklearnモジュールが入ると動作しない(exeファイルが起動しない問題)

<要約> scikit-learn==0.24.1 python 3.8.9 の環境下で作成したプログラムを pyinstaller==4.3 でEXE化しようとしました。 exeは出来るのですが、プログラムが起動しないという状況にありました。 状況確認の結果2点問題がありました 1)exe化時にPower shellで warningでsklearn.neighbors.typedefs が not found  と出力されていました。 2) power shell でexeファイルを起動すると、 ModuleNotFoundError: No module named 'sklearn.utils._weight_vector' と出力されていました。 改善は下記2点を実行して解決しました。その結果 exeファイルは予定通り起動しました。 1)の問題は Lib\site-packages_pyinstaller_hooks_contrib\hooks\stdhooks\hook-sklearn.metrics.cluster.py を訂正する事で改善しました。 こちらは、リンクを参照ください。 https://qiita.com/niwataka/items/7712c38d287b50479cd4 2)の問題はpyinstaller 時に pyinstaller ****.py --hidden-import=sklearn.utils._weight_vector とhidden importで事前にimportする事で解決しました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

VTuberの配信内チャットでのトレンドワードを見れるサイトを作ってみた

はじめに 先日、VTuber Chat TrendsというWebアプリケーションをリリースしました。こちらは、VTuberの皆さんの、過去のYouTube Live内チャットで発言された内容をもとに、どのようなキーワードが頻出したかをトレンド情報として閲覧できるものとなっています。良かったらご利用ください。 VTuber Chat Trends を公開しました!VTuberのライブ配信内チャットで話題になったワードを解析し、公開していますhttps://t.co/sBt5hDUdMj(現在対応しているVTuberは #にじさんじ #ホロライブ #のりプロ など)#VTuber #VTuberChatTrends— フォースアップ (@4thapp) April 25, 2021 本記事では、中でどんなことをやっているのかを簡単にまとめます。(途中、自然言語処理や、Webアプリケーションに関する用語が出てきます。各用語についての説明は割愛いたしますのでご了承ください)。 開発期間 着想~アルファ版作成: 約2週間 いろいろ細かいところの追加・修正: 約2週間 アーキテクチャ 大きく分けて 解析サーバ、APIサーバ、ユーザクライアントの3部分に分かれています。 インフラは基本的に Microsoft Azure を使用していますが、一部 Google Cloud Platform の仮想マシンを使用しています。 上図の矢印は、データの流れを示しています。大まかには、解析サーバ ⇒ APIサーバ ⇒ ユーザクライアント の方向へデータが流れています。 解析サーバ おもに、チャットデータの解析を担当しています。やっていることは以下のとおり。 (1) 配信・チャンネル情報の取得、データベース更新 (2) チャットデータの取得、解析、トレンド情報の作成 Python3で実装し、GCPのCompute Engine(仮想マシン)で動作させています。徹底的にコストを抑えるために、スペックはf1-microとしています。(本来であれば、すべてAzureに揃えたかったし、仮想マシンよりコンテナとかで運用したかった。) (1) 配信・チャンネル情報の取得、データベース更新 残念ながら、この世の全VTuberの配信を解析することは、我々の経済的に無理であるため、あらかじめ解析の対象とする配信者をマスタデータとして保持しておき、定期的にチャンネル情報・配信情報を取得しています。(2021/4/25現在、約160名の方に対応しています)。取得したデータはAzure Table Storageへ格納します。Table Storageは、NoSQLデータベースであるCosmosDBと同じようなサービスですが、「できるだけコストを抑えたい」「高いSLAは求めていない」といった点から、Table Storageをデータベースとして利用しています。 また、新しい配信が行われた場合は、(2)の解析が必要ですが、仮想マシンリソースの関係上、一度に複数の配信の解析ができないため、Azure Queue Storageを使用して、解析リクエストの順番待ちをさせています。 (2) チャットデータの取得、解析、トレンド情報の作成 VTuber Chat Trendsの要となる部分です。 なにをもってトレンドワードとするか 基本的には、配信内の単位時間当たりの出現頻度が多いワードをトレンドワードとしました。1回の配信を100区間に分割し、区間ごとに頻度集計しています。よって、配信全体での出現頻度は低くても、瞬間的に頻出した場合は上位のトレンドとなるようにしています。 上図の場合、「うまぴょい」のほうが「草」よりも上位となります。 ワードの単位をどうするか 本記事ではさきほどからワードという言葉を使っていますが、今回は、基本的に形態素解析の結果のみを使用し、形態素の単位をワードの単位としました。 しかし、より自然にトレンドワードを抜き出すのであれば、形態素解析の結果をもとにN-gramをとったり、構文解析等をして、基本句を単位としたほうがいいのかなぁと考えています。一応試してみたりもしたのですが、ここでも仮想マシンのリソースの関係上、メモリ不足に陥ってしまったため、今回は断念しました。ここらへんは、今後スペック問題が解決できそうなら、改善したいです。もうちょっとちゃんと自然言語処理させたい。 形態素解析について 形態素解析器には、Sudachiを採用しました。新語の観点から、MeCab+NEologdとも迷いましたが、YouTubeチャットを解析させると、NEologdでは不自然な形態素の区切りが目立ったため、Sudachiを採用しました。 多くのVTuberの配信チャット内では、特有の挨拶などの未知語が数多く出現し、そのままだと形態素解析に支障が出るため、Sudachi用のユーザ辞書を作成しました。現状は完全手動で作成しています。 ユーザ辞書の例.csv こんにちワニノコ,5687,5687,-32768,こんにちワニノコ,感動詞,一般,*,*,*,*,コンニチワニノコ,こんにちワニノコ,*,*,*,*,* こんばんワニノコ,5687,5687,-32768,こんばんワニノコ,感動詞,一般,*,*,*,*,コンバンワニノコ,こんばんワニノコ,*,*,*,*,* おつみと,5687,5687,-32768,おつみと,感動詞,一般,*,*,*,*,オツミト,おつみと,*,*,*,*,* おつみとー,5687,5687,-32768,おつみとー,感動詞,一般,*,*,*,*,オツミトー,おつみと,*,*,*,*,* わたくせ,5146,5146,-32768,わたくせ,名詞,普通名詞,一般,*,*,*,ワタクセ,わたくせ,*,*,*,*,* なお、形態素解析をする前に、以下の前処理を行っています。 一部の配信者は、文字として使用することを意図したカスタム絵文字を設定しているため、それら絵文字を文字列データに変換 長音として使われやすい文字(~など)をーに正規化 形態素解析後は、以下の後処理を行っています。 数詞 + 接尾辞は、1ワードにまとめる 一定数量までの名詞連続は、1ワードにまとめる トレンド情報生成 形態素解析の結果をもとに、先述の「なにをもってトレンドワードとするか」に従って頻度解析し、結果を、Azure Blob Storageへ格納しています。 APIサーバ ユーザクライアントからのWebAPIリクエスト処理や、定期ツイート処理を担当しています。やっていることは以下のとおり。 (1) 解析結果を配信するWebAPI (2) 解析結果の定期ツイート メインは、Azure Functionsを使って実装しました。ランタイムはNode.js、コードの記述にはTypeScriptを使用しました。 (1) 解析結果を配信するWebAPI HTTPリクエストをトリガーとして、Blob StorageやTable Storageから、各種情報を取得し、レスポンスする、きわめてシンプルな関数です。 Azure Functionsには、トリガーとは別にバインドという概念があり、コード内で各種Storageのクライアントライブラリをインポートしなくてもデータを取得できるため、できるだけシンプルなコードとするために、バインドを活用するようにしました。しかし、やりたいことによっては、バインドだと実現不可能な場合がある(例:Table Storage出力バインディングは、既存エンティティの書き換えには対応していない)ため、結局、クライアントライブラリも混在する形となりました。 WebAPIの利用にあっては、ユーザクライアント⇔Azure Functions間で直接やり取りする構造にはせず、あいだにAzure CDNをかませ、一定時間はキャッシュさせるようにしました。 (2) 解析結果の定期ツイート Azure FunctionsのTimerトリガーを使って、最近の配信を解析結果を定期的にツイートさせるようにしました。おそらく、Twitter APIを使ってツイートするのが一般的ですが、とりあえずお手軽に動作させたかったため、Azure Logic Appsを併用して、ツイート処理ができるようにしました。Twitter APIへの申請は不要となりますが、投稿クライアント名が「Microsoft Azure Logic Apps」になるので少しダサい。 いずれは、きちんとTwitter API申請したいです。 なお、リリース直後、この定期ツイート処理をまわしていると、あるタイミングから以下のようなエラーがTwitterから返ってくるようになり、ツイートできなくなってしまいました。 { "status": 403, "message": "This request looks like it might be automated. To protect our users from spam and other malicious activity, we can't complete this action right now. Please try again later.\r\nclientRequestId: hogehoge\r\nserviceRequestId: hogehoge", "error": { "message": "This request looks like it might be automated. To protect our users from spam and other malicious activity, we can't complete this action right now. Please try again later." }, "source": "twitter-je.azconn-je.p.azurewebsites.net" } Webブラウザからも、ツイート、フォロー、リツイートなどをしようとすると「このリクエストはコンピュータによる自動的なものと判断されました」というエラーが表示され、スパムとして扱われロックされてしまっていることが分かりました。最初のエラーから24時間経過後も、状況が変わらなかったため、Twitterの異議申し立てフォームから、問い合わせを行いました。(問い合わせ後、自動メールに対する返信も実施)。幸い、問い合わせから約36時間後に、以下のようなメールが来て、ロックも解除していただけました。 ご利用のアカウントのロックが解除されました。ご不便をおかけして申し訳ありませんでした。 手短に状況を説明いたしますと、Twitterでは、スパムを自動生成するTwitterアカウントを検出して削除するシステムを採用しています。今回、システムがこちらのアカウントをスパムアカウントと誤認識した可能性があります。このような誤認識は、Twitterルールに違反する自動化の挙動の見られるアカウントに対して起こることがあります。 誤認識をお詫びいたしますとともに、またのTwitterのご利用をお待ちしております。 ユーザクライアント Webのフロントエンドです。フレームワークにはNuxt.js、Vuetifyを使用し、SSRやSPAではなくSSG(Static Site Generation; 静的サイト生成)の方式でビルドしています。 基本的に中でやっていることは、APIリクエストして、返ってきたデータを加工・表示しているだけです。 ホスティング SSGですので、静的ホスティングサービスを利用すればリリースできます。NetlifyやHerokuあたりが有名でしょうか。今回は、なるべくリソースをAzureに統一させたかったということもあり、Azure Static Web Appsを利用しました。まだプレビュー版ですので、本番運用には向かないのですが、プレビュー版の間は無料で利用できるため、お世話になろうと思いました。 現状、Static Appsは、GitHub Actions等のCI/CDでのデプロイにしか対応していませんので、VTuber Chat Trendsもユーザクライアント部分についてはデプロイを自動化させました。 トレンド情報の表示 各配信のページには、トレンドワードを上位から順に表示させています。(順位については、「なにをもってトレンドワードとするか」のセクションで述べたとおりです)。 各ワードには、どのような言い回しをされたかの情報や、配信内のどのタイミングで頻出したかのグラフを出しています。 グラフ表示には、Google Chartsを使用しました。最初はChart.jsを採用しようとしたのですが、グラフ内をクリックした際の制御がどうしても上手くいかず、乗り換えました。個人的に、描画されるグラフの見た目はChart.jsのほうがきれいだったのですが。。。 i18n対応 せっかくなのでnuxt/i18nライブラリを使ってi18nに対応させ、日本語だけでなく英語でも利用できるようにしています。(といっても、トレンドワードは日本語のままです)。使い方や利用規約のページは未対応ですが、基本的なUI部分は英語でも表示可能です。翻訳が非常に怪しいため、誤り等ありましたら教えていただけますと幸いです。 ページ右下から切り替え可能です。 PWA対応 Nuxt.jsの魅力の1つに、簡単にPWA(Progressive Web Apps)に対応できる点が挙がると思っています。VTuber Chat Trendsも、より利用者に気軽に使っていただけるよう、PWAに対応させています。スマホブラウザからサイトを表示した際に、「インストールはいかが?」といった旨のメッセージが表示されます。インストールすると、今後はブラウザでなくても、ホーム画面からサイトを表示できます。 まとめ VTuberの配信内チャットのトレンドワードを解析し、閲覧できるサイトを作成しました。現状は、形態素解析した結果のヒストグラムをとって並び替えてトレンド情報として格納し、ユーザはブラウザから閲覧する、というシンプルな構造になっています。前半の解析処理については、まだまだ改善すべきと思っておりますが、維持費とご相談という状態です。 なお、お気づきの方もいらっしゃるとは思いますが、今回作成したものは、別にVTuberに特化させる必要はなく、YouTube Live上の配信であれば汎用的に対応できます。しかし、VTuberというドメインに限定させた理由は以下のとおりです。 単純に、VTuberの配信チャットを解析してみたかった 汎用的に対応できるほどのサーバスペックが無い メンテナンス量をできるだけ減らしたい(先述のユーザ辞書作成の部分など) 以上、ご覧いただきありがとうございました。 VTuber Chat Trendsは下記よりご利用ください。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む