Keras で ORの学習

import numpy as np
import keras
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense

model = Sequential()
model.add(Dense(input_dim=2, activation='relu', units=1))

model.compile(loss='mean_squared_error', optimizer='sgd', metrics=['accuracy'])

# データセット
x_train = [
    [0, 0],
    [0, 1],
    [1, 0],
    [1, 1],
]
# 正解ラベル
y_train = [[0],[1],[1],[1]]

model.fit(x_train, y_train, nb_epoch=10, batch_size=1)
score = model.evaluate(x_train, y_train, verbose=0)
print("test-accuracy: {}".format(score[1]))

シンプルなmnist (python3.5 chainer)

import chainer
import chainer.functions as F
import chainer.links as L
from chainer import training
from chainer.training import extensions

class MnistModel(chainer.Chain):
    def __init__(self, out_units):
        super(MnistModel,self).__init__(
                l1 = L.Linear(None, 100),
                l2 = L.Linear(None, 100),
                l3 = L.Linear(None, out_units))

    def __call__(self,x):
         h = F.relu(self.l1(x))
         h = F.relu(self.l2(h))
         return self.l3(h)


model = L.Classifier(MnistModel(out_units=10))
optimizer = chainer.optimizers.Adam()
optimizer.setup(model)

train, test = chainer.datasets.get_mnist()
train_iter = chainer.iterators.SerialIterator(train, 100)
test_iter = chainer.iterators.SerialIterator(test, 100,repeat=False, shuffle=False)

updater = training.StandardUpdater(train_iter, optimizer, device=-1)
trainer = training.Trainer(updater, (100, 'epoch'), out="result")
trainer.extend(extensions.Evaluator(test_iter, model, device=-1))
trainer.extend(extensions.LogReport())
trainer.extend(extensions.PrintReport(['epoch', 'main/loss', 'validation/main/loss', 'main/accuracy', 'validation/main/accuracy']))
trainer.extend(extensions.ProgressBar())
if extensions.PlotReport.available():
    trainer.extend(
        extensions.PlotReport(['main/loss', 'validation/main/loss'], 'epoch', file_name='loss.png'))
    trainer.extend(
        extensions.PlotReport(
            ['main/accuracy', 'validation/main/accuracy'], 'epoch', file_name='accuracy.png'))
    
trainer.run()

SQL メモ

重複しているカラムを持つレコード抽出

select email from users group by email having count(email) <> 1;

xcode KeyBindingSet カスタマイズ

手順としては

  1. ターミナルを開いて $ open /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources/IDETextKeyBindingSet.plist を打つ
  2. /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources/IDETextKeyBindingSet.plist を読み書き可能に変更
  3. /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources/ を読み書き可能に変更
  4. /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources/IDETextKeyBindingSet.plist を開いて追加したい内容書き込む
  5. xcode を再起動

新しいキーバインドの追加

/Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources/IDETextKeyBindingSet.plist を開いて、以下を入力

~省略~

<key>customized</key>
    <dict>
      <key>Delete Current Line</key>
      <string>deleteToBeginningOfLine:, moveToEndOfLine:, deleteToBeginningOfLine:, deleteBackward:, moveDown:, moveToBeginningOfLine:</string>
    </dict>
    <key>Edit</key>
    <dict>
      <key>Duplicate Line</key>
      <string>selectLine:, copy:, moveToEndOfLine:, insertNewline:, paste:, deleteBackward:</string>
    </dict>
</dict>
</plist>

として保存。

追加した内容を反映

xcodeを再起動して、preferences を開いて KeyBindings を開いて、検索フォームに、上でで指定した単語を調べる。 そしたら、項目が出てくるので、好きなキーバインドを入力して終わり。

Ruby で Python の virtualenv 的なことをする

PythonのvirtualenvをRubyでやる。

rbenv-gemset というツールで実現できます。

環境は Mac を想定。

rbenv, rbenv-gemset インストール

rbenv は Ruby のバージョン管理ツールです。

$ brew install rbenv ruby-build rbenv-gemset
$ rbenv -v
rbenv 1.0.0
$ rbenv gemset version
rbenv-gemset 0.5.9
by Jamis Buck <jamis@jamisbuck.org>
Currently maintained by Jeffrey 'jf' Lim <jfs.world@gmail.com>

http://github.com/jf/rbenv-gemset

Ruby インストール

rbenvを使ってRubyをインストールします。

$ rbenv install 2.2.5
$ rbenv versions
* system (set by /Users/hoge/.rbenv/version)
  2.2.5

マシン全体のRubyを2.2.5に変えます

