Osomaki67のブログ

個人的な備忘録兼日記にしたいと思います。

大量のMIDIファイルが見つかりました。

終活してたわけでもないですが、自宅PCに大量のMIDIファイルが見つかりました。

大昔に、MacのLC520を使っていた頃に購入した、”The PIANIST" の残骸です。

 

当時は、RolandのHP3800を接続して楽しんでいました。

HP3800は、発売開始1992年    製造完了1995年で、何度か修理をしましたが、30年弱経過して、いまだ健在です。

我が家のPCをWindowsに変更したときに、RolandのUM-1SX (MIDI⇐⇒USB)を導入して、MediaPlayerで何とか再生できていました。

その後、Windowsが世代交代を繰り返し、Windows 8以降のOSでは、MediaPlayerでMIDIが使えなくなってしまい、そのまま放置していました。
(MediaPlayerでMIDIを再生し、PCから音を出すことはできるが、貧弱な音なので)

現在は、時間がたっぷりある生活になっているので、復活を検討しました。

いろいろ調べると、MIDIマッパーというツールを使えば、windows10でも、MediaPlayerでMIDIが使えるようです。

今回は、CoolSoft社の"VirtualMIDISynth"というソフトを流用しました。任意の”サウンドフォント”というのを音源として使えるようにする MIDI ドライバーで、既定の MIDIバイスを設定する機能(MIDI マッパー)、専用の MIDI ミキサー... などが付いています。このソフトでは、”サウンドフォント”を指定しないとエラーで警告がでますが、ソフトは、既定の MIDIバイスを設定する機能(MIDI マッパー)だけを、最初に1回だけ使用させて頂き、その後に起動することはないので、問題ないでしょう。


次の問題は、UM-1SXのドライバーでした。windows10用のドライバーの正規版はなく、使えるとされるドライバーが
https://driver64bit.wiki.fc2.com/wiki/UM-1%252F1EX%252F1S%252F1SX%252F1X
に記載されていました。

まずは、「WindowsVistaドライバを用いる事でInf書き換えもなしにインストーラーの互換モード設定のみでインストール可能です」とのことなので、
https://www.roland.com/jp/support/by_product/um-1ex/updates_drivers/
EDIROL UM-1 Driver Ver.1.0.0 for Windows Vista 64ビット版を
互換モード設定で入れ直したつもりです。と言うのも、よく覚えていなくて、ドライバーをアンインストール/インストール繰り返して、再起動を繰り返していたら、デバイスマネージャの「サウンド、、、」項目に認識されていました。

結果的に、復活は成功し、Windows10のPCでMediaPlayerを用い、MIDIファイルを電子ピアノで再生することができました。

30年弱前の音源もなかなかのものと思いますが、最近の”サウンドフォント”とやらを体験したいような気になってきました。

 

 

海外で使えるSIM airBalticCard のその後(2021-06-14現在)

コロナ禍で、海外旅行の悲惨な状況が続いている中、ふと、思い出しました。

2019-05-30に投稿した記事です。
「海外で使えるSIM airBalticCard を日本で使ってみました。」

今日は、2021-06-14ですが、まだ生き残っているでしょうか?

恐る恐る、PCで、ホームページにアクセスしてみました。

以前の印象からは大幅に変わっており、パスワードのリセットをさせられました。

無事、ログインできて、残高を見ると、なんと、8.85ユーロ残っていました。

ホームページにログインできて、残高が残っていて、スマホもairBalticCardの電波を捕まえているようです。

前回の記事と同様に、日本←→日本で通話(実際はコールのみ)テストを試みたところ、これも無事成功です。

何故か、嬉しくなって10ユーロチャージ(Top Up)してしまいました。

データプランも大幅に変わっており、すべて、30日の期限付きでしたので、データプランの購入は保留して、AirTimeのみのチャージです。

これで、2022-12-13までは、SIMが生き残るはずです。

airBalticCardの日本語サポートがなくなり、日本の代理店サイトもアクセスできないので、今後どうなるかを楽しみに、コロナ禍をやり過ごして、生きていれば、また海外に行きたいですね。

 

 

古いiPhone 5sがOSアップデートに失敗しました。悲惨です。Junkになってしまった過程の備忘録です。

結論:

