AI勉強会 課題2 CNNを使った画像認識

CNNを使った画像認識

この課題では、CNNで、画像認識の基本を勉強するために試作する。プログラムはシンプルなものにして、画像認識機能を組み込んだシステムの開発の際に参考にできるものにしたい。

  • 実行環境
    ノートPCで実行できるものとする。
  • 開発環境
    Windwos10、anaconda、python3、keras(functional APIを使用)
  • 使用データ
    アメリカ国立標準技術研究所(MNISTデータ)
  • 処理概要
    MNISTデータを読み込んで、学習データとテストデータに分ける。
    CNNモデルを作成。学習済みモデル作成。
    本番データを流して結果を評価。
  • 学習モデル
    CNN

試作したプログラム

# functionAPIを用いた学習
%tensorflow_version 1.x
import keras
from keras.datasets import mnist
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras import backend as K
from keras.layers import Input
from keras.models import Model

batch_size = 128
num_classes = 10
epochs = 12

img_rows, img_cols = 28, 28

(x_train, y_train), (x_test, y_test) = mnist.load_data()

#Kerasのバックエンドで動くTensorFlowとTheanoでは入力チャンネルの順番が違うので場合分けして書いています
if K.image_data_format() == ‘channels_first’:
x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)
x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols)
input_shape = (1, img_rows, img_cols)
else:
x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
input_shape = (img_rows, img_cols, 1)

x_train = x_train.astype(‘float32’)
x_test = x_test.astype(‘float32’)
x_train /= 255
x_test /= 255
print(‘x_train shape:’, x_train.shape)
print(x_train.shape[0], ‘train samples’)
print(x_test.shape[0], ‘test samples’)

y_train = y_train.astype(‘int32’)
y_test = y_test.astype(‘int32′)
y_train = keras.utils.np_utils.to_categorical(y_train, num_classes)
y_test = keras.utils.np_utils.to_categorical(y_test, num_classes)

inputs = Input(input_shape)
x = Conv2D(32, kernel_size=(3, 3), activation=’relu’)(inputs)
x = Conv2D(64, (3, 3), activation=’relu’)(x)
x = MaxPooling2D(pool_size=(2, 2))(x)
x = Dropout(0.25)(x)
x = Flatten()(x)
x = Dense(128, activation=’relu’)(x)
x = Dropout(0.5)(x)
predictions = Dense(num_classes, activation=’softmax’)(x)

#Modelを定義して入力と出力を接続します
model = Model(inputs=inputs, outputs=predictions)

model.compile(loss=keras.losses.categorical_crossentropy,
optimizer=keras.optimizers.Adadelta(),
metrics=[‘accuracy’])
model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs,
verbose=1, validation_data=(x_test, y_test))

x_train shape: (60000, 28, 28, 1)
60000 train samples
10000 test samples
Train on 60000 samples, validate on 10000 samples
Epoch 1/12
60000/60000 [==============================] – 159s 3ms/step – loss: 0.2712 – acc: 0.9176 – val_loss: 0.0565 – val_acc: 0.9814
Epoch 2/12
60000/60000 [==============================] – 159s 3ms/step – loss: 0.0908 – acc: 0.9735 – val_loss: 0.0436 – val_acc: 0.9857
Epoch 3/12
60000/60000 [==============================] – 158s 3ms/step – loss: 0.0683 – acc: 0.9799 – val_loss: 0.0382 – val_acc: 0.9875
Epoch 4/12
60000/60000 [==============================] – 159s 3ms/step – loss: 0.0559 – acc: 0.9832 – val_loss: 0.0315 – val_acc: 0.9894
Epoch 5/12
60000/60000 [==============================] – 159s 3ms/step – loss: 0.0480 – acc: 0.9854 – val_loss: 0.0284 – val_acc: 0.9902
Epoch 6/12
60000/60000 [==============================] – 159s 3ms/step – loss: 0.0419 – acc: 0.9872 – val_loss: 0.0277 – val_acc: 0.9905
Epoch 7/12
60000/60000 [==============================] – 159s 3ms/step – loss: 0.0386 – acc: 0.9880 – val_loss: 0.0305 – val_acc: 0.9907
Epoch 8/12
60000/60000 [==============================] – 159s 3ms/step – loss: 0.0330 – acc: 0.9897 – val_loss: 0.0275 – val_acc: 0.9915
Epoch 9/12
60000/60000 [==============================] – 159s 3ms/step – loss: 0.0308 – acc: 0.9903 – val_loss: 0.0293 – val_acc: 0.9904
Epoch 10/12
60000/60000 [==============================] – 159s 3ms/step – loss: 0.0278 – acc: 0.9912 – val_loss: 0.0275 – val_acc: 0.9923
Epoch 11/12
60000/60000 [==============================] – 159s 3ms/step – loss: 0.0277 – acc: 0.9913 – val_loss: 0.0257 – val_acc: 0.9922
Epoch 12/12
60000/60000 [==============================] – 159s 3ms/step – loss: 0.0255 – acc: 0.9920 – val_loss: 0.0280 – val_acc: 0.9918

<keras.callbacks.History at 0x7fdb46062588>

AI勉強会 課題1 株価予測

この課題の考え方

株価の予想方法には、ファンダメンタルズによる方法と、テクニカルによる方法がある。

■ファンダメンタルズによる予測
経済状況
社会現象
企業業績
財務状況
これらのデータを分析して、株価を予想する。長期投資では、有名な投資家がこの方法で成功している。この予想には非常に多くのAIが使われるようになっていて、AIが情報を分析して、自動売買までしている。AIの方が、人間よりも速く正確に予想できるので、AIが圧倒的に有利になる。

■テクニカルによる予測
移動平均
値幅
サイクル
日柄カウント
その他インジケータ
これらのデータを分析して、株価を予想する。この予測方法は、多くの自動売買システムが使っている。非常に多くのシステムが動いていて、全世界の株取引の半分以上がこの方式だといわれている。しかし 、安定してパフォーマンスを出しているシステムがあるかは不明。

この課題におけるAI予測
乖離率
移動平均のトレンド
取引量のトレンド
ドル円のトレンド
NYダウのトレンド
香港ハンセンのトレンド

これらのデータでAIで予測して、数日のポジションで取引する。

・この変数を使うことで、部分的だがファンダメンタルズを含めて予測できる。
・日経平均を取引することで個別の銘柄のことは考えなくていい。
・最近の億トレーダの多くがこの方法に類似した方法で成功している。

予想方式の概要

前日の株価と複数の変数データから、当日の株の最適な売買参考価格を予想する。日々のデータと5営業日先の始値の履歴を学習用データとして、AIに学習させ、学習済みモデルを作成する。ここで、複数のトレンドの強さ、出来高の変化等を前処理で作成し学習することで予測精度を上げる。売買参考価格は、指値、損切条件、利確条件を含める。予想対象は日経225連動ETF。