Google Cloud Platformではじめる機械学習と深層学習を読む

7-7ニューラルネットワークの実装

# パッケージの読み込み
import tensorflow as tf
import numpy as np
import pandas as pd

# BigQueryクエリ結果をDataFrameに読み込む
query = 'SELECT * FROM testdataset.wdbc ORDER BY index'
dataset = pd.read_gbq(project_id='my-project-test-189202', query=query)
print(dataset.info())
# データの先頭5行を表示
dataset.head()

フィールドが32,行が569
f:id:bitop:20171228150911p:plain

from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split

# 'M'を0, 'B'を1に変換
dataset['diagnostic'] = dataset['diagnostic'].apply(
    lambda x: 0 if x == 'M' else 1)

# 'index'カラムを削除
dataset.drop('index', axis=1, inplace=True)

# DataFrameからarrayに変換
# diagnosticは正解なので訓練データには不要
# as_matrix()はnumpy arrayに変換する
X_dataset = dataset.drop('diagnostic', axis=1).as_matrix()
y_dataset = dataset.diagnostic.as_matrix()

# 学習用とテスト用にデータセットを分ける(testは20%)
X_train, X_test, y_train, y_test = train_test_split(
    X_dataset, y_dataset, test_size=0.2, random_state=42)

#X_train,X_testを正規化している
scaler = MinMaxScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

NUM_FEATURES = 30
NUM_UNITS_H1 = 4
NUM_UNITS_H2 = 4
NUM_CLASSES = 2

# 初期化
tf.reset_default_graph()