最後の手として、別のiPhoneを親機として使わしてもらい、Blutoothテザリングでネットワークに接続できました。

この状態で、iPhone 5s本体のリセットで工場出荷時に戻し、アクテベーション画面まで戻りました。言語、国、の設定の後に、手動で設定を続けると、Wi-Fiの設定画面で、Wi-Fiが選択できません。それではと、iTunesで設定の方を選択すると、リカバリーモードに入りましたが、iTunesが認識してくれる様子はみえません。

何だか、アクテベーションロックと似たような状況になってしまいました。

酷い。酷い。酷い。

 

 

経過:

音楽プレーヤとして使っていた、古いiPhone 5siOSのアップデートに失敗しました。

iOS12.4.6からiOS12.4.8へのアップデートです。

「後でやり直します。」とのメッセージは出ましたが、一向に進展しません。

状況は悲惨で、充電しても、残量は1%のまま動かないし、Wi-FiはONにできないし、動作は緩慢で、ボタンを押しても、機能するまでに相当な時間がかかるし、勝手にリブートしてるようにみえるし、訳わかりません。

このままでは何も見えないので、まずは、充電器にUSB電流電圧テスターを接続してみることにしました。このテスターはアマゾンで300円程度で売っているもので、精度は不問ですが、使えました。おかしな話ですが、使えないアクセサリーだと、iPhoneから文句も来ません。

このテスター介して充電接続すると、0.1A程度の電流は流れています。たまたまブートできて、起動した状態で、電源を切ると、0.6A程度の電流が流れるようになります。そのまま、ある程度時間が過ぎると、勝手にブートして、起動しますが、起動時には0.1A程度の電流に落ちています。

何度か繰り返すうちに、勝手にブートする時に、0.6A程度の電流まま、起動されることがあります。これ幸いと、スリープボタンでスリープにして放置すると、3時間以上0.6A程度の電流が流れ続けました。その後、3時間から5時間の間に、0.3A程度の電流になり、その後、12時間経過しても、0.3A程度の電流が流れ続けていました。

しかし、その後、起動すると、電池残量は1%のままです。

バッテリーの容量は、1600mAh程度(3.8Vで、5.92Whr)なので、効率が半分としても、考えられない状況です。一体どこで消費されているのか? iPhone本体は心地よく温かくなっていますが、熱くはなっていません。 iPhone 5sの表示が狂っているのかも?

iTunesに助けてもらうしかないと、以前から接続していたPC(Windows10)に接続しましたが、iTunesが認識してくれません。他の正常なiPhoneは以前と同様に認識しますので、やはり、iPhone 5s側に問題があるのか?

それではと、リカバリーモードを試してみました。

iPhone 5sリカバリーモードにはできても、iTunesは認識してくれません。

DFUモードに設定しようとしても、iTunesが認識してくれないので、DFUになってるかどうか判断できません。

そこで、一からおさらいしました。

まず、iTunesはまともか? iTunesの版は最新でした。ところが、

Apple Software Update、Apple Mobile Device Support、Bonjour、 Apple Applecation Support(64ビット)がインストールされていません。??? 何故か???

そう言えば、何も考えずに、Microsoft Storeからインストールしたことを思い出しました。すべて、アンインストールして、Microsoft Storeからではなく、https://www.apple.com/jp/itunes/ からインストールしました。

上記のソフトもすべてインストールされました。なぜか、版はMicrosoft Storeからインストールしたのと同じでした。

正常なiPhoneは問題なく認識するのに、異常な本機では、何も変わらず、iTunesが認識してくれる様子はみえません。

iPhone 5s本体のリセットは、動くものはすべてTRYしましたが、どれも結果がでません。工場出荷時に戻そうとしても、AppleIDの確認にネットワークが必要なのでできません。これでは、JUNKとして売り飛ばすにも問題があります。

iOS12.4.8のダウンロードファイルがストレージに残っていたので、削除してからすべてやり直しましたが、結果は変わりません。

 

八方塞がりです。

最後の手がありました。Blutoothが正常に動作してましたので、Blutoothテザリングです。何とか、別のiPhoneを親機として使わしてもらい、ネットワークに接続できました。

この状態で、iPhone 5s本体のリセットで工場出荷時に戻してみました。

結果は、見事、アクテベーション画面まで戻りましたが、

