Tensorflowのチュートリアル備忘録 2017/11/21

Tensorflow
11 /22 2017
今日はTensorflowのチュートリアル(GET STARTED)にあるBuilding Input Functions with tf.estimatorのメモを書きます。
めっちゃ大雑把に書いていくので、必ず公式ホームページをチェックしてください。

このチュートリアルでは、機械学習に使われるAPI (tf.estimator)にデータを読み込ませるときに使われるinput_fnの使い方を知りましょうというのが主旨です。


ここからはCustom Input Pipelines with input_fnの項目です。

input_fnの基礎的な部分は以下のようになっています。
def my_input_fn():

# Preprocess your data here...

# ...then return 1) a mapping of feature columns to Tensors with
# the corresponding feature data, and 2) a Tensor containing labels
return feature_cols, labels
この関数内部では、質の悪いデータを取り除いたり、値を整えたりするなどの処理を記述するらしい。
そして、処理し終えたデータ(特徴量とラベル)を返してくれます。
feature_colsは辞書とよばれるキーと値を紐づけして格納するようなデータ型となっています。キーとなるのは特徴量の名前であり、値はその特徴量の値が入っているTensor(多次元配列的なやつ)となります。
labelsはラベルが入ります。トレーニングしたモデルはこのラベルを予想して、出力として出します。

データの配列の種類がいくつかあり、次の3つ、pythonにデフォルトで入っている配列、pandaと呼ばれるフレームワークで保存されている配列データ、numpyの配列の場合は以下のようなinput_fnを用いてモデルへの入力を作る。
numpyの場合は
import numpy as np
# numpy input_fn.
my_input_fn = tf.estimator.inputs.numpy_input_fn(
x={"x": np.array(x_data)},
y=np.array(y_data),
...)
となる。
pandaの場合は
import pandas as pd
# pandas input_fn.
my_input_fn = tf.estimator.inputs.pandas_input_fn(
x=pd.DataFrame({"x": x_data}),
y=pd.Series(y_data),
...)
となる。

もし、入力するデータの特徴量の値がほとんど0である場合、SparseTensorと呼ばれるものをinput_fnの代わりに用いるらしい。
このSparse Tensorを用いる場合はdense_shape、indices、valuesを入力する必要がある。
sparse_tensor = tf.SparseTensor(indices=[[0,1], [2,4]],
values=[6, 0.5],
dense_shape=[3, 5])
dense_shapeとはTensorのshapeを示すもので、これは多次元ベクトルの寸法みたいなもんです。
dense_shape=[9]は一次元の9個の要素を持った列ベクトル。dense_shape=[3,6]は2次元の3×6ベクトル(要素はTijみたいな感じ)。dense_shape=[2,3,4]は3次元の2×3×4べクトル(要素はTijkみたいな感じ)。
indicesはTensor内の0でない値をもつ要素の場所を示すもので、2次元ベクトルのi行j列目が値を持っていたとすると、[i, j]と書かれる。indices=[[1,3], [2,4]]と記述した場合は2次元ベクトルの内、1行3列目と2行4列目の要素が値を持つことを示している。
valuesは一次元のベクトルであり、そのサイズは値を持った要素の数(indicesの数)に対応している。
例えば、入力として2次元のSparse Tensorを用意して、そのTensorの3行7列目に14、5行2列目に3という値が入っていて、それ以外は0とすると、indices=[[3,7], [5,2]]と書け、values=[14, 3]と書ける。
上のコードの例に出てきた
sparse_tensor = tf.SparseTensor(indices=[[0,1], [2,4]],
values=[6, 0.5],
dense_shape=[3, 5])
の入力は
[[0, 6, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0.5]]
という2次元ベクトルで記述される。


ここから先はinput_fnをモデルに渡すときのお話です。

先ほどつくった入力データ読み込み処理をモデルのトレーニング処理に教えてあげます。
classifier.train(input_fn=my_input_fn, steps=2000)
ここで、読み込み処理はオブジェクトとして渡されていることに注意して下さい。
input_fn=my_input_fn
もし、input_fn=my_input_fn(training_set)のようにinput_fnになにかしらのものを渡したい場合は、
以下のようなwrapper functionも記述して使えばよいらしい。
def my_input_fn(data_set):
...

def my_input_fn_training_set():
return my_input_fn(training_set)

classifier.train(input_fn=my_input_fn_training_set, steps=2000)


