今年もいろいろ芽が出てきた。

どこになんの種を植えたか忘れてしまったのだが

ニンジン?


これはトマト。
去年落ちたプチトマトからぐんぐん芽が出てきた。

オクラ?


木々も若い緑の葉を繁らせてきた。

macOS 10.13 でサーバーのディレクトリをコマンドからマウントする方法のメモ。

 

open smb://(user_name)@(server_name)

 

とすると、そのサーバー内で接続できるディレクトリのリストを示したダイアログが表示される。

その中で接続したいディレクトリをコマンドに予め指定することもできる。

 

open smb://(user_name)@(server_name)/(dir_name) 

 

とすると、直接そのディレクトリがローカルマシンの /Voluems/ 以下にマウントされる。

これを Automator の "Application" としてダブルクリックで実行できるようにできる。

"Run Shell Script" に上述のコマンドを書いて保存する。

 

 

TeX で論文を書くときの引用文献リストの作成に bibtex を使う。

引用スタイルもいろいろあるが、Elsevier が提供している elsart-num.bst が使い勝手がいい。

ただ、著者が大勢いても全員の名前を出力してしまうので、場所をとってしまう。

著者が3名以上の場合は、筆頭著者 et al. としたいことがある。

 

そんなときのためにメモを残しておく。

elsart-num.bst の中の FUNCTION を書き換えるとよいそうだ。

http://sk.kuee.kyoto-u.ac.jp/ja/2009/08/bibtex-style/

に詳しく書かれており、参考にさせて頂いた。

 

--------------------------

FUNCTION {format.names}