言語、国、の設定の後に、手動で設定を続けると、Wi-Fiの設定画面で、Wi-Fiが選択できません。それではと、iTunesで設定の方を選択すると、リカバリーモードに入りましたが、iTunesが認識してくれる様子はみえません。

何だか、アクテベーションロックと似たような状況になってきました。

多分、ユーザーコンテンツ、個人情報はすべて削除されていると信じて、JUNKとして売り飛ばすか?

または、iPhone 5sのJUNK品が安くなるのを待って、購入し、もう少し遊んでみるか?

古いので、救いようのない状況です。

 

 

海外で使えるSIM airBalticCard を日本で使ってみました。

海外で使えるSIMが多数販売され、日本で入手可能です。

そこで、海外旅行に行く毎に、SIMを選ぶのが面倒で、使用期間が限定されているため、電話番号も毎回変わるのは嫌だ。と、いうような気分でこれをを検討してみました。

PacificSIM by airBalticCard です。

試験には古いスマホで、海外用のXperia M2 D2303を使いました。OSのバージョンは5.1.1でした。

購入したSIMを入れて、電源をONすると、NTTドコモの電波を捕まえました。

下記等を参照しながら、登録、アクティベーションを完了させました。

参考:
https://sanpobiyori.net/airbalticcard/
https://simdojo.jp/archives/76511766.html
https://note.mu/kawanet/n/n249d9f0c6888
https://airbalticcard.com/information/mobile-web/
https://airbalticcard.com/

さて、いよいよ試験です。

データローミング用の日本向け格安パッケージが見当たらず、1ユーロ/10MB程度のパッケージしか無いので、この試験は止めておきました。したがって、スマホのモバイルデータ通信をOFF、データローミングをOFFにしました。

まずは、日本の電話から、購入したSIMの電話番号に電話してみます。何の問題もなく着信しました。お金がもったいないので、応答せずに切りました。

次に、購入したSIMを入れたスマホから日本の電話に電話してみました。何か変です。直ぐに切れてしまいます。購入先に問い合わせしたところ、通話は3Gの電波限定であることが判明しました。そこで、スマホの優先ネットワークをGSM/WCDMAに変更して、再トライしました。多少、進展はありましたが、それでも繋がりません。

横浜の場合は下記のようにダイアルすれば良いとの連絡がありました。

*146*008145*******#

何かわかりませんが。USSDコードなるものが実行されるようになりましたが、

それでも繋がりません。

困りました。

スマホの端末情報で、機器の状態(SIMステータス)を見てみると、電話番号が「不明」となっています。ということは、非通知でCall Backされているのかと思い、日本の電話の非通知通話拒否を解除してもらいました。

無事、接続されました。 

SMSも試行しました。SMSの場合は、008190********で発信できました。但し、料金が高いです。0.85ユーロ/件でした。受信は無料のようです。

いろいろ試行錯誤して、かかった費用は複数の通話発信が合計で3.12ユーロ、着信は無料、複数のSMS送信が合計2.55ユーロで、合計5.57ユーロのお遊びでした。

海外で使った結果を後日報告できるといいな。

最近の技術はよくわかりません。電話番号はSIM提供会社のサーバー上にあるのでしょうか? 電話が着信したからといって、端末に電話番号が固定されているわけではなく、他のID?を使用して通信していると考えるしか無いような気がします。発信する場合は、他のID?を使用してSIM提供会社のサーバーに接続し、実際はこのサーバーから発信されると考えると操作方法と辻褄が合います。すべて想像の推論?でした。

通話のローミングと、データローミングは別物でデータローミングには渡航する国で最適なプランを別途購入する必要があることに留意して、ひとまず終わります。

 2019/06/23 追記:

ロンドンからは+81で日本の電話につながって、コールバックもなかったとの情報もあります。テザリングも使えたようです。もう少し時間をかけて、事例検証していきたいですね。

 

AI 事始め19:TensorFlow:EstimatorとTensorBoardに触ってみました

 

 

 

 

再び、Get Started with TensorFlowに戻って、EstimatorとTensorBoardに触ってみました。Estimatorは機械学習プログラミングを大幅に簡素化する高レベルのTensorFlow APIで、「トレーニング」、「 評価」、「 予測」、「 配信のためのエクスポート」のアクションをカプセル化します。

