2層のニューラルネットワークをスクラッチから実装

やりたいことは2階層のニューラルネットワークを実装して、猫なのか、猫じゃないなのかを判断するモデルを作ることです。CNN(畳み込みネットワーク)は使わず、スクラッチからNumpyでForward PropagationとBack propagationを実装します。 209枚の画像訓練データと50枚の画像テストデータを使います。 訓練データtrain_catvnoncat.h5とテストデータ test_catvnoncat.h5両方とも HDF5フォーマットです。 とりあえず訓練データを読み込んで中身を確認します。 import numpy as np import h5py train_dataset = h5py.File('./images/train_catvnoncat.h5', "r") print(list(train_dataset.keys())) 結果 ['list_classes', 'train_set_x', 'train_set_y'] 訓練データの画像セットとラベルをそれぞれ抽出します。訓練用の画像は209枚があって、どれも3つの色チャンネルで、 横 x 縦 64 x 64の画像です。 train_x_orig = np.array(train_dataset["train_set_x"]) # 訓練データ画像セット自体 train_y = np.array(train_dataset["train_set_y"]) # 訓練データ画像セットのラベル train_y = train_y.reshape(train_y.shape[0], -1).T print(train_x_orig.shape) print(train_y.shape) 結果: (209, 64, 64, 3) (1, 209) 訓練データと同様にテストデータを準備します。テストの画像データは50枚があって、どれも3つの色チャンネルで、 横 x 縦は 64 x 64の画像です。 test_dataset = h5py.File('./images/test_catvnoncat.h5', "r") test_x_orig = np.

Hugoに使われる数式のMarkdown

例1 $$ T = S((1 + \frac{E}{R})^{F} - 1) $$ $$ T = S((1 + \frac{E}{R})^{F} - 1) $$ 例2 $T = S((1 + \frac{E}{R})^{F} - 1)$ $T = S((1 + \frac{E}{R})^{F} - 1)$ 例3 $$ \begin{align} \dot{x} & = \sigma(y-x) \newline \dot{y} & = \rho x - y - xz \newline \dot{z} & = -\beta z + xy \end{align} $$ $$ \begin{align} \dot{x} & = \sigma(y-x) \newline \dot{y} & = \rho x - y - xz \newline \dot{z} & = -\beta z + xy \end{align} $$

(WIP)統計&機械学習&画像関連のメモ

Machine Learning If you suspect your neural network is over fitting your data, that is you have a high variance problem, one of the first things you should try probably is regularization. The other way to address high variance, is to get more training data that’s also quite reliable. Model developers tune the overall impact of the regularization term by multiplying its value by a scalar known as lambda (also called the regularization rate).

client-goでKubernetesのIngress Ruleを作る