with tf.Graph().as_default():
    # 入力層
    #フィールド数が30のデータをXとする
    X = tf.placeholder(tf.float32, shape=[None, NUM_FEATURES], name="X")
    #教師データ
    y = tf.placeholder(tf.float32, shape=[None, ], name="y")

    # 隠れ層1
    #30の重み係数と4つの出力をもつ隠れ層。活性化関数はrelu
    w1 = tf.Variable(tf.truncated_normal(
        [NUM_FEATURES, NUM_UNITS_H1], stddev=0.1), name='w1')
    b1 = tf.Variable(tf.zeros([NUM_UNITS_H1]), name='b1')
    h1 = tf.nn.relu(tf.matmul(X, w1) + b1)

    # 隠れ層2
    #4の重み係数と4つの出力を持つ。活性化関数はrelu
    w2 = tf.Variable(tf.truncated_normal(
        [NUM_UNITS_H1, NUM_UNITS_H2], stddev=0.1), name='w2')
    b2 = tf.Variable(tf.zeros([NUM_UNITS_H2]), name='b2')
    h2 = tf.nn.relu(tf.matmul(h1, w2) + b2)

    # 出力層
    #重み係数は4つで出力は2(M,B)
    w3 = tf.Variable(tf.truncated_normal(
        [NUM_UNITS_H2, NUM_CLASSES], stddev=0.1), name='w3')
    b3 = tf.Variable(tf.zeros([NUM_CLASSES]), name='b3')
    logits = tf.matmul(h2, w3) + b3

    # 損失
    # 損失関数は交差エントロピー
    onehot_labels = tf.one_hot(indices=tf.cast(y, tf.int32), depth=NUM_CLASSES)
    cross_entropy = tf.nn.softmax_cross_entropy_with_logits(
        labels=onehot_labels, logits=logits, name='xentropy')
    loss = tf.reduce_mean(cross_entropy, name='xentropy_mean')

    # 損失を最小化
    # 最適化手法はAdamOptimizer
    train_op = tf.train.AdamOptimizer(0.01).minimize(loss)

    # テスト用の正解率演算オペレーション
    correct_prediction = tf.equal(
        tf.argmax(logits, 1), tf.argmax(onehot_labels, 1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
    #セッション開始
    with tf.Session() as sess:
        #変数の初期化
        sess.run(tf.global_variables_initializer())

        for step in range(1000):
            _, loss_value = sess.run([train_op, loss],
                                    feed_dict={X: X_train, y: y_train})
            if step % 100 == 0:
                print('Step: %d, Loss: %f' % (step, loss_value))
        # テストデータで精度を確認
        _a = sess.run(accuracy, feed_dict={X: X_test, y: y_test})
        print('Accuracy: %f' % _a)

f:id:bitop:20171228151149p:plain

正解率は95.6%
隠れ層の出力は2層とも4であったがこの大きさで正解率が異なるのか
試してみた。
4 = 0.956
5 = 0.938
6 = 0.938
7 = 0.947
8 = 0.947
9 = 0.947
10 = 0.948
4が最適のようだが

Google Cloud Platformではじめる機械学習と深層学習を読む

3-4 Cloud Natural Language API

3-4-2 エンティティ分析
from google.cloud import language

nl_client = language.Client()
# 解析する文章
text = u'六本木ヒルズにあるGoogleのオフィスには山手線駅名の会議室があります。'
document = nl_client.document_from_text(text)
print(type(document))
# エンティティ分析を実行
response = document.analyze_entities()

# 結果の表示
for entity in response.entities:
    print('=' * 20)
    print(u'   単語: {}'.format(entity.name))
    print(u'   種類: {}'.format(entity.entity_type))
    print(u'メタデータ: {}'.format(entity.metadata))
    print(u'  重要度: {}'.format(entity.salience))

f:id:bitop:20171226181323p:plain

3-4-3 感情分析

食べログの「くちこみ」テキストを感情分析させそのスコアと 評価点との相関関係をプロットした。 12人しか調べていないので正しいのか不明

# NL API クライアントライブラリをインポート
from google.cloud import language

# クライアントのインスタンスを作成
nl_client = language.Client()
# 解析する文章
data = [
    {
    "user":"user_name",
    "score":3.5,
    "text":"XXXXXXX"
    },
    ......
]

x = []
y = []
z = []
for d in data:
    document = nl_client.document_from_text(d["text"])
    response = document.analyze_sentiment()
    sentiment = response.sentiment
    x.append(d["score"])
    y.append(sentiment.score)
    z.append(sentiment.magnitude)
    print("score=%f magnitude=%f" % (sentiment.score,sentiment.magnitude))
    print("taberogu score %f" % d["score"])

import matplotlib.pyplot as plt

fig = plt.figure()
ax1 = fig.add_subplot(211)
ax1.scatter(x,y)
w = [i*j for i,j in zip(y,z)]
ax2 = fig.add_subplot(212)
ax2.scatter(x,w)
plt.show()

f:id:bitop:20171227091552p:plain
食べログの評価値と口コミの感情ポジティブ値の散布図
ほぼ相関がありそうであるが感情ポジティブ値が低いのに
食べログの評価値が高い人もいてきれいな相関はなかった。
f:id:bitop:20171227092121p:plain
食べログの評価値と口コミの感情ポジティブ値×感情の強度を
掛け合わせた値の散布図もつくった。
f:id:bitop:20171227092147p:plain

Google Cloud Platformではじめる機械学習と深層学習を読む

3-3 Cloud Translation API

3-3-2 日本語を英語に翻訳
# クライアントライブラリのロード
from google.cloud import translate

# クライアントのインスタンスを作成
translate_client = translate.Client()

# 翻訳したい文章
text = u'GCPで機械学習が簡単に学べました。'
# 翻訳先言語
target = 'en'

# APIを実行
translation = translate_client.translate(
    text,
    target_language=target)

print(u'翻訳元: {}'.format(text))
print(u'翻訳後: {}'.format(translation['translatedText']))
print(u'input: {}'.format(translation['input']))

f:id:bitop:20171226173932p:plain

Google Cloud Platformではじめる機械学習と深層学習を読む

3-2 Cloud Vision API

3-2-2 画像のラベル検出
from google.cloud import vision
from google.cloud import translate
#visionクライアントのインスタンス
vision_client = vision.Client()
#translateクライアントのインスタンス
translate_client = translate.Client()

#ファイルを指定
image = vision_client.image(filename='../gcpml-book/Part1/seagull.jpg')
#ラベルつけ
labels = image.detect_labels()
#答えの一部を翻訳(参考URL https://www.apps-gcp.com/machinelearning-api-translate/)
print('Labels:')
for label in labels:  
print('Score:%f,Label:%s(%s)' % (label.score,label.description,translate_client.translate(label.description,source_language = 'en',target_language='ja')['translatedText']))

f:id:bitop:20171226170905p:plain

3-2-3 顔検出
image = vision_client.image(filename='face.jpg')

# 顔検知を実行
faces = image.detect_faces(limit=20)

# 感情の推定結果をprint
for face in faces:
    print(face.joy)
    print(face.anger)
    print(face.sorrow)
    print(face.surprise)

"""
感情を推定している
    print(face.joy) joy:喜び
    print(face.anger) anger:怒り
    print(face.sorrow) sorrow:悲しみ
    print(face.surprise) surprise:驚き

1人目
Likelihood.VERY_LIKELY VERY_LIKELY:可能性が非常に高いー>喜んでいる可能性がたかいといっている
Likelihood.VERY_UNLIKELY 
Likelihood.VERY_UNLIKELY
Likelihood.VERY_UNLIKELY

2人目
Likelihood.VERY_LIKELY
Likelihood.VERY_UNLIKELY
Likelihood.VERY_UNLIKELY
Likelihood.VERY_UNLIKELY

3人目
Likelihood.VERY_LIKELY
Likelihood.VERY_UNLIKELY
Likelihood.VERY_UNLIKELY
Likelihood.VERY_UNLIKELY

4人目
Likelihood.VERY_LIKELY
Likelihood.VERY_UNLIKELY
Likelihood.VERY_UNLIKELY
Likelihood.VERY_UNLIKELY

5人目
Likelihood.POSSIBLE 可能
Likelihood.VERY_UNLIKELY
Likelihood.VERY_UNLIKELY
Likelihood.VERY_UNLIKELY
"""   

f:id:bitop:20171226171317p:plain

3-2-4 ランドマーク検出
image = vision_client.image(filename='sydney.jpg')

# ランドマークを抽出
landmarks = image.detect_landmarks()

for landmark in landmarks:
    print(landmark.description)
    print(landmark.locations[0].latitude, landmark.locations[0].longitude)

f:id:bitop:20171226171517p:plain

OCR(テキスト検出)

f:id:bitop:20171226172313p:plain

image = vision_client.image(filename='text.jpg')

# OCRを実行
texts = image.detect_text()

# 読み取ったテキストをprint
for text in texts:
    print(text.description)

f:id:bitop:20171226172435p:plain

Google Cloud Platformではじめる機械学習と深層学習を読む

2-4 Datalabで様々なグラフ描画

!bq load --autodetect testdataset.tips ../datasets/tips.csv
import pandas as pd

query = """
SELECT * FROM testdataset.tips
"""

df=pd.read_gbq(project_id='my-project-test-189202',query=query)
df.head()

f:id:bitop:20171225043348p:plain

df.plot()

f:id:bitop:20171225043440p:plain

df.plot(kind="scatter",x="total_bill",y="tip")

f:id:bitop:20171225043523p:plain

#散布図+回帰直線
import seaborn as sns

sns.lmplot(data=df,x='total_bill',y='tip')

f:id:bitop:20171225043613p:plain

#カーネル密度推定
sns.kdeplot(df.total_bill,df.tip)

f:id:bitop:20171225043701p:plain

#total_billの分布
#やや左より
sns.distplot(df.total_bill)

f:id:bitop:20171225043821p:plain

#tipの分布
#あまりきれいではない
sns.distplot(df.tip)

f:id:bitop:20171225043920p:plain

corr = df.corr()
sns.heatmap(corr)

f:id:bitop:20171225044015p:plain

sns.pairplot(df,hue="time")

f:id:bitop:20171225044114p:plain

Google Cloud Platformではじめる機械学習と深層学習を読む

2-3 DatalabとBigQueryの連携

2-3.-2 クエリをDatalabから実行
!bq mk testdataset
!bq load testdataset.names ../datasets/name.csv ../datasets/schema.json

%%bq query
SELECT 
name,count
FROM 
testdataset.names
WHERE
state = 'CA' AND gender = 'F'
ORDER BY
count DESC
LIMIT 5

[f:id:bitop:20171224140708p:plain]
2-3-3 クエリ結果をチャートにプロット
%%bq query --name popular_names
SELECT 
name,count
FROM 
testdataset.names
WHERE
state = 'CA' AND gender = 'F'
ORDER BY
count DESC
LIMIT 10

f:id:bitop:20171224140948p:plain

%%bq query --name count_by_state
SELECT 
state,SUM(count) as sum_count
FROM 
testdataset.names
GROUP BY
1
ORDER BY
2 DESC

%chart geo --data count_by_state
{"region":"US","resolution":"provinces"}

f:id:bitop:20171224141126p:plain

Interface2017-12号第三章メカニズム実験 それらしい写真を自動生成する人工知能

10,000ステップの学習に戻し再度実行
1日と1時間で終了 
食べ物ではないなにかかな

f:id:bitop:20171202081447p:plain

動画にもしてみる
ffmpegにかけるためファイル名を連番にリネームする

#code:rename.py

import glob
import os

fl = glob.glob("*.jpg")
count = 0
for f in sorted(fl):
  s = '{0:0>5}.jpg'.format(count)
  os.rename(f,s)
  count = count + 1

シエルで動画に変換    
$ffmpeg -i %05d.jpg -r 5 -s 100x100 sample.avi