TensorBoardは、TensorFlowの可視化環境で、TensorFlowに付属しています。

題材は、Build a Convolutional Neural Network using Estimatorsです。 データとして、mnist = tf.contrib.learn.datasets.load_dataset("mnist")を使用していますので、色々比較できるかもです。 自分に分かり易いように、コメント追加しています。また、多少の変更も入っています。

In [1]:
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

# Imports
import numpy as np
import tensorflow as tf

tf.logging.set_verbosity(tf.logging.INFO)
In [2]:
# Our application logic will be added here
def cnn_model_fn(features, labels, mode):
  """Model function for CNN."""
  # Input Layer
  input_layer = tf.reshape(features["x"], [-1, 28, 28, 1])

  # 入力画像をTensorBoardに出してみる。
  tf.summary.image('input', input_layer, 10) # 入力画像をTensorBoardに出してみる。

  # Convolutional Layer #1
  conv1 = tf.layers.conv2d(
      inputs=input_layer,
      filters=32,
      kernel_size=[5, 5],
      padding="same",
      activation=tf.nn.relu)

  # Pooling Layer #1
  pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)

  # Convolutional Layer #2 and Pooling Layer #2
  conv2 = tf.layers.conv2d(
      inputs=pool1,
      filters=64,
      kernel_size=[5, 5],
      padding="same",
      activation=tf.nn.relu)
  pool2 = tf.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2], strides=2)

  # Dense Layer
  pool2_flat = tf.reshape(pool2, [-1, 7 * 7 * 64])
  dense = tf.layers.dense(inputs=pool2_flat, units=1024, activation=tf.nn.relu)
  dropout = tf.layers.dropout(
      inputs=dense, rate=0.4, training=mode == tf.estimator.ModeKeys.TRAIN)

  # Logits Layer
  logits = tf.layers.dense(inputs=dropout, units=10)

  predictions = {
      # Generate predictions (for PREDICT and EVAL mode)
      "classes": tf.argmax(input=logits, axis=1),
      # Add `softmax_tensor` to the graph. It is used for PREDICT and by the
      # `logging_hook`.
      "probabilities": tf.nn.softmax(logits, name="softmax_tensor")
  }

  if mode == tf.estimator.ModeKeys.PREDICT:
    return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions)

  # Calculate Loss (for both TRAIN and EVAL modes)
  loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits)

  # Configure the Training Op (for TRAIN mode)
  if mode == tf.estimator.ModeKeys.TRAIN:
    optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001)
    train_op = optimizer.minimize(
        loss=loss,
        global_step=tf.train.get_global_step())
    return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op)

  # Add evaluation metrics (for EVAL mode)
  eval_metric_ops = {
      "accuracy": tf.metrics.accuracy(
          labels=labels, predictions=predictions["classes"])}
  return tf.estimator.EstimatorSpec(
      mode=mode, loss=loss, eval_metric_ops=eval_metric_ops)
In [3]:
def main(unused_argv):
  # Load training and eval data
  mnist = tf.contrib.learn.datasets.load_dataset("mnist")
  train_data = mnist.train.images # Returns np.array
  train_labels = np.asarray(mnist.train.labels, dtype=np.int32)
  eval_data = mnist.test.images # Returns np.array
  eval_labels = np.asarray(mnist.test.labels, dtype=np.int32)
  # Create the Estimator
  mnist_classifier = tf.estimator.Estimator(
    model_fn=cnn_model_fn, model_dir="/tmp/mnist_convnet_model") # tensorboard --logdir=/tmp/mnist_convnet_model
                                                                 # http://localhost:6006
    
  # Set up logging for predictions
  tensors_to_log = {"probabilities": "softmax_tensor"}
  logging_hook = tf.train.LoggingTensorHook(
    tensors=tensors_to_log, every_n_iter=50)
  # Train the model
  train_input_fn = tf.estimator.inputs.numpy_input_fn(
    x={"x": train_data},
    y=train_labels,
    batch_size=100,
    num_epochs=None,
    shuffle=True)
  mnist_classifier.train(
    input_fn=train_input_fn,
    steps=20000,
    hooks=[logging_hook])
  # Evaluate the model and print results
  eval_input_fn = tf.estimator.inputs.numpy_input_fn(
    x={"x": eval_data},
    y=eval_labels,
    num_epochs=1,
    shuffle=False)
  eval_results = mnist_classifier.evaluate(input_fn=eval_input_fn)
  print(eval_results)