今日はここまでです。

FreeCAD 備忘録 20171121

プログラミング
11 /21 2017
せっかくFreeCADをインストールしたので、遊んでみました。その時の備忘録です。

まずは、オープンソースの3D-CAD FreeCADを使うのウェブページにある機構のチュートリアルの歯車アニメーションに関するメモです。


リンク先の歯車アニメーションのウェブページにて操作の項目の1つ目の歯車...の画像をクリック。
これで1つ目の歯車の作り方のページに移る。
そこのページに書かれているように、Part Designを選んでから、新規作成をクリック。
メニューバー(ファイル、編集、...と表示されている部分)の中からPart Designを選び、その中のInvolute gearを選択。
歯数を28にしてOKをクリック。
モデルの1つ目の歯車(Involute gear)を選択した状態で、ツールバーの部品設計の中から”選択されたスケッチの押し出し”をクリック。
タスクの押し出しパラメーターのタイプを寸法にして長さを15 mmにしてからOKをクリック。

1つ前のページに戻ってから、今度は2つ目の歯車...の画像をクリック。
これで2つ目の歯車の作り方のページに移る。
1つ目と同じようにPart DesignからInvolute gearを選択。
歯数を74にしてOKをクリック。
モデルの2つ目の歯車を選択した状態で、ツールバーの部品設計の中から”選択されたスケッチの押し出し”をクリック。
タスクの押し出しパラメーターのタイプを寸法にして長さを12 mmにしてからOKをクリック。

1つ前のページに戻ってから、今度は2つの歯車を配置...の画像をクリック。
これで歯車をかみ合わせを作るページに移る。
モデルの1つ目の歯車(Pad)を選択してからCtrl+cでコピーする。この際に出てくるダイアログ(選択したオブジェクトは、選択されて...)ではいいえを選ぶ。
新しく作ったドキュメントを選択してからCtrl+vで貼り付け。
同じように2つ目も貼り付ける。
ツールバーの画面上のすべてのコンテンツにフィットをクリック。そうすると2つの歯車が表示される。
モデルで2つ目の歯車をクリックしてから、下に表示されるデータタブ(プロパティ、値)からPlacementを選択し、右端の”...”をクリック。
平行移動量Yに127.5を入力し、OKをクリック。
これで歯車のかみ合わせができます。

メニューバーからマクロを選択してから、”マクロ...”をクリック。
作成をクリックしてから、ファイル名を入力。
新しく開いた画面に以下のコードを張り付け。


import FreeCAD
from PySide import QtCore

i=0
def update():
global i
App.getDocument("MeishoMisette2").Pad001.Placement=App.Placement(App.Vector(0,127.5,0), App.Rotation(App.Vector(0,0,1),-i), App.Vector(0,0,0))
App.getDocument("MeishoMisette2").Pad.Placement=App.Placement(App.Vector(0,0,0), App.Rotation(App.Vector(0,0,1),i*(74.0/28.0)), App.Vector(0,0,0))
i +=0.01

timer = QtCore.QTimer()
timer.timeout.connect(update)
timer.start(1)

記入し終えたら、メニューバーのマクロからマクロの実行をクリックすれば、動きます。
画面は自動で変わらないので、MeishoMisette2の画面を選択してください。
あと、コードを書く際は関数内は右にずらしてください。


20171121_1.png


そして、止め方なのですが...、すみません、わかりません。いろいろ試したのですが、コンソールに直接書かない方法で止めるのはできませんでした。

今回はこんな感じです。
最後の方はウェブページとはちょっと違う方法でやってみました。

食後の雑談 20171121

未分類
11 /21 2017
今日は食後の眠気がひどいので、とりあえず記事を書いて眠気をしのごうと思います。

私は普段眠気を覚ます方法として以下のようなことをしています。

1.コーヒーを飲む。
2.FRISKやMINTIAなどのタブレットのスースーする奴を食べる。
3.息を20秒ほど止める。
4.目のマッサージを行う。
5.最終手段として顔を洗う。