JenkinsXのコマンドを検証しているうちに、うまく動作しない部分もあって、どうやってプログラムで、Ingress Ruleを作ること気になったので、ちょっとやってみました。 client-goライブラリを利用して、以下のようなKubernetesのIngress Ruleを作成します。 apiVersion: extensions/v1beta1 kind: Ingress metadata: name: ingress-rule-created-from-go namespace: default spec: backend: serviceName: nginx servicePort: 80 rules: - host: nginx.my.domain 上の情報に基づいて、Ingress Ruleを作成するのに以下のの情報を指定すると作成できます。 apiVersion kind metadata spec.backend.serviceName spec.backend.servicePort rules.host Ingress Ruleを作るのにGoのライブラリのドキュメントはかなり役に立っています。ドキュメントを参照して、必要なものを正しい形で指定すれば良いです。 package main import ( "fmt" v1beta1 "k8s.io/api/extensions/v1beta1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/clientcmd" "log" "os" "path/filepath" "reflect" ) func main() { // kubernetesの設定ファイルのパスを組み立てる kubeconfig := filepath.Join(os.Getenv("HOME"), ".kube", "config") config, err := clientcmd.BuildConfigFromFlags("", kubeconfig) if err !

JenkinsfileにPrivate Docker RegistryからイメージをPull

KubernetesクラスターにJenkinsXが構築されている。Jenkinsfileでパイプラインを実行する際に例えばプライベートのDocker RegistryからイメージをPullしてきたい場合、ログインせずにPullはできない。 例えば下のようなJenkinsfileがあったとして pipeline { agent { label 'jenkins-ruby' } stages { stage('CI Build and push snapshot') { when { branch 'PR-*' } steps { dir ('.') { container('ruby') { sh "docker pull my.private.docker.registry/projectX/app:latest" } } } } } post { always { cleanWs() } } } Pipelineが実行すると、下のようなエラー出てしまう。つまりログインできていないわけ。 + docker pull my.private.docker.registry/projectX/app:latest Pulling repository my.private.docker.registry/projectX/app:latest Error: image projectX/app:latest not found script returned exit code 1 このページを参照すると。JenkinsXはDocker Registry関連でjenkins-docker-cfgという名前のSecretを参照している。このSecretの中に正しいプライベートのDocker Registryの認証情報を入っていれば良い。

Golangでの並列処理サンプル

例1 1000個のgoroutineでsomekeyを更新するプログラムで、更新する際にsync.Mutexでロックをかける。 package main import ( "fmt" "sync" "time" ) type SafeCounter struct { v map[string]int mux sync.Mutex } func (c *SafeCounter) Inc(key string) { c.mux.Lock() c.v[key]++ c.mux.Unlock() } func (c *SafeCounter) Value(key string) int { c.mux.Lock() defer c.mux.Unlock() return c.v[key] } func main() { c := SafeCounter{v: make(map[string]int)} for i := 0; i < 1000; i++ { go c.Inc("somekey") } time.Sleep(time.Second) // 待たないとと、974, 949などの値が出てくる fmt.Println(c.Value("somekey")) } 例2 例1はtime.

kubectlでPodを作成のプロセス

kubectlでPodを作成する際に、Kubernetesの中で何か起こっているかをわかりやすく説明見つけたので、メモしておく。 https://medium.com/jorgeacetozi/kubernetes-master-components-etcd-api-server-controller-manager-and-scheduler-3a0179fc8186 kubectl writes to the API Server. API Server validates the request and persists it to etcd. etcd notifies back the API Server. API Server invokes the Scheduler. Scheduler decides where to run the pod on and return that to the API Server. API Server persists it to etcd. etcd notifies back the API Server. API Server invokes the Kubelet in the corresponding node. Kubelet talks to the Docker daemon using the API over the Docker socket to create the container.

DockerコンテナでEtcd3を動かす

ETCD 3.3.8をローカルのDocker コンテナとして動かす。 Etcdは二つのポートを使っている。 一つは2379番ポート、 もう一つは 2380番ポート。 2379はクライアント通信のため, 2380はEtcdサーバー間の通信のためである。 rm -rf /tmp/etcd-data.tmp && mkdir -p /tmp/etcd-data.tmp && \ docker rmi gcr.io/etcd-development/etcd:v3.3.8 || true && \ docker run \ -p 2379:2379 \ -p 2380:2380 \ --mount type=bind,source=/tmp/etcd-data.tmp,destination=/etcd-data \ --name etcd-gcr-v3.3.8 \ gcr.io/etcd-development/etcd:v3.3.8 \ /usr/local/bin/etcd \ --name s1 \ --data-dir /etcd-data \ --listen-client-urls http://0.0.0.0:2379 \ --advertise-client-urls http://0.0.0.0:2379 \ --listen-peer-urls http://0.0.0.0:2380 \ --initial-advertise-peer-urls http://0.0.0.0:2380 \ --initial-cluster s1=http://0.0.0.0:2380 \ --initial-cluster-token tkn \ --initial-cluster-state new docker exec etcd-gcr-v3.

KubernetesのServiceを監視するコントローラ

やりたいことはclient-goというオフィシャルのKubernetesのクライアントを利用して、KubernetesのServiceの作成、削除、更新を監視することです。 ファイル名: watch_service.go package main import ( "flag" "fmt" "github.com/golang/glog" "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/fields" "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/cache" "k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/util/homedir" "path/filepath" "time" ) func main() { var kubeconfig *string home := homedir.HomeDir() kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "optional) absolute path to the kubeconfig file") flag.Parse() config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig) if err != nil { glog.Fatal(err) } clientset, err := kubernetes.NewForConfig(config) if err != nil { glog.Fatal(err) } watchlist := cache.NewListWatchFromClient( clientset.CoreV1().RESTClient(), string(v1.ResourceServices), v1.

Jenkins XをKubernetesにインストールする際のコマンド

事前に用意しているKubernetesクラスターはIDCFクラウド上で作られている。Nginx Ingress ControllerとMetallbがインストール済み。Metallbを使うとLoadBalancer タイプのNginx Ingress Controller Serviceが作られる。 Jenkins XがこのLoadBalancer タイプのIngress Controllerが必要としている。 Jenkins XをKubernetesクラスターにインストールする際のコマンドは以下のようになる。 jx install \ --exposer='Ingress' \ --ingress-namespace='ingress-nginx' \ --ingress-service='ingress-nginx' \ --ingress-cluster-role='nginx-ingress-clusterrole' \ --ingress-deployment='nginx-ingress-controller' \ --namespace='jx' \ --provider='kubernetes' \ --default-environment-prefix='ravengeode' --git-api-token='xxxxxxxxxxxxxxxxxxxx' --git-api-tokenオプションは下のリンクから作成することができる。 https://github.com/settings/tokens/new?scopes=repo,read:user,read:org,user:email,write:repo_hook,delete_repo