MCCの計算

この指標は普通は使わない気がする。

class MCC:
    def conf(self, psp_true, psp_pred):
        """
        psp_true: shape = (n_data, 1) のarrayとして渡す
        """
        #==== epsp ==== 
        y_true = np.ravel(psp_true)
        y_pred = np.ravel(psp_pred)
        tp_epsp = (y_true >= 1) & (y_pred > 0)
        fp_epsp = (y_true <= 0) & (y_pred > 0)
        fn_epsp= (y_true >= 1) & (y_pred <= 0)
        tn_epsp = (y_true <= 0) & (y_pred <= 0)
        #==== ipsp ====
        y_true = np.ravel(psp_true)
        y_pred = np.ravel(psp_pred)
        tp_ipsp = (y_true < 0) & (y_pred < 0)
        fp_ipsp = (y_true >= 0) & (y_pred < 0)
        fn_ipsp = (y_true < 0) & (y_pred >= 0)
        tn_ipsp = (y_true >= 0) & (y_pred >= 0)
        #--------- For plot------------------
        self.tps = [tp_epsp.sum(), tp_ipsp.sum()]
        self.fps = [fp_epsp.sum(), fp_ipsp.sum()]
        self.fns = [fn_epsp.sum(), fn_ipsp.sum()]
        self.tns = [tn_epsp.sum(), tn_ipsp.sum()]
        # mcc = self.compute(tps, fps, fns, tns)
        
    def compute(self):
        mcc = 0
        for tp, fp, fn, tn in zip(self.tps, self.fps, self.fns, self.tns):
            if (tp+fp)*(tp+fn)*(tn+fp)*(tn+fn) == 0:
                return 0
            mcc += (tp*tn-fp*fn)/np.sqrt((tp+fp)*(tp+fn)*(tn+fp)*(tn+fn))
        return mcc/2

参考文献 Matthews, Brian W. "Comparison of the predicted and observed secondary structure of T4 phage lysozyme." Biochimica et Biophysica Acta (BBA)-Protein Structure 405.2 (1975): 442-451.

RaspiにDockerを入れる

作業

公式サイト

Redirecting…

に書いているとおりにしてインストール

Raspbian users cannot use this method!

For Raspbian, installing using the repository is not yet supported. You must instead use the convenience script.

と書いているのでスクリプトを使う。 Raspiにログインして、root userにしてから

# curl -fsSL https://get.docker.com -o get-docker.sh
# sh get-docker.sh

しかし、エラーが出る.いろんな解決法が出ているが、結局rebootするのでうまく行った。

# Executing docker install script, commit: f45d7c11389849ff46a6b4d94e0dd1ffebca32c1
+ sh -c apt-get update -qq >/dev/null
+ sh -c DEBIAN_FRONTEND=noninteractive apt-get install -y -qq apt-transport-https ca-certificates curl >/dev/null
+ sh -c curl -fsSL "https://download.docker.com/linux/raspbian/gpg" | apt-key add -qq - >/dev/null
Warning: apt-key output should not be parsed (stdout is not a terminal)
+ sh -c echo "deb [arch=armhf] https://download.docker.com/linux/raspbian stretch stable" > /etc/apt/sources.list.d/docker.list
+ sh -c apt-get update -qq >/dev/null
+ [ -n  ]
+ sh -c apt-get install -y -qq --no-install-recommends docker-ce >/dev/null
E: Sub-process /usr/bin/dpkg returned an error code (1)
root@da-vinci:/home/endo# apt-get autoremove
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 4 個。
1 個のパッケージが完全にインストールまたは削除されていません。
この操作後に追加で 0 B のディスク容量が消費されます。
docker-ce (5:19.03.5~3-0~raspbian-stretch) を設定しています ...
Job for docker.service failed because the control process exited with error code.
See "systemctl status docker.service" and "journalctl -xe" for details.
invoke-rc.d: initscript docker, action "start" failed.
 127 00:47:22 da-vinci systemd[1]: docker.service: Unit entered failed state.
 127 00:47:22 da-vinci systemd[1]: docker.service: Failed with result 'exit-code'.