コーヒーはやっぱり一番効きますね。ただし、カフェインを取りすぎるとカフェイン中毒になるかもしれないので、過剰摂取は避けています。
ミント系の菓子はコーヒーなどを飲めないときに使用しますね。
息を止める方法は、ミーティングで話を聞いているときなどの飲食ができず、あまり身動きができないときにやりますね。
ちなみに息をとめると眠気が覚めるのは、血液中の二酸化炭素濃度が上昇することで酸素を多く取り込もうと体が無意識のうちに反応するからだそうです。反射というやつです。二酸化炭素濃度が増えればよいということは、炭酸飲料水でも同じような効果が得られそうですね。
目のマッサージはずっとパソコンを使っているときなどにします。目を温めたタオルで温めるのも良いですよ。
顔を洗うのは最終手段ですね。冷たい水で顔を洗うと一気に眠気が覚めます。
以上に挙げた方法以外にも、指の先をマッサージしたりするのも効果的です。

とりあえず、これでおしまいです。

Scientific Linuxのrootによるリモートログインの制限に関する雑談

プログラミング
11 /20 2017
rootに関する話をしたので、ついでにリモートログイン時の話もざっとします。

/etc/securettyというファイルを編集することで、rootのログイン端末に制限をかけることが可能です。
ローカルの端末からのアクセスのみを残す場合はtty1~tty6までを残して、あとはコメントアウトにすればいいらしいです。
ファイルの中身はこんな感じになっています。

20171120_2.png

あくまでも、端末に対する制限なので、本格的にrootのsshログインを制限したい場合は/etc/ssh/sshd_configを変えろ的なことでした。
どうやら、そのファイルの中身にあるPermitRootLoginをコメントアウトを外してnoにすれば良いとのこと。

20171120_3.png

こんな感じにやっておきました。


セキュリティは奥が深いですね~

Scientific LinuxのGRUBメニューに関する雑談

プログラミング
11 /20 2017
これからはどんどんチャットボット以外のこと(マニアックなこと)を書いていこうと思います。

というわけで、今回はScientific Linux 7のGRUBメニューでシングルブートを試みた時に自動的にパスワードが要求されるようになったというお話をします。

まず、シングルブートについてざっと話します。
OS(Linux)にはランレベルというものがあり、0~6まであります。
・ 0は停止
・ 1はシングルユーザーモード
・ 2はマルチユーザーモード
・ 3はネットワーク有のマルチユーザーモード
・ 4は未定義
・ 5はX11が立ち上がる(グラフィカルに操作できる)
・ 6は再起動
ランレベル2以下ではネットワークにつながっていません。
シングルユーザーモードのシングルユーザーはroot(管理者)のことであり、それ以外のユーザーではログインできません。
シングルブートとはシングルユーザーモードでコンピューターを立ち上げるという意味です。(ブート(boot)=立ち上げ)
*今使っているLinuxのランレベルはターミナル上でrunlevelと打つと表示されます。

次に、GRUBメニューについて話します。難しいので適当に書きます。
GRUBとはブートローダと呼ばれるコンピューターを立ち上げるときに必要なものです。
ブートローダは英語ではboot loaderと書き、ハードディスクにあるOSの立ち上げプログラムを読み込んで、メモリに書き込むようなものらしいです。
GRUBは高性能なブートローダらしく、インストールした複数のOSから起動したいOSを選択出来たりします。
ここで、私が言っているGRUBメニューとはパソコン起動時に画面に表示されるOSを選択するメニューのことを指しています。
こんな画面です。

20171120_1.png

これはSL7のものです。


以前のSL6のバージョンでは、この場面で、OSを選んでから"e"を押して編集画面にうつり、
kernel /....みたいな感じで書いてある行にオプションを追加する感じで"single"と追加してから起動させると、
なんとパスワードを入力せずにそのままroot(管理者)になることができました。


あくまでもネットにつながっていない状態ですし、rootのパスワードを忘れた時にはかなり便利なのですが、セキュリティ的には問題ありです。
これを防ぐために/etc/inittabに~~:S:wait:/sbin/suloginみたいな行を追加したり、/boot/grub/grub.confにパスワードの行を設定していました。

しかしながら、SL7になってからは同じように"single"と追加してから起動した際にデフォルトでrootのパスワードを聞かれるようになっていました。
これで、インストールした際の手間が1つ省けたことになるわけですね。

今回は以上です。

シジミパワー

 ブログ初心者です。よろしくお願いします。

 チャットボットにこちらからアクセスできます。
 無料版のプラットホームを用いているので、会話数に制限があります。申し訳ございません。
 あと、開発中は応答しない場合があります。

 
 会話のトリガーはこちらのホームページに載せてあります。
 このページからでもチャットボットにアクセスすることができます。