In [ ]:
if __name__ == "__main__":
  tf.app.run()
 

WARNING:tensorflow:From <ipython-input-3-c2192ea8d28e>:3: load_dataset (from tensorflow.contrib.learn.python.learn.datasets) is deprecated and will be removed in a future version. Instructions for updating: Please use tf.data.

TensorFlow1.11で動作させましたが、このような WARNINGが数多く出ました。 下記を動作させれば良かったかな。   The official TensorFlow implementation of MNIST, which uses a custom estimator.

ともかく、最後まで動作しました。

INFO:tensorflow:Saving checkpoints for 80000 into /tmp/mnist_convnet_model\model.ckpt. INFO:tensorflow:Loss for final step: 0.035059605. INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Starting evaluation at 2018-11-29-05:10:49 INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from /tmp/mnist_convnet_model\model.ckpt-80000 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Finished evaluation at 2018-11-29-05:10:56 INFO:tensorflow:Saving dict for global step 80000: accuracy = 0.9863, global_step = 80000, loss = 0.041395575 INFO:tensorflow:Saving 'checkpoint_path' summary for global step 80000: /tmp/mnist_convnet_model\model.ckpt-80000 {'accuracy': 0.9863, 'loss': 0.041395575, 'global_step': 80000}

グラフや入力画像もTensorBoardで表示できましたが、自分の能力では、解読は無理でした。

*jupyter上で動作させると、エラーになりますので、cnn_mnist.pyを使ってください。

AI 事始め18:CS231n:Module 1: Neural Networksの例題 おまけ メモ2

 

 

 

 

Putting it together: Minimal Neural Network Case Study

minimal 2D toy data example : see https://cs231n.github.io/neural-networks-case-study/

おまけ2 Neural Networkの解釈メモ

In [4]:
import numpy as np
import matplotlib.pyplot as plt
N = 100 # number of points per class
D = 2   # dimensionality
K = 3   # number of classes
In [5]:
# initialize parameters randomly
h = 100 # size of hidden layer
W = 0.01 * np.random.randn(D,h)
b = np.zeros((1,h))
W2 = 0.01 * np.random.randn(h,K)
b2 = np.zeros((1,K))
 

N = num_examples つまり、N = 300 として記述する。

バイアスベクトル \( \quad b2 = (b2_1,b2_2,b2_3) \quad b = (b_1,b_2,\ldots ,b_h) \)は省略して、カタチだけ記述してみる。

$$\quad\quad データ配列 \quad\quad\quad\quad 重み行列 \quad\quad\quad\quad\quad\quad hidden\_layer行列 \quad\quad\quad\quad$$

$$\longrightarrow d\quad\quad\quad\quad\quad\longrightarrow j\quad\quad\quad\quad\quad\quad\quad\quad\longrightarrow j \quad\quad\quad\quad\quad$$
$$ \Bigg\downarrow i \pmatrix{ x_{11} & x_{12} \cr x_{21} & x_{22} \cr x_{31} & x_{32} \cr \vdots & \vdots \cr x_{N1} & x_{N2} \cr }\pmatrix{ W_{11} & W_{12} & \ldots & W_{1,100} \cr W_{21} & W_{22} & \ldots & W_{1,100} \cr }=\pmatrix{ H_{11} & H_{12} & \ldots & H_{1,100} \cr H_{21} & H_{22} & \ldots & H_{2,100} \cr H_{31} & H_{32} & \ldots & H_{3,100} \cr \vdots & \vdots & \ddots & \vdots \cr H_{N1} & H_{N2} & \ldots & H_{N,100}\cr}$$

 

$$\quad\quad hidden\_layer配列 \quad\quad\quad\quad 重み行列 \quad\quad\quad\quad\quad\quad スコア行列 \quad\quad\quad\quad 解答配列$$ $$\longrightarrow d\quad\quad\quad\quad\quad\longrightarrow j\quad\quad\quad\quad\quad\quad\quad\quad\longrightarrow j \quad\quad\quad\quad\quad$$