dpkg: パッケージ docker-ce の処理中にエラーが発生しました (--configure):
 サブプロセス インストール済みの post-installation スクリプト はエラー終了ステータス 1 を返しました
処理中にエラーが発生しました:

rebootしてから

# apt-get install -y -q docker-engine
# curl -fsSL https://get.docker.com -o get-docker.sh
# sh get-docker.sh

するとうまく入るようだ.

# Executing docker install script, commit: f45d7c11389849ff46a6b4d94e0dd1ffebca32c1
+ sh -c apt-get update -qq >/dev/null
+ sh -c DEBIAN_FRONTEND=noninteractive apt-get install -y -qq apt-transport-https ca-certificates curl >/dev/null
W: APT had planned for dpkg to do more than it reported back (0 vs 4).
   Affected packages: docker-ce:armhf
+ sh -c curl -fsSL "https://download.docker.com/linux/raspbian/gpg" | apt-key add -qq - >/dev/null
Warning: apt-key output should not be parsed (stdout is not a terminal)
+ sh -c echo "deb [arch=armhf] https://download.docker.com/linux/raspbian stretch stable" > /etc/apt/sources.list.d/docker.list
+ sh -c apt-get update -qq >/dev/null
+ [ -n  ]
+ sh -c apt-get install -y -qq --no-install-recommends docker-ce >/dev/null
+ sh -c docker version
Client: Docker Engine - Community
 Version:           19.03.5
 API version:       1.40
 Go version:        go1.12.12
 Git commit:        633a0ea
 Built:             Wed Nov 13 07:36:04 2019
 OS/Arch:           linux/arm
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.5
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.12
  Git commit:       633a0ea
  Built:            Wed Nov 13 07:30:06 2019
  OS/Arch:          linux/arm
  Experimental:     false
 containerd:
  Version:          1.2.10
  GitCommit:        b34a5c8af56e510852c35414db4c1f4fa6172339
 runc:
  Version:          1.0.0-rc8+dev
  GitCommit:        3e425f80a8c931f88e6d94a8c831b9d5aa481657
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683
If you would like to use Docker as a non-root user, you should now consider
adding your user to the "docker" group with something like:

  sudo usermod -aG docker your-user

Remember that you will have to log out and back in for this to take effect!

WARNING: Adding a user to the "docker" group will grant the ability to run
         containers which can be used to obtain root privileges on the
         docker host.
         Refer to https://docs.docker.com/engine/security/security/#docker-daemon-attack-surface
         for more information.

docker-compose

$ git clone https://github.com/docker/compose.git
$ ./script/build/linux
$ cd dist
$ ./docker-compose-*** version

バイナリをbin以下にコピーする。

$ sudo cp docker-compose-Linux-armv7l /usr/local/bin/docker-compose
$ sudo chown root:root /usr/local/bin/docker-compose
$ sudo chmod 755 /usr/local/bin/docker-compose

参考ページ

Raspbian上にdockerインストールでエラーにもめげずCentOS動かした件 - Qiita

Docker comes to Raspberry Pi - Raspberry Pi

Redirecting…

起動

$ systemctl start docker
or
# 自動起動
$ systemctl enable docker

check

$ systemctl status docker

info

$ docker info

Docker command

download start

$ docker run --name some-nginx -d -p 8080:80 nginx

image

$ docker images

ps

$ docker ps

stop

$ docker stop some-nginx

delete

delete container

$ docker rm some-nginx

delete image

$ docker rmi nginx

Docker compose

コンテナ開始

$ docker-compose up

バックグラウンドで実行

$ docker-compose up -d

spike trainのファイルを読み込む

spike時刻がneuronごとに";"区切りで, 縦に並んで記録されている時にデータを読み込む