{ 's :=

  #1 'nameptr :=

  s num.names$ 'numnames :=

  numnames 'namesleft :=

  numnames #3 >

  {

  #2 'namesleft :=

    { namesleft #0 > }

    { s nameptr "{f.~}{vv~}{ll}{, jj}" format.name$ 't :=

      nameptr #1 >

          { namesleft #1 >

            { ", " * t * }

            { " {\it et~al}." * }

          if$

        }

        't  

      if$

      nameptr #1 + 'nameptr :=

      namesleft #1 - 'namesleft :=

    }

  while$

  }

  {

    { namesleft #0 > }

    { s nameptr "{f.~}{vv~}{ll}{, jj}" format.name$ 't :=

      nameptr #1 >

      { namesleft #1 >

          { ", " * t * }

          { numnames #1 >

            { "" * }

            'skip$

          if$

          t "others" =

            { " et~al." * }

            { ", " * t * }

          if$

          }

        if$

        }

        't  

      if$

      nameptr #1 + 'nameptr :=

      namesleft #1 - 'namesleft :=

    }

  while$

  }

  if$

}

--------------------------

リモートにある Linux ホスト A に ssh はできるのに、scp と rsync ができなくなった。

ちょっと焦ったので、状況をメモしておく。

 

これまで 

 

ssh -p 60022 A 

scp -P 60022 local_file user@A:~/xx/remote_file

rsync -e "ssh -p60022" -auv local_dir/ user@A:~/xx/remote_dir/ 

 

というような使い方をしていた。

問題なく使えていたのだが、あるときから ssh 以外を実行したときに

パスワード入力後応答しなくなってしまった。

 

いろいろ検討した末、ホスト A で行ったある変更が問題だった。

 

他のホストでも使っている zsh を A でも自動で使えるようにするために

.bashrc の最後の行に zsh という行を追加したのだった。

ssh で A にログインしたときに、自動的に zsh が起動し便利なように。

 

ところがどういうわけか、これが悪さをしていた。

今まで通り bash で起動するようにしたら、scp も rsync も今まで通り使えるようになった。

 

ssh でログイン時は手動で zsh を起動する。

 

何か回避策もありそうだが、今はこのまま。

 

 

 

Linux CentOS で bash のターミナルで ls をすると日本語ファイル名が文字化けしてしまう。

 

$ ls

local    tmp           ??????????????????  ?????????  ??????

bin          scp      work           ??????????????????  ??????

data          storage  ??????????????????  ??????????????????  ??????

 

ターミナルの表示コードを UTF8 にしているのだが。

調べたところ --show-control-char というオプションをつければ良い。

 

$ ls --show-control-char

bin  data  local    scp  storage  tmp  work  ダウンロード   テンプレート   デスクトップ   ドキュメント   ビデオ    公開   画像   音楽

 

これだとファイルやディレクトリの色分けされないので、さらに --color をつけて

 

$ ls --show-control-char --color

bin  data  local  scp  storage  tmp  work  ダウンロード   テンプレート   デスクトップ   ドキュメント   ビデオ   公開   画像   音楽

 

とすると見やすくなる。

 

辞書型の出力文字列を辞書型に戻す ためのメモ。

 

辞書型のオブジェクトをプリントすると

{'His': 686, 'Ser': 814, 'Val': 63 }

というような文字列になる。

これを読み込んで、辞書型に戻したい。

 

そのときの方法。

 

 

import ast

 

dictstr = "{'His': 686, 'Ser': 814, 'Val': 63 }"

dictobj = ast.literal_eval(dictstr)

 

 

 

久しぶりに Chainer に戻ってみたところ v3.1 まで上がっていて、

これまでのコードでも多少の変更で動かなくはないが、新しい書き方が便利そうなので、

ちょっと勉強してみた。

 

例題として見つかるコードが mnist を使っているものが多く、

自分でデータを準備する方法が良くわらかなかったので、

とりあえず、2次関数の学習を例に取り組んでみた内容をメモとして残しておく。

 

以前に Chainer 1.x でしたのと同じ学習内容である。

 

1 x N x M x 1 の多層パーセプトロンを定義する。

入力はスカラー値 x、教師信号として x*x を使う。

 

学習用の x (-> train) と、評価用の x (-> test) を別々に作る。

 

train = np.array(range(-13,13,2), dtype=np.float32)

test = np.array(range(-10,10), dtype=np.float32)+0.5

 

dtype=np.float32 の numpy の array として作る。

教師データは x*x なので、

 

train_teacher = np.power(train,2)

test_teacher = np.power(test,2)

 

となる。

このままでは、[-13, -12, -11, ... ] という1次元の配列になっている。

これではニューラルネットの入力層に入力できない。

[ [-13], [-12], [-11], ... ] という形の2次元の配列に変換する。

reshape() を使って

 

train = train.reshape(len(train),1)

 

などとする。入力データも教師データも同様。

ニューラルネットの入力層に2ニューロンあれば、[ [x1, x2], .... ] という配列になる。

更に、chainer の TuppleDataset を用いて、教師データと組み合わせる。

 

train_set = tuple_dataset.TupleDataset(train, train_teacher)

test_set = tuple_dataset.TupleDataset(test, test_teacher)

 

最後にイテレータを作る。

 

batchsize = int(len(train)/2)

train_iter = Ch.iterators.SerialIterator(train_set, batchsize)

test_iter  = Ch.iterators.SerialIterator(test_set, args_batchsize, repeat=False, shuffle=False)

 

モデルやオプティマイザーを作るところは以前と同じ。

データのイテレータを使って updaterを、更にそれを使って trainer を作る。

 

updater = training.StandardUpdater(train_iter, mopt, device=-1)

trainer = training.Trainer(updater, (800, 'epoch'), out="result")

 

これで準備完了。

 

以下に、コードの全容を示す。

 

========================================

import numpy as np

import matplotlib.pyplot as plt

import chainer as Ch

import chainer.functions as F

import chainer.links as L

from chainer import training

from chainer.datasets import tuple_dataset

from chainer.dataset import convert

from chainer.training import extensions

 

 

######################

# Definitions

#

class MyMLP(Ch.Chain):

    train = False

    def __init__(self, n_unit_h1, n_unit_h2):

        super(MyMLP, self).__init__()

        n_input = 1

        n_output = 1

        with self.init_scope():

            # the size of the inputs to each layer will be inferred

            self.l1 = L.Linear(n_input, n_unit_h1)  # n_in -> n_units

            self.l2 = L.Linear(n_unit_h1, n_unit_h2)  # n_units -> n_units

            self.l3 = L.Linear(n_unit_h2, n_output)  # n_units -> n_out

 

    def __call__(self, x):

        h1 = F.dropout(F.sigmoid(self.l1(x)), ratio=0.05)

        h2 = F.dropout(F.sigmoid(self.l2(h1)), ratio=0.05)

        return self.l3(h2)

 

def test_plot(max, xx, mnn):

    xd1 = Ch.Variable(xx[0])

    xd2 = Ch.Variable(xx[1])

    yd1 = mnn(xd1)

    yd2 = mnn(xd2)

    zd1 = xd1*xd1

    zd2 = xd2*xd2

    #print yd

    plt.figure(figsize=(6, 6))

    plt.plot(xd1.data, yd1.data, 'o', color='b')

    plt.plot(xd2.data, yd2.data, 'o', color='r')

    plt.plot(xd1.data, zd1.data, '.', color='black')

    plt.plot(xd2.data, zd2.data, '.', color='black')

    plt.show()

 

def onedim(x):

    return x.reshape(len(x),1)

 

####################

# Data preparation

#

 

# Create data

train = np.array(range(-13,13,2), dtype=np.float32)

test = np.array(range(-10,10), dtype=np.float32)+0.5

 

train_teacher = np.power(train,2)

test_teacher = np.power(test,2)

 

train = onedim(train)

test  = onedim(test)

train_teacher = onedim(train_teacher)

test_teacher = onedim(test_teacher)

 

train_set = tuple_dataset.TupleDataset(train, train_teacher)

test_set = tuple_dataset.TupleDataset(test, test_teacher)

 

# Iterator

batchsize = int(len(train)/2)

train_iter = Ch.iterators.SerialIterator(train_set, batchsize)

test_iter  = Ch.iterators.SerialIterator(test_set, batchsize, repeat=False, shuffle=False)

 

 

###################################################

# Set up a neural network to train

# Classifier reports mean_squared_error loss at every iteration, 

# which will be used by the PrintReport extension below.

mnn = MyMLP(100, 160)

model = L.Classifier(mnn, lossfun=F.mean_squared_error)

#model.compute_accuracy = False

model.train = True

 

eval_model = model.copy()

eval_model.train = False

 

# Setup an optimizer

mopt = Ch.optimizers.SGD(0.0005)

mopt.setup(model)

 

updater = training.StandardUpdater(train_iter, mopt, device=-1)

trainer = training.Trainer(updater, (800, 'epoch'), out="result")

 

###################################################

# Learn

#

print "learn-------"

 

trainer.extend(extensions.Evaluator(test_iter, eval_model, device=-1))

#trainer.extend(extensions.dump_graph('main/loss'))

#trainer.extend(extensions.snapshot(), trigger=(10, 'epoch'))

trainer.extend(extensions.LogReport(), trigger=(10, 'epoch'))

#trainer.extend(extensions.PlotReport(['main/loss', 'validation/main/loss'], x_key='epoch', file_name='loss.png'))

#trainer.extend(extensions.PrintReport(['epoch', 'main/loss']))#, 'validation/main/loss', 'main/accuracy', 'validation/main/accuracy']))

trainer.extend(extensions.ProgressBar())

 

trainer.run()

 

print "learning finish---------"

 

with Ch.using_config('train', False):

    test_plot(10, [train,test], mnn)

 

この方法で学習200回目、400回目、800回目の結果を以下に示す。

青丸は学習に用いた x に対して、ニューラルネットが出力した値、

赤丸は学習には用いなかった x に対して、ニューラルネットが出力した値、

黒丸は x*x の正解。

学習の回数が増えるに従って、ニューラルネットワークの出力が x*x に近づいている様子がわかる。

 

200回目。

400回目。

800回目。

 

 

このモデルの中では、学習中はニューラルネットワーク内 dropout を使ったり、

評価するとき(グラフを書くとき)には dropout しないように

 with Ch.using_config('train', False):

を使ったりしている。

 
 
 

便利な macOS のキーボードショートカットのメモ

 

 

Command + Option + Esc : 強制終了アプリ選択画面を開く

 

Command + Option + Z : Siri 起動

 

Command + Option + Eject:スリープ

 

Command + Option + Shift + Q:即座にログアウト

 

Command + Shift + Q:ログアウト(確認ダイアログ有り)

 

Command + Control + Eject:アプリケーションを保存してから再起動

 

Command + Control + 電源ボタン:すぐ強制再起動

 

Command + Control + Q:ロックスクリーン

 

Control + Shift + Eject:ディスプレイをスリープ

Jupyter で python のみならず R をインタラクティブに使えるようになるとのことを聞いたので、早速試してみた。

MacOS High Sierra (10.13) で作業を行った。

ターミナル上で R を起動し、以下のコマンドを実行する。

 

> install.packages(c('repr', 'IRdisplay', 'evaluate', 'crayon', 'pbdZMQ', 'devtools', 'uuid', 'digest'))

> devtools::install_github('IRkernel/IRkernel')

> IRkernel::installspec()

 

そして、R を終了し、ターミナルで

 

jupyter notebook 

 

として実行する。画面右上の

 

New 

 

で開くメニューの中に R が表示されていれば成功。

{70200C8D-4641-4F81-B358-77B671A67A5D}

 

これは美味い!

 

スッキリ上品な味わい。
 
プーチン大統領が山口を訪れたときに饗された酒がこれ。
 
「東洋美人」という名前は、初代蔵元が亡くなった奥様を想って名付けられたのだそうだ。
 
ケースの箱からして綺麗かったので、箱も一緒に写真に。