$$ \Bigg\downarrow i\pmatrix{ H_{11} & H_{12} & \ldots & H_{1,100} \cr H_{21} & H_{22} & \ldots & H_{2,100} \cr H_{31} & H_{32} & \ldots & H_{3,100} \cr \vdots & \vdots & \ddots & \vdots \cr H_{N1} & H_{N2} & \ldots & H_{N,100}\cr}\pmatrix{ W2_{11} & W2_{12} & W2_{13} \cr W2_{21} & W2_{22} & W2_{23} \cr \vdots & \vdots& \vdots \cr W2_{100,1} & W2_{100,2} & W2_{100,3} }=\pmatrix{ f_{11} & f_{12} & f_{13} \cr f_{21} & f_{22} & f_{23} \cr f_{31} & f_{32} & f_{33} \cr \vdots & \vdots & \vdots \cr f_{N1} & f_{N2} & f_{N3}\cr}\quad,,,\quad\pmatrix{y_{1}\cr y_{2}\cr y_{3}\cr \vdots \cr y_{N}\cr}$$

 

下記の理解が難しいので、直訳してみる。

ReLUの非線形性をバックプロパゲーションする必要があります。これは、後方伝搬中のReLUが実質的にスイッチであるため、容易であることが分かります。

\( r = max(0,x)  \)であるから、その微分は\( \quad\quad\quad \frac{dr}{dx} = 1 (x>0)  \)となります。  

チェーンルールと組み合わせると、フォワードパスでのReLUユニットは、入力が0より大きい場合にはグラジエントパスを通り、変更せずに通過しますが、入力がゼロ未満の場合には出力を殺します。したがって、ReLUを単に以下のように後方伝搬することができます。
dhidden[hidden_layer <= 0] = 0  この記述がわかりません。
dhidden.shapeとhidden_layer.shapeは同じです。(300L, 100L)

In [11]:
ar1 = np.array([[-1.1],[0],[1.1]])
ar2 = np.array([[5],[6],[7]])
ar2[ar1 <=0] = 0
ar2
Out[11]:
array([[0],
       [0],
       [7]])
 

とても勉強になりました。ただし、numpy docsのどこに書かれているのか見つけることができませんでした。

AI 事始め17:CS231n:Module 1: Neural Networksの例題 おまけ メモ1

 

 

 

 

Putting it together: Minimal Neural Network Case Study

minimal 2D toy data example : see https://cs231n.github.io/neural-networks-case-study/

おまけ numpyの動作理解と式の解釈メモ

In [1]:
import numpy as np
import matplotlib.pyplot as plt
In [2]:
np.ones((2, 3))    # 2行 3列
Out[2]:
array([[1., 1., 1.],
       [1., 1., 1.]])
In [3]:
np.ones((6,2))                        # 6行 2列
Out[3]:
array([[1., 1.],
       [1., 1.],
       [1., 1.],
       [1., 1.],
       [1., 1.],
       [1., 1.]])
In [4]:
W = np.array([[1., 2., 3.],[2., 3., 4.]])  # 2行 3列
X = np.ones((6,2))                        # 6行 2列
X[0:6,1]= (1,2,3,4,5,6)
np.dot(X, W)                               # 順番に注意
Out[4]:
array([[ 3.,  5.,  7.],
       [ 5.,  8., 11.],
       [ 7., 11., 15.],
       [ 9., 14., 19.],
       [11., 17., 23.],
       [13., 20., 27.]])
 

 N = num_examples つまり、N = 300 として記述する 

バイアスベクトル \( \quad b = (b_1,b_2,b_3)\quad \) は省略して、カタチだけ記述してみる。

$$\quad\quad データ配列 \quad\quad\quad\quad 重み行列 \quad\quad\quad\quad\quad\quad スコア行列 \quad\quad\quad\quad 解答配列$$ $$\longrightarrow d\quad\quad\quad\quad\quad\longrightarrow j\quad\quad\quad\quad\quad\quad\quad\quad\longrightarrow j \quad\quad\quad\quad\quad$$

