TensorFlow入門-関数メモ2018年3月28日

TensorFlow入門-関数メモ

まずははじめに〜



import tensrflow as tf
sess = tf.Session()


関数はABC順で記録しています!

テンソルの次元間の要素の最大値のインデックスを返す、tf.argmax

単純に要素の最大値を参照したい場合は、tf.reduce_maxを使います。



>>> x = tf.constant([[1.,8.],[2.,1.],[3.,7.]])
>>> sess.run(tf.argmax(x[1]))
0

値を指定したtypeへ変換する、tf.cast()



>>>x = tf.constant([16.1,10.4,0.9],dtype=tf.float32)
>>>sess.run(tf.cast(x,tf.int32))#整数へ変換
array([16, 10,  0], dtype=int32)
>>> sess.run(tf.cast(x,tf.bool))#真偽値へ変換
array([ True,  True,  True])

>>> x =  tf.constant([ False,  True,  True])#真偽値から変換
>>> sess.run(tf.cast(x,tf.float32))#浮動小数点へ
array([0., 1., 1.], dtype=float32)


条件分岐したい、tf.cond()




ふたつの要素が同じかどうかbool値で返す、tf.equal()



>>>a = 1
>>>b = 1
>>>c = 2

>>>sess.run(tf.equal(a,b))
True
>>>sess.run(tf.equal(a,c))
False


テンソルの形状に1の次元を挿入する、tf.expand_dims

第一引数に変数や定数を、第二引数には次元を挿入する箇所(インデックス)を指定



>>> a = tf.constant(0.,shape=[2,3])
>>> a

>>> tf.expand_dims(a,0)

>>> a


>>> b = tf.expand_dims(a,2)
>>> b


>>> sess.run(b)
array([[[0.],
        [0.],
        [0.]],

       [[0.],
        [0.],
        [0.]]], dtype=float32)

>>> sess.run(a)
array([[0., 0., 0.],

       [0., 0., 0.]], dtype=float32)


なんだかよく分かりませんね…
ちなみに、tf.squeeze()が反対のような働きをしてくれます。

逆行列の計算、tf.matrix_inverse





テンソルの次元間の要素の最大値を返す、tf.reduce_max

こちらは、最大値を返します。インデックスを参照したい場合はtf.argmaxを使います。



>>> x = tf.constant([[1.,8.],[2.,3.],[3.,7.]])
>>> sess.run(tf.reduce_max(x))
8.0
>>> sess.run(tf.reduce_max(x[1]))
3.0

合計値の平均をとる、tf.reduce_mean



>>>x = tf.constant([[1.,8.],[2.,3.],[3.,7.]])
>>>sess.run(tf.reduce_mean(x))
4.0


テンソルの形(shape)から1を削除,tf.squeeze()



>>> a = tf.constant(3.,shape=[1,2,2,1])
>>> a

>>> sess.run(a)
array([[[[3.],
         [3.]],

        [[3.],
         [3.]]]], dtype=float32)
>>> b = tf.squeeze(a)
>>> b

>>> sess.run(b)
array([[3., 3.],
       [3., 3.]], dtype=float32)


すべての要素がゼロに設定されたテンソルを作成する、tf.zeros()



>>>zero_tsr = tf.zeros([3,3])
>>>zero_tsr


>>>sess.run(zero_tsr)
array([[0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.]], dtype=float32)

TensorFlowについてとても分かりやすかったブログ

グラフの出力、表示

https://qiita.com/FukuharaYohei/items/7ea120005f73cf882146

変数、Variableについて

https://deepage.net/tensorflow/2017/06/02/tensorflow-variable.html

畳み込み(CNN)について、conv

https://qiita.com/FukuharaYohei/items/702eb2430ee9dfbe763a

プログラミングコンテスト・チャレンジブックのコードをPythonにしたメモ2017年12月24日

マイナビのプログラミングコンテスト チャレンジブックでアルゴリズムを勉強中!

この本はC++でコードが書かれているので、勉強がてらPython3で書き直した時のメモ。

こちらの本とは微妙にアルゴリズムが違っている場合もあるかもしれないですが、悪しからず。

more »

Python 文字列(str)が整数(int)に変換できるのかどうか調べる2017年12月23日

数ヶ月ぶりにPythonの勉強をしていたところ、int(整数)とstr(文字列)の取り扱いでつまずいたのでメモ。

PHPではintとstrの処理をほとんど自動で変換できたので、それに慣れてしまうとPythonでは些細なところでつまずいてしまう。

今回使用したのは”isdigit()”メソッドです。
more »

Python3 文字列を分解するには?また、文字列を連結するには?2017年9月21日

[文字列]
‘12345’
‘abcde’

[‘1′,’2′,’3′,’4′,’5’]
[‘a’,’b’,’c’,’d’,’e’]
にするには、

スライス(?)
空リストを作ってforループして.appendで送り込む(?)
少し悩んでしまった。。


strings = '1234567890'  #strings(変数)に文字列を代入
strings = list(str)     #リスト関数を使う
print(strings)     
#['1','2','3','4','5']と出力される

【注意点】
文字列でなくてはいけない、INT(数値)ではエラーになってしまう。

さらに戻してみたい。


strings = ['1','2','3','4','5']
strings = ''.join(s) #joinメソッド(クォーテーションの間の文字で結合する、この場合は無白)
print(strings)  #'12345'と出力

成功!

Python3【文字列の置き換え】replace translate maketrans2017年9月21日

Python3 文字列の置換

 