$ rbenv global 2.2.5
$ rbenv versions
   system (set by /Users/hoge/.rbenv/version)
* 2.2.5

gem は初期状態で以下のものが入ってます。

$ gem list

*** LOCAL GEMS ***

bigdecimal (1.2.6)
io-console (0.4.3)
json (1.8.1)
minitest (5.4.3)
power_assert (0.2.2)
psych (2.0.8)
rake (10.4.2)
rdoc (4.2.0)
test-unit (3.0.8)

rbenv-gemsetを使って仮想環境の作成

何もせずに gem install するとマシン全体の Ruby 2.2.5 にどんどんインストールされてだんだん汚くなるので、プロジェクトごとに入れるものを分けたい。

まずはプロジェクトで使いたいRubyバージョンを決める。

rbenv local バージョン

でできる。

$ mkdir project
$ cd project
$ rbenv local 2.2.5
$ ruby -v
ruby 2.2.5p319 (2016-04-26 revision 54774) [x86_64-darwin16]

次に、仮想環境の作成を行う。仮想環境の名前を sample とする。

$ rbenv gemset create 2.2.5 sample
$ rbenv gemset init sample
$ ls -a
./              ../             .rbenv-gemsets  .ruby-version

これで完了。

汚れるかどうかの確認

まずはプロジェクト内の gem

$ pwd
/Users/hoge/project
$ gem list

*** LOCAL GEMS ***

bigdecimal (1.2.6)
io-console (0.4.3)
json (1.8.1)
minitest (5.4.3)
power_assert (0.2.2)
psych (2.0.8)
rake (10.4.2)
rdoc (4.2.0)
test-unit (3.0.8)

そして全体の gem

$ pwd
/Users/hoge
$ gem list

*** LOCAL GEMS ***

bigdecimal (1.2.6)
io-console (0.4.3)
json (1.8.1)
minitest (5.4.3)
power_assert (0.2.2)
psych (2.0.8)
rake (10.4.2)
rdoc (4.2.0)
test-unit (3.0.8)

どちらも同じ状態。

プロジェクト内で serverspec をインストールして後に gem を見てみます

$ pwd
/Users/hoge/project
$ gem install serverspec
$ gem list

*** LOCAL GEMS ***

bigdecimal (1.2.6)
diff-lcs (1.3)
io-console (0.4.3)
json (1.8.1)
minitest (5.4.3)
multi_json (1.12.1)
net-scp (1.2.1)
net-ssh (4.1.0)
net-telnet (0.1.1)
power_assert (0.2.2)
psych (2.0.8)
rake (10.4.2)
rdoc (4.2.0)
rspec (3.5.0)
rspec-core (3.5.4)
rspec-expectations (3.5.0)
rspec-its (1.2.0)
rspec-mocks (3.5.0)
rspec-support (3.5.0)
serverspec (2.38.0)
sfl (2.3)
specinfra (2.67.2)
test-unit (3.0.8)

いろいろ入りました。

そして、マシン全体の gem を見てみます。

$ pwd
/Users/hoge
$ gem list

*** LOCAL GEMS ***

bigdecimal (1.2.6)
io-console (0.4.3)
json (1.8.1)
minitest (5.4.3)
power_assert (0.2.2)
psych (2.0.8)
rake (10.4.2)
rdoc (4.2.0)
test-unit (3.0.8)

マシン全体のほうに serverspec がインストールされていない!!

これでちゃんとプロジェクト内が独立な環境になるようにできました。

よく使うインフラ系のコマンド

dstat

$ dstat -tcmdlnsg

ln

$ ln -s src dst

netstat

$ netstat -antup

随時更新する。

Pythonでのネストされた配列の展開 (Rubyでのflatten)

Rubyでのネストされた配列を展開して、1つの配列に詰め込むflattenメソッドをPythonでやる。

Rubyでの結果は以下

[1] pry(main)> a = [[1,2,],[3,4]]
=> [[1, 2], [3, 4]]
[2] pry(main)> a
=> [[1, 2], [3, 4]]
[3] pry(main)> a.flatten
=> [1, 2, 3, 4]

こんな感じに展開される。

これをPythonでやるには、itertools を使う。

In [1]: a = [[1,2],[3,4]]

In [2]: a
Out[2]: [[1, 2], [3, 4]]

In [3]: from itertools import chain

In [4]: chain.from_iterable(a)
Out[4]: <itertools.chain at 0x107ec5d30>

In [5]: list(chain.from_iterable(a))
Out[5]: [1, 2, 3, 4]

こんな感じ。