うまい寿司が食いたい。

うまい寿司が遠慮なく食べれるようになるまで,進捗とか垂れ流すブログ

子連れ万博について

前の万博の記事を書いたところ

とフィードバックをいただいたので、子連れで万博を楽しむためのTipsを記載しておきます。

前提として午睡が必要な未就学児を連れていくケースについて記載します。

  • 事前準備

    • 地図
      • 必ず持っていきましょう。初回は迷います。
    • スタンプ帳
    • お土産
      • 公式ショップが都市部(梅田、なんば、天王寺)にはあります。せっかく行ったのにお土産ショップで時間を使うのは勿体無いので時間があるタイミングで買っておきましょう。
    • 暑さ対策グッズ。
      • 日陰は大屋根リングだけだと思っておいてください。海風はありますが、暑いです。
    • 日程を決める
      • 平日or休日
        • パビリオンを複数入りたいのであれば比較的空いている平日の火曜日を勧めています。参考:EXPO2025 大阪・関西万博 来場者数カウンター
        • 休日であれば、土曜日より日曜日が空いています。
        • 月曜日と金曜日は、前後に休みがあるので合わせて来場する人が多くそこまで減りませんので、せっかく休日を避けたのに〜にならないようにしてください。。
      • イベント
      • 入場ゲート
        • 朝イチは混んでいます。遠方から来る場合には予約の時間を9時にしたいと思いますが、この時間に来ると混んでます。大体入るまで30分は待ちますし、待ち時間の太陽光も厳しいです。暑さ対策をしっかりしましょう。
        • 9時に万博に入りたいなら8時ごろに会場にいる必要があります。空いている朝イチパビリオンに入りたい場合のみ行ってください。
      • どっちのゲートがいいか?→交通手段とスムーズに入りたいかで決めてください。
        • 西ゲート
          • 梅田や天王寺からバスで行くならこちらになります。
          • 11時ごろに行くと待ち時間なしで入れると思います。
        • 東ゲート
          • 電車で行くならこちらです。
          • 13時ごろに行くと待ち時間なしで入れると思います。
    • 1週間前予約
      • 1週間前予約を持っておくと子供が楽しめる(涼める)場所が一個確保できるのでできれば取りたいです。
      • ただ、当たらないパビリオンもあります。例えば住友館です。ここは見た感じ面白そうですが1週間前予約で一回も当たったことがありません。こういったパビリオンは避けましょう。他のパビリオンも外れやすいかどうかはxなどで一回調べておきます。
    • (オプション)椅子
      • 並ぶパビリオンで待つのであれば
  • 入場まで

    • 待ち時間
      • 早めに行く場合には待ちます。入場ゲートで水などの検査があります。スムーズに検査してくれますが、待つのは待ちます。
    • ベビーカー
      • 午睡が必要なら持っていきましょう。昼頃にベビーカーで寝てもらいます。
      • 東ゲートの場合、駅から会場に出るには、2回(地下鉄→ホーム、地下→地上)エレベータに乗る必要があります。
      • エレベータは待ち時間が長いので、折りたためるベビーカーを持って子供を抱っこしてエスカレーターで上がるとスムーズです。
    • 昼頃から入る場合には、コンビニなんかで買った昼ごはんを入場待ち列で食べたりしています。
  • 入場後

    • 大屋根リングやみゃくみゃくと写真を撮りましょう。これらと建築物を見に来たつもりでチケットを買うのがいいと思います。
      • 大屋根リングはスケール感に圧倒されます。子供と一緒に写真を撮りましょう。
      • 大屋根リング、一周二キロあります。上を歩けますが一周歩くのは疲れるのでおすすめしません。
    • 当日予約
      • 入場10分後から可能になります。
      • 9時入場なら割とどこでも取れます。
      • 仮に11時とかの午前中遅めの時間にはいっても当日開放枠があります。https://syunjin.hatenablog.com/entry/2025/07/18/102044
      • 子供が好きそうな、電力館ガンダム、ヘルスケアなどを取りましょう。その時間帯付近で携帯をじっと見ておけば取れます。
      • 予約機は避けましょう。行っていいことないです。携帯で十分です。
      • 当日予約のパビリオンに入れば、次の当日予約を取ることができます。9時に入るなら、可能なら午前中の当日予約を取ってしまって、午後の当日開放でもう一枠取れる、なんてこともできます。
        • 一瞬で他の人が予約を取ってしまうので、あったら取ってください。
    • パビリオン
      • 子供が楽しめるパビリオンの情報はたくさん落ちてますので、それを参考に行くところを決めましょう。
      • 参考:
      • ベビーカーがあると優先で入れるところもあるのであらかじめ情報を取得しておきましょう。
      • ベビーカー優先は以前と変わっていたりするので、必ず最新情報を取得しましょう。
      • コモンズでスタンプラリーを集めるのが楽しいので、暑くなったらコモンズで休みながらスタンプを集めるのがおすすめです。
      • せっかくの機会なので子供に海外の人と話させるといいと思います。
      • 近くのパビリオンが長時間並びそうかどうかは調べるとすぐわかります。このパビリオンはX分ごとに何人入るみたいなつぶやきは見つかります。自分は待ち時間が長そうなパビリオンは全て避けます。
    • 子供が楽しめるおすすめスポット
    • コモンズ(上述)
    • いのちパークの中心のミスト(フォーカスオンEXPO:暑さ和らげる万博会場のミスト 安全面に不安の声も | 毎日新聞)
    • 遊具
      • パビリオンに入れなくても遊べる遊具があります。楽しいです。
      • enjoy-expo2025.com
    • 移動
      • 炎天下で歩くと大変なので、西から東に移動するならeMover(https://www.osakametro.co.jp/expo2025_emover/#how-to-ride)を活用してください。下手に中を歩くと迷って元気を持っていかれます。お金をかけて元気を買ってください。大屋根リングの下をバスが通るので子供のテンションは上がります。
  • トイレ

    • 困ったら大屋根リング沿いに歩けば見つかります。大屋根リングの中と外は知ってたらすぐ見当たりますが、怪しければとりあえず大屋根リングを歩いてください。割とすぐに見つかります。
  • 食事

  • 海外のパビリオンっぽいもので、待ち時間少なくテイクアウトできたのは以下でした。
  • 特にコロンビアはコーヒーの列と食べ物の列が分かれていて、コーヒーに並んでる人が多く穴場だと思います。時間帯さえ気をつければすぐにテイクアウトできます。
  • 座って食べたいなら、西ゲートの奥の「風の広場マーケットプレイス」付近が比較的空いている印象がありました。

  • 水分

    • 給水所もありますが、結構待つので横の自販機で買うほうが早いです。熱中症になりそうならすぐ買ってください。

それでは楽しんでください!

大阪・関西万博の注意点など

事前準備

  • 熱中症対策セット(一番大事)
    • 水は中でも無料のものがあるが並んでいるので、自販機から買えばいい
    • 日陰は大屋根リングだけだと思っているといいので、日傘や帽子は必須
  • モバイルバッテリー
  • 当日予約とかスマホで遊ぶ展示もある。
  • 回り方によってはめっちゃ充電を消費する
  • 地図:目的に応じて
  • 遠方から来た人は、大きな荷物をどこかに預けてください。
  • 現金は使えないのでキャッシュレス決済の準備
  • お土産は外でも売ってるものも多いので、そこに並ぶなら事前/事後に梅田やなんば、天王寺などで買っておく。

基本情報

  • 場所は夢洲(ゆめしま)
  • 行き方は、地下鉄/バスor船
  • 地下鉄側のゲート(東ゲート)が混みがち。スムーズに入りたいなら、西ゲートがおすすめ
  • テーマは「いのち輝く未来社会のデザイン」
  • デザインなので、独特なデザインが多め。建築物の勉強していくと面白い。例えば大屋根リングは建造している会社が3社あってそれぞれ構造が違う、とか
  • みゃくみゃく/こみゃくが至る所にいるので、楽しむ
  • USJ/TDLのようなアトラクションというよりかはでっかい博物館みたいな感じ

入場:西ゲートは行ったことがないので、東ゲートのみ

入場後

  • 困ったら大屋根リングに出る。
  • 早い時間と夕方は空いててパビリオンに入りやすい
    • 当日予約も朝だと取りやすい。
  • 12時~17時は人が多すぎて待ち時間が多め。
    • 待ち時間の多さは万博GOなんかで確認できます。expo2025.fun
  • 会場の地図見たらまっすぐ歩けるように見えるけど、意外とまっすぐ行けないので大屋根リングに出る
  • トイレも大屋根リングにでて歩いたら見つけ易い。
  • 当日予約をとりましょう 入場後しばらくすると予約が取れるようになります。全部xでも開放時間が決まっている場合があります。ガンダムとか取ってください。 参考
  • そこかしこで何かやってますいるだけで面白いです。
  • おそらく想像より広いので、楽しみましょう。

海外パビリオンについて

  • 大屋根リングの内側に大体あります。
  • 人数を区切って動画を流すパビリオンの場合、人の回転が悪いので待ち時間が長くなる傾向があります。動画みたいなのがない場合、思ったより早く進んだりします。スペインとかそうです。
  • 人数を区切る動画がある: アメリカ、ルクセンブルク、クェート、ウズベキスタンなど
  • 人数を区切る動画がない:フランス、中国、スペイン、インド、トルコなど
  • 混雑度合いとかはtwitterで調べるとすぐ出てくるので参考にしてください。
  • コモンズという複数の国が合同で展示しているところがあります。トイレもあって、空調も効いていてすぐ入れるのでおすすめです。
  • おすすめ、と言われると人によって感じ方が変わるので難しいのですが、私が好きなのはスペイン。そんなに待たなくてよくて、中も面白い。
  • 予約必須のところもあります。

国内パビリオンについて

  • 予約を取らないと概ね行けません。
  • 事前予約を取るのは至難の技なのですが、当日開放枠で取れる場合があります。ヘルスケアパビリオン、ガンダムパビリオンが一際面白いと言われています。
  • 子供向けが多い気がしますが、未来の都市なんかは有名な企業が多くて未来感を感じられます。

シグネチャーパビリオンについて

以下より引用 シグネチャーパビリオン - 2025年日本国際博覧会(大阪・関西万博)協賛│TOPPAN

いのち輝く未来社会のデザイン」を実現するための「シグネチャープロジェクト」として、8つのテーマ事業が設定されました。 「シグネチャーパビリオン」は、万博会場の中心に位置し、各界で活躍する8人のプロデューサーがテーマごとにそれぞれ展開する「シグネチャープロジェクト」の起点となる展示パビリオンです。

  • 有名なデザイナーが作ったパビリオン。それぞれなかなか味があって面白い。
  • SNSはNull2が話題だけど、いのちの冒険なんかは、マクロスの監督と菅野よう子さんがやってるからアニメ好きなら好きなはず。
  • 小学校の校舎をそのまま移設したものもあって、昔に帰ったみたいになれる。
  • 建物を見るだけでも面白い。

食事について

  • 海外パビリオンの一部で食事を提供しています。
  • 中東系のご飯は普段食べられないので、食べてみたいのであればおすすめです。人気のサウジアラビアはガチ勢が朝から張っています。始発で来なければあきらめましょう。
  • 値段は高めですが、普段と違うものが食べられるので楽しいです。
  • 日本の衛生状態で海外の食べ物が食べられるのはレアなのでぜひ食べましょう。アフリカとかあります。tanacafe.jp
  • どこも15時ぐらいにいくと比較的空いてます。
  • テイクアウトで食べられるところもまぁまぁあります。私が過去食べたのは、マルタ、コロンビア、ルクセンブルクUAEポルトガル、トルコなどです。
  • コロンビアはコーヒーの列と食事の列が別でした、食事はその時は空いていました。(15時ごろ)
  • SNSを見ているとマレーシアは爆速で出てくるとか色々書いていたので楽しんでください。
  • 各国の食べ物を回転寿司にしてくれたくら寿司は予約制です。予約を取ってないならあきらめましょう。
  • 西ゲートから奥に行ったところは食事取れますが、比較的空いています。中心部から遠いです。

帰宅時について

  • ボランティアの皆様にお礼を言ってください。
  • ドローンショーは見る価値がありました。すごいです。

楽しんでください!!

pythonで標準出力を取得する。

f = io.StringIO()
with redirect_stdout(f):
    help(pow)
s = f.getvalue()

公式ドキュメント

終わり!

とするのは味気ないのでなぜこんなことを調べたのか補足。

生存時間解析のライブラリの[lifelines] (https://lifelines.readthedocs.io/en/latest/index.html)を使っているたのですが、fittingした結果をprint()で返す仕様になっていました。
jupyter notebookで使う間はこの仕様でも問題なく動作するのですが、streamlitへ出力する場合には、標準出力は具合が悪いです。
例えばlifelineのCox比例ハザードモデルを実行したとします。

from lifelines import CoxPHFitter
from lifelines.datasets import load_rossi

rossi = load_rossi()

cph = CoxPHFitter()
cph.fit(rossi, duration_col='week', event_col='arrest')

cph.print_summary()  

このときの print_summary() 関数はソースコードを見るとprint() 関数で標準出力しています。

なので、 redirect_stdout() を使って、

from io import StringIO
from contextlib import redirect_stdout


f = StringIO()
with redirect_stdout(f):
    cph.print_summary(style='html')

とすれば、htmlで得られるので、あとはstreamlitを使って、

import streamlit as st

st.markdown(f.getvalue(), unsafe_allow_html=True)

として出力できます。streamlitのissueを見ていると、

github.com

というissueもあるようなので、そのうちstreamlit側で解決されるかも。

pythonの相対インポートがわからなくなったメモ

たまにわからなくなるので、メモ書きです。

pytorchのgithubを読んでいると、次のような相対importが出てきます。

from .module import Module

https://github.com/pytorch/pytorch/blob/master/torch/nn/modules/conv.pyのLine 10とか。

これを参考に、自分でも相対インポートをしようと思いました。

src/  
├── bar.py  
└── foo.py

foo.py

def foo():
    print('foo')

bar.py

from .foo import foo

def bar():
   print('bar')
   foo()

if __name__ == '__main__':
     bar()

python bar.py を実行しようとしたのですが、このときには

Traceback (most recent call last):  
  File "bar.py", line 1, in <module>  
    from .foo import foo  
ImportError: attempted relative import with no known parent package

とエラーが出ます。
非常に初歩的な内容なのですが、.を用いた相対インポートを行う場合には、親ディレクトリが必要なようです。
なので、

src
├── main.py
└── module`
    ├── __init__.py
    ├── bar.py
    └── foo.py

のようにディレクトリ構成を変更して、

module1/__init__.py

from .bar import bar
from .foo import foo

__all__ = [foo, bar]

main.py

from module1 import foo, bar

if __name__ == '__main__':
    foo()
    bar()

として、main.pyを実行すれば、

foo
bar
foo

と返り値が得られました。

なので、相対インポートを使いたいときには親ディレクトリを作って使いましょう。

実行ファイルと同じ並びに相対インポートしたいpythonファイルがある場合には、. を使わず、 bar.py

from foo import foo

def bar():
   print('bar')
   foo()

if __name__ == '__main__':
     bar()

とすれば、インポートできます。

pytorchでpretrained modelの最終層だけlrを変更する。

torchvisionで呼び出した最終層だけlrを変えるやり方がわからなかったので調べてみました。 pytorchの公式ドキュメントに記載があるので,そちらを参照して頂いたほうが正しい情報になると思います。

まず適当なmodelを呼び出します。

from torchvision import models

model = models.resnet18(pretrained=False)

lrを変えるのは,optimizerの部分で定義します。 公式ドキュメントをフォローしています。

import torch.optim as optim
optimizer = optim.SGD([
                                        {'params': model.parameters()},
                                        {'params': model.fc.parameters(), 'lr': 1e-3}
                                       ], lr=1e-2, momentum=0.9)

で行けるようです。 あとは学習させるだけです。

PILで取り込んだ画像をnumpyに変換してmaskと重ねる

普段,私は画像はPIL(Pillow)で取り込んでいます。 色々あって,semantic segmentationを取り組んでいるのですが,やっぱりmaskデータと重ねて描写してみたくなります。 いまいちやり方がわからなかったので,自分なりにググってやってみたことを書いておきます。 単なる備忘録です。 絶対もっといいやり方があると思います。

参考にしたのは,

stackoverflow.com

です。

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt

#データ取り込み
image = Image.open(img_data)
mask = np.array(mask_data)

# numpyへの変換
image = np.asarray(image)

# figureサイズ操作
plt.figure(figsize=(XX, XX), dpi=XX)

# 描写
plt.imshow(image)
plt.imshow(mask, "jet", alpha=0.2)

です。 最後の引数"jet"は色の好みで,alphaで透明度を変更できます。

ベイズ線形回帰

動機

MCMCで計算をすると,カルマンフィルタを実装したときは実感できたベイズ更新の部分がよくわからないという僕の気持ちの問題がありました。
そこで,須山さんの「ベイズ推論による機械学習入門」

機械学習スタートアップシリーズ ベイズ推論による機械学習入門 (KS情報科学専門書)

機械学習スタートアップシリーズ ベイズ推論による機械学習入門 (KS情報科学専門書)

の3章で,学習と推論を解析的に導出していたため,自分で計算・実装を行い理解を深めたいというのがこの記事を書く動機です。

線形回帰の式

1次関数での線形回帰

想像しやすいように,1次関数での線形回帰を行います。式は y = a x + b+ \varepsilon_rです。
 \varepsilon_rはノイズで,回帰分析の事後分布として求めたい値は, a, bとなります。
ノイズは簡単のために正規分布に従うと仮定して,
 \varepsilon_r \sim N(\varepsilon_r | 0, \lambda^{-1})
と定義します。テキストに習って \lambdaは既知であるとします。
ある一つの観測値 y_kとある一つの入力値 x_kが得られたときに,事後分布 p(a| y_k, x_k), p(b|y_k, x_k)が導出できれば,学習と予測ができることになります。

まず,簡単のために,bは既知であるとして,aの事後分布を解析的に求めてみます。
ベイズの定理より,求めたい事後分布 p(a| y_k, x_k)は,
 p(a| y_k, x_k) = \frac{p(y_k|x_k, a) p(a)}{p(y_k, x_k)}
と書けます。
このときに,事前分布 p(a)正規分布していると仮定し
 p(a) = N(a | m_a, \Lambda_a^{-1})=  \frac{1}{\sqrt{2\pi\Lambda_a^{-1}}}\exp\big(  -\frac{1}{2}\Lambda_a(a-m_a)^{2}  \big)
と書けるとします。ここで, m_a, \Lambda_aは事前分布の平均と分散で固定値で与えるハイパーパラメータです。

さて,事前分布 p(a)と入力値  x_kが与えられた元で,観測値 y_kが得られる度合いを表す尤度を考えます。
先程,ノイズが正規分布に従うとしたため,
 p(y_k|x_k, a) = N(y_k | a * x_k +b, \lambda^{-1}  )
と書くことができます。ここで,この正規分布を真面目に書いてみると
 N(y_k |  a * x_k+b, \lambda^{-1}) = \frac{1}{\sqrt{2\pi\lambda^{-1}}}\exp\big(  -\frac{1}{2}\lambda(y_k-a*x_k-b)^{2}  \big)
となります。
今は aの事後分布だけが気になっているので,計算を簡単にするために事前分布,尤度をそれぞれの対数( \log)を取って, aについて整理していきます。

事前分布

 \log p(a) = \log \frac{1}{\sqrt{2\pi\Lambda_a^{-1}}}\exp\big(  -\frac{1}{2}\Lambda_a(a-m_a)^{2}  \big)
  = -\frac{1}{2} \log (2\pi\Lambda_a^{-1} )  -\frac{1}{2}\Lambda_a(a-m_a)^{2}

第一項は aに関係のない項なので,第二項を展開して, aに関する項を昇順に並べていきます。
 -\frac{1}{2}\Lambda_a(a-m_a)^{2} = -\frac{1}{2}  \Lambda_a a^{2} + \Lambda_a m_a a  -\frac{1}{2} \Lambda_a m_a^{2} (1)
となります。

尤度

次に,先程定義した尤度も同様に計算することで,
 -\frac{1}{2}  \lambda_a x_k ^{2} a^{2} + \lambda (y_k -b) x_k a  -\frac{1}{2} \lambda (y_k -b )^{2} (2)
と書けます。

事前分布と尤度の積

ベイズの定理の分子である p(y_k|x_k, a) p(a)は事前分布と尤度の積ですので,対数を取ったあとは和になります。
なので,(1)と(2)の和を計算して, aについて昇順に並べることで,事後分布の aについてはどのような形になるのか想像することができます。和を取ると  -\frac{1}{2}  ( \Lambda_a  + \lambda_a x_k ^{2} ) a^{2} +( \Lambda_a m_a + \lambda (y_k -b) x_k )a  -\frac{1}{2} ( \Lambda_a m_a^{2} + \lambda (y_k -b )^{2}) (3)
と書けます。
この形は事前分布や尤度で仮定した正規分布と全く同じ形になっていることから,事後分布も正規分布であると考えることができます。*1
分母は,周辺尤度を求めれば,正規化されていると思います。
このあたりの数式は天下り的に計算はしませんが,任意の事後分布の正規化の数式などは例えば,

こちらの本などに書かれているように思えます。
さて,事後分布も正規分布であるとして,一点を観測したあとの傾き aの事後分布は
 p(a| y_k, x_k) = N(a| ( \Lambda_a  + \lambda_a x_k ^{2} ), \frac{\Lambda_a m_a + \lambda (y_k -b) x_k}{( \Lambda_a  + \lambda_a x_k ^{2} )}) (4)
として計算できます。*2

今,観測点が一点だけの場合を考えていましたが,複数観測する場合には,式(3)は更に一般化することができて,  -\frac{1}{2}  ( \Lambda_a  +\sum_k \lambda_a x_k ^{2} ) a^{2} +( \Lambda_a m_a + \sum_k  \lambda (y_k -b) x_k )a  -\frac{1}{2} ( \Lambda_a m_a^{2} + \sum_k \lambda (y_k -b )^{2}) (3)
と,書けます。このとき,(4)は
 p(a| y_k, x_k) = N(a| \frac{\Lambda_a m_a +  \sum_k \lambda (y_k -b) x_k}{( \Lambda_a  +  \sum_k  \lambda_a x_k ^{2} )}, ( \Lambda_a  +  \sum_k  \lambda_a x_k ^{2} )) (5)
となりますので,この式を使うことで,一点一点を更新していく様子がみることができます。

実装

実装コードはこちらにあります。

github.com

傾き  a=5 , 切片  b=3, ノイズが  \sigma=1正規分布に従って生成されるとして,データをランダムに200点ほど作成します。

f:id:Leo0523:20190501223555p:plain
図1: 観測データ

図1のような,データが得られます。

データが得られたので,上の計算で行ったように,切片aをベイズ線形回帰で計算してみます。
事前分布は,中心ピークを4.5,標準偏差  \sigma=2正規分布を仮定します。

f:id:Leo0523:20190501223410p:plain
図2: 事前分布

この仮定の元,上記の計算を実行して,事後分布が毎回どのような形状になるのか計算してみます。
結果は次の動画で,

f:id:Leo0523:20190501224331g:plain
ベイズ更新

一点ごとの更新となりますので,徐々に予測の幅が狭くなり,値が真値である5に収束していく様子が見えます。
これは僕が当初見たかったベイズ線形回帰におけるベイズ更新の様子になります。

現在の仮定では事前分布の幅が広く,ピークも真値に近いので,パラメータを変えて実験を行ってみました。

事前分布:ピーク3, 標準偏差  \sigma=0.5, 観測データ点数100点

f:id:Leo0523:20190501225109g:plain
ベイズ更新2

事前分布:ピーク3, 標準偏差  \sigma=0.1 , 観測データ点数100点

f:id:Leo0523:20190501225247g:plain
ベイズ更新3

標準偏差が小さいときには,事前分布に引っ張られて真の値になかなかたどり着かない様子がこれらの動画から見ることができました。
事前分布,大事!

まとめ

  • 教科書に従って事後分布を解析的に導出した。

  • 導出した式を使ってベイズ更新の様子を描写した。

  • (数式的には自明だが)事前分布の標準偏差が小さいほど真値を予測するには観測データが沢山必要であることが動画からわかった。

*1:ほんまかいな?数学的な証明はわかりません

*2:詳細な計算は須山さんのベイズ推論による機械学習入門を読んでください