$$ \Bigg\downarrow i \pmatrix{ x_{11} & x_{12} \cr x_{21} & x_{22} \cr x_{31} & x_{32} \cr \vdots & \vdots \cr x_{N1} & x_{N2} \cr }\pmatrix{ W_{11} & W_{12} & W_{13} \cr W_{21} & W_{22} & W_{23} \cr }=\pmatrix{ f_{11} & f_{12} & f_{13} \cr f_{21} & f_{22} & f_{23} \cr f_{31} & f_{32} & f_{33}\cr \vdots & \vdots & \vdots \cr f_{N1} & f_{N2} & f_{N3}\cr}\quad,,,\quad\pmatrix{y_{1}\cr y_{2}\cr y_{3}\cr \vdots \cr y_{N}\cr}$$

 

$$L_i=-\log\frac{\mathrm{e}^{f_{y_i}}}{\sum_{j} \mathrm{e}^{f_j}}$$

 

\( \mathrm{e}^{f_{y_i}} \) ⇒ exp_scores = np.exp(scores) 

i番目のデータに対応する解答配列yの要素を \( j=y_i\) とすると、\( \mathrm{e}^{f_{y_i}} \)はスカラー量になる。 しかし、\( \sum_{j} \mathrm{e}^{f_j} \)を計算しなければいけないので、\( f_j \) 全部を計算する。

 

\( \frac{1}{2}\lambda\sum_{k}\sum_{l}W_{k,l}^2  \quad\quad \)  ⇒ \( \quad\quad \) reg_loss = 0.5*reg*np.sum(W*W)

\( k,l \)の説明がなく、理解が進まないが、右記のコードで計算する結果と理解した。

 

ついでに、塗り絵のお勉強とお遊び

描画エリア全体にメッシュ(グリッド)を作成し、そのメッシュに色を与える。

In [5]:
W = np.array([[ 1.03370118,  1.10345865, -2.13524878],
              [-2.32943088,  2.71627529, -0.39072902]])
b = np.array([[-0.01569868, -0.044992  ,  0.06069068]])
In [6]:
# plot the resulting classifier
h = 0.02 # この値を変えると、メッシュの数が変化する。
         # numpy.ndarray.min(axis = None, out = None)
         # (最小値を求めたい配列).min()の形で使います。
         #  X[:, 0]は、[(先頭から最後まで), 0]       
x_min, x_max = -0.5 - 1, 0.5 + 1
y_min, y_max = -0.5 - 1, 0.5 + 1
         # numpy.arange([start, ]stop, [step, ]dtype=None)
         # Return evenly spaced values within a given interval.
         # np.arange(x_min, x_max, h)→.....-1.5,-1.48,-1.46......1.46,1.48,1.5
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
                     np.arange(y_min, y_max, h))
         # Return coordinate matrices from coordinate vectors.
         #     
Z = np.dot(np.c_[xx.ravel(), yy.ravel()], W) + b  # xxもyyも描画面をすべて含む巨大な配列なので
         # 一次元のメッシュ配列に並びかえて、
         # メッシュの要素をデータとしてスコアを計算する
Z = np.argmax(Z, axis=1)  #計算したスコアで最大のものを、そのメッシュのクラスにする。
Z = Z.reshape(xx.shape)  # 配列を描画面に合わせて並び替える
fig = plt.figure()
sc=plt.contourf(xx, yy, Z, cmap=plt.cm.Spectral, alpha=0.8) # 等高線と塗りつぶし輪郭を 描きます。
         # contour([X, Y,] Z, [levels], **kwargs)
#plt.scatter(X[:, 0], X[:, 1], c=y, s=40, cmap=plt.cm.Spectral)# 散布図 (Scatter plot) を描く 
plt.xlim(xx.min(), xx.max())  # グラフの横軸、縦軸を調整する。
plt.ylim(yy.min(), yy.max())  # グラフの横軸、縦軸を調整する。
plt.colorbar(sc)             #カラーマップを表示してみた。  
#fig.savefig('spiral_linear.png')
Out[6]:
<matplotlib.colorbar.Colorbar at 0xe193b38>
 
In [7]:
# plot the resulting classifier
h = 0.5 # この値を変えると、メッシュの数が変化する。
         # numpy.ndarray.min(axis = None, out = None)
         # (最小値を求めたい配列).min()の形で使います。
         #  X[:, 0]は、[(先頭から最後まで), 0]       