def load_data(filepath, format="list"):
    """
    ;区切りのデータをnumpyで扱える形に読み込む
    データはlistでここの要素はspike time
    """
    with open(filepath, "r") as f:
        lines = f.read()
        lines = lines.split(";")
    N_neuron = len(lines) - 1 # 最後は\nだけのデータのため
    print("neuron数は{}".format(N_neuron))
    spikes = []
    for index in range(N_neuron):
        spikes.append(np.array([x for x in lines[index].split("\n") if x],
                               dtype=np.float64))
        #print("Neuron {}-th spikes count : {}".format(index, len(spikes[index]))
        #     , end="")
    print("load {} neurons".format(index))

    if format=="ndarray":
        # listではなく, [neuron番号, spike time]のarrayにする
        # spike timeの順番にはしない
        spiketrain = []

        # spiketrainにspike timeを入れていく
        for i in range(N_neuron):
            # iをスパイクの数分だけ並べただけ
            indexes = [i for _ in range(len(spikes[i]))]
            spiketrain.append(np.vstack([indexes, spikes[i]]).T)
        spiketrain = np.vstack(spiketrain)

        return spiketrain

macOS エラーメモ: limits.h: No such file or directory

pythonのモジュールを作成する時にgccでエラーが出て止まった.

  • macOS 10.15.2
  • anaconda3-5.3.1をpyenvで入れている
limits.h: No such file or directory
error: command 'gcc' failed with exit status 1

のようなエラー.

原因はXcodegccとcondaのgccが入っていることによるエラー?らしい

$ which python
~./pyenv/../gcc

みたいに出てきた. anacondaのgccを消して, パスを直したら解決した. (pyenvで環境分けをしている)

$ conda uninstall gcc
$ pyenv rehash

ディレクトリのepsをpdfに変換する

shellで行います。 ファイル名がepsからpdfに変わったものとして出力させます。

ファイル名を取得して、ループで回します。

for var in `ls *eps`
do
  name=`basename $var .eps`
  echo $name.pdf
  epstopdf $var $name.pdf
done

keras: layerの初期化で値代入をする

Kerasでlayerにこちらから指定した初期値を入れて、固定する方法について書いてます。 一度学習したネットワークのconv層のfilterの一部だけを使用したいことがあったのでその時の記録です。

  • 初期値の代入はkeras.initializers.Constant()を利用する。
  • trainable=Falseにすればそれで固定できる

conv層を使うのを例としてあげる。Function APIを使用する。

from tensorflow.keras.layers import Input, Dense, Conv1D, Flatten, Reshape
from tensorflow.keras.models import Model

inputs = Input(shape=(100,))
hidden = Reshape((100, 1))(inputs)
hidden = Conv1D(3, 5,
                strides=1, padding='same',
                activation="relu", name="conv")(hidden)
hidden = AveragePooling1D(pool_size=kernel_size, strides=1, padding="same")(hidden)
hidden = Flatten()(hidden)
outputs = Dense(10, activation="relu")(hidden)
model = Model(inputs=inputs, outputs=outputs)

このモデルで1度計算したconv1Dのkernelを使いたいとする。 学習した後に、

kenels = sess.run(model.get_layer("conv").weights[0])
bias = sess.run(model.get_layer("conv").weights[1])

で固定したい値を得る。shapeさえあっていれば別の値でもいいですが、多分、numpyの方がいい。

from tensorlfow.keras.initilizers import Constant

inputs = Input(shape=(100,))
hidden = Reshape((100, 1))(inputs)
hidden = Conv1D(3, 5,
                strides=1, padding='same',
                activation="relu", name="conv",
                kernel_initializer=Constant(kernels),
                bias_intializer=Constant(bias),
                trainable=False)(hidden)
hidden = AveragePooling1D(pool_size=kernel_size, strides=1, padding="same")(hidden)
hidden = Flatten()(hidden)
outputs = Dense(10, activation="relu")(hidden)
model = Model(inputs=inputs, outputs=outputs)

とすれば学習済みのkernel, biasに固定できる