>>>strings = "I have a pen!" #変数に文字列を代入
>>>strings = strings.replace("pen","apple") 
#.replace()で、"pen"→"apple"
>>>strings
'I have a apple!' #正確には、"an apple"ですね‥
1 2 3 4 5 6 7 8 9 0

例えば、”351870351870″という文字列があったとして、
上の表に対応して上段の数字をそれぞれ、その下の文字へ置き換えたい。

>>>strings = "351870351870" #変数に文字列を代入

>>>before = "1234567890"        #表の文字列の順に
>>>after = "ばろごよるへょちりふ"   #変数に文字列を代入

>>>strings.translate(str.maketrans(before, after))
'ごるばちょふごるばちょふ'

.translate()の引数に、
str.maketrans(変換前の文字列,変換後の文字列)としてあげます。

 

【関連記事】PHPの場合は、str_replace()

Python3 mathモジュール【三角関数】sinθ cosθ tanθ 【弧度法】2017年9月21日

mathモジュールをインポートして三角関数の計算をしてみました。

>>>import math

>>>math.sin(90)
0.8939966636005579
>>>math.tan(45)
1.6197751905438615

あれれ‥

sinθ01/21/√2√3/21

 
θ 0 π/6 π/4 π/3 π/2
cosθ 1 √3/2 1/√2 1/2 0
tanθ 0 1/√3 1 √3

ちなみに、上の表は弧度法で sin cos tan を書いたもの。
2πラジアン=360°
πラジアン= 180°
π/2ラジアン=90°
π/4ラジアン=45°

要するに、mathで sin cos tan を計算したいときは、
math.radians()を使って弧度法をつかうらしい。
radiansを使わないと度数法で計算されてしまうんですね。

180° = 3.14(ラジアン) = π(ラジアン)


>>>math.sin(math.radians(90))
1.0
>>>math.tan(math.radians(45))
0.9999999999999999
>>>math.sin(math.radians(0))
0.0
>>>math.tan(math.radians(90))
1.633123935319537e+16

あれれ‥
tan45 = 0.9999999999999999
tan90°が計算できてしまった‥

tanθ = sinθ/cosθ
cos90° = 0
だから、tan90°は計算できないって習ったのだが‥
おそらく、便宜的なものだと思うのですが‥
ご存知の方、いらっしゃったら教えてください!

Python3【 round関数】四捨五入がうまくいかない。2017年9月21日

Python2では、round関数を使えばふつうに四捨五入ができるらしいが、
Python3へのバージョンアップで、round関数の仕様に変更があったらしく,

>>>round(2.5)
2

>>>2.51
>>>2.500001
などの場合は、普通に
3
となる。
どうやら境界値はここにあるらしい。

これを解消する方法としては、


round = lambda x:(x*2+1)/2

と、lambda構文を使う方法があるらしい。
上記のコードを入力後ならば、
>>>round(2.5)
3.0
となる。
(この場合のroundはlambdaを使って関数オブジェクトを
roundという変数に格納しているので、roundでなくてもよい。)

 

 

round関数を使い、位を指定し四捨五入


pi = 3.14159265 #piに代入
round(pi,2) #2番目の引数に小数点以下の表示させたい位を入力
print(pi) #3.14と出力
round(pi,7)
print(pi) #3.1415927

小数点以下の場合は、偶数に近い場合の5でも、
普通に四捨五入になりました。


fuji = 3776
round(fuji,-2) #マイナスにすれば、整数の位で調整できる。
print(fuji) #3800と出力される

x = 25
round(x,-1)
print(x)
 #20と出力される。

整数の位で四捨五入した場合はやはり,
偶数が近かった場合の5は切り捨てになってしまう。

python.jpのドキュメントより引用。

【round(number[, ndigits])】
number を小数点以下 ndigits 桁に丸めた浮動小数点数の値を返します。 ndigits が省略されたかもしくは None だった場合、入力に最近接の整数を返します。 number.__round__(ndigits) に処理を委譲します。round() をサポートする組み込み型では、値は 10 のマイナス ndigits 乗の倍数の中で最も近いものに丸められます; 二つの倍数が同じだけ近いなら、偶数を選ぶ方に (例えば round(0.5) と round(-0.5) は両方とも 0 に、 round(1.5) は 2 に) 丸められます。返り値は 1 引数で呼ばれたなら整数、そうでなければ number と同じ型です。注釈 浮動小数点数に対する round() の振る舞いは意外なものかもしれません: 例えば、 round(2.675, 2) は予想通りの 2.68 ではなく 2.67 を与えます。これはバグではありません: これはほとんどの小数が浮動小数点数で正確に表せないことの結果です。詳しくは 浮動小数点演算、その問題と制限 を参照してください。

 

えっ!?


>>>round(2.675, 2)
2.67

になってしまうの‥
ややこしいですね‥

【mathモジュール】ceil floor 切上げ 切下げ

 

【ceil()】【floor】は四捨五入ではなく、数値の切上げと切下げ(切捨て)。
消費税などは一般的には小数点以下切捨てですね。
(税法上は定まっていないらしいですが。)

切上げ、切下げも四捨五入と同じく、
Python標準ライブラリーにあるmathモジュールを使っていきたいと思います。

>>>import math #mathをインポート

>>>x = 105.84 #変数に代入
>>>math.floor(x)
105      #切下げ成功

>>>math.ceil(x)
106          #切上げ成功

ceil floor はあくまで整数を返すようで位は指定できませんでした。