x_min, x_max = -1.5 ,  1.5
y_min, y_max = -1.5 ,  1.5
xnn = (x_max - x_min) / h
ynn = (y_max - y_min) / h
pnn = int(xnn * ynn)
         # numpy.arange([start, ]stop, [step, ]dtype=None)
         # Return evenly spaced values within a given interval.
         # np.arange(x_min, x_max, h)→.....-1.5,-1.48,-1.46......1.46,1.48,1.5
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
                     np.arange(y_min, y_max, h))
         # Return coordinate matrices from coordinate vectors.
         #     
In [8]:
Z = np.array(range(pnn))
Z = Z.reshape(xx.shape)  # 配列を描画面に合わせて並び替える
In [9]:
#plt.rcParams['image.interpolation'] = 'spline16'
fig = plt.figure()
sc=plt.contourf(xx, yy, Z, cmap=plt.cm.Spectral, alpha=0.8) # 等高線と塗りつぶし輪郭を 描きます。
         # contour([X, Y,] Z, [levels], **kwargs)
#plt.scatter(X[:, 0], X[:, 1], c=y, s=40, cmap=plt.cm.Spectral)# 散布図 (Scatter plot) を描く 
#plt.xlim(xx.min(), xx.max())  # グラフの横軸、縦軸を調整する。
#plt.ylim(yy.min(), yy.max())  # グラフの横軸、縦軸を調整する。
plt.colorbar(sc)             #カラーマップを表示してみた。  
#fig.savefig('spiral_linear.png')
Out[9]:
<matplotlib.colorbar.Colorbar at 0xe274908>
 
In [10]:
sc2=plt.pcolor(xx, yy, Z, cmap=plt.cm.Spectral, alpha=0.8)
plt.colorbar(sc2) 
#ある点をプロットする時は、その要素とその次の要素で囲まれた領域を塗り潰します。
#例えば、5*5の行列をプロットしたいときは、x, yは6個の要素を持っている必要があります。
Out[10]:
<matplotlib.colorbar.Colorbar at 0xe5649e8>
 
In [11]:
# plot the resulting classifier
h = 0.5 # この値を変えると、メッシュの数が変化する。
x_min, x_max = -1.5 ,  2.0
y_min, y_max = -1.5 ,  2.0
xnn = (x_max - x_min) / h
ynn = (y_max - y_min) / h
pnn = int(xnn * ynn)
         # numpy.arange([start, ]stop, [step, ]dtype=None)
         # Return evenly spaced values within a given interval.
         # np.arange(x_min, x_max, h)→.....-1.5,-1.48,-1.46......1.46,1.48,1.5
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
                     np.arange(y_min, y_max, h))
         # Return coordinate matrices from coordinate vectors.
         # 
Z = np.array(range(pnn))
Z = Z.reshape(xx.shape)  # 配列を描画面に合わせて並び替える
fig = plt.figure()
sc=plt.contourf(xx, yy, Z, cmap=plt.cm.Spectral, alpha=0.8) # 等高線と塗りつぶし輪郭を 描きます。
         # contour([X, Y,] Z, [levels], **kwargs)
#plt.scatter(X[:, 0], X[:, 1], c=y, s=40, cmap=plt.cm.Spectral)# 散布図 (Scatter plot) を描く 
#plt.xlim(xx.min(), xx.max())  # グラフの横軸、縦軸を調整する。
#plt.ylim(yy.min(), yy.max())  # グラフの横軸、縦軸を調整する。
plt.colorbar(sc)             #カラーマップを表示してみた。 
Out[11]:
<matplotlib.colorbar.Colorbar at 0xe9b12b0>
 
In [12]:
sc2=plt.pcolor(xx, yy, Z, cmap=plt.cm.Spectral, alpha=0.8)
plt.colorbar(sc2) 
Out[12]:
<matplotlib.colorbar.Colorbar at 0x10cbf160>
 
In [13]:
# https://matplotlib.org/gallery/images_contours_and_fields/interpolation_methods.html?highlight=interpolation
plt.rcParams['image.interpolation'] = 'spline16'
sc3=plt.pcolor(xx, yy, Z, cmap=plt.cm.Spectral, alpha=0.8)
plt.colorbar(sc3) 
Out[13]:
<matplotlib.colorbar.Colorbar at 0x10f69208>
 
 

'image.interpolation'に関してはよくわからない。