AIプログラム登録ページ

認証ページに移行すると学習計算ジョブを登録できます.->認証ページ
開発コード
キャプション コードの簡単な表題を入力してください.
例:お天気が「晴れ(1)」または「晴れ以外(0)」を判別するプログラム
基本設定 (自動生成)
import tensorflow as tf
import numpy as np
import requests
import os

ckptdir="/mnt/ckpts/TFCode%id/"
ckptfile="/mnt/ckpts/TFCode%id/TFCode%id.ckpt"
csvfile="/mnt/teacherdata/capacitor/TFCode%id/TFCode%id.csv"
training_count=%training
batch_size=%num
csv_lines = sum(1 for line in open(csvfile))
if (batch_size > csv_lines):
 batch_size = csv_lines
step_size = csv_lines/batch_size
import tensorflow as tf
import numpy as np
import requests
import os
#%idにはデータベースの主キーが代入されます
ckptdir="/mnt/ckpts/TFCode%id/"
ckptfile="/mnt/ckpts/TFCode%id/TFCode%id.ckpt"
csvfile="/mnt/teacherdata/capacitor/TFCode%id/TFCode%id.csv"
training_count=%trainingnum #%trainingnumはデータベースから自動調整されます

batch_size=%num #%numはサーバのメモリに応じて自動調整されます
csv_lines = sum(1 for line in open(csvfile))
if (batch_size > csv_lines):
 batch_size = csv_lines
step_size = csv_lines/batch_size
定数定義
## 定数
IMG_SIZEX = 1280 ## 学習させる画像の横幅
IMG_SIZEY = 800 ## 学習させる画像の縦幅
CHANNELS =3 ##学習画像のチャンネル数 RGB=>3 , グレースケール=>1
IMG_LENGTH = IMG_SIZEX * IMG_SIZEY * CHANNELS ## 学習させる画像データ長
LABEL_CNT = 2 ## ラベルの種類の数
CONV1_PATCH_SIZEX=5
CONV1_PATCH_SIZEY=5
CONV1_OUTPUT=32
CONV2_PATCH_SIZEX=5
CONV2_PATCH_SIZEY=5
CONV2_OUTPUT=64
学習変数初期化
## 学習に必要な変数の初期化
x = tf.placeholder(tf.float32, shape=[None, IMG_LENGTH])
y_ = tf.placeholder(tf.float32, shape=[None, LABEL_CNT])

## http://blog.brainpad.co.jp/entry/2016/02/25/153000

# 第一層のweightsとbiasのvariable
W_conv1 = tf.Variable(tf.truncated_normal([CONV1_PATCH_SIZEX, CONV1_PATCH_SIZEY, CHANNELS, CONV1_OUTPUT], stddev=0.1))
b_conv1 = tf.Variable(tf.constant(0.1, shape=[CONV1_OUTPUT]))
x_image = tf.reshape(x, [-1,IMG_SIZEX,IMG_SIZEY,CHANNELS])
h_conv1 = tf.nn.relu(tf.nn.conv2d(x_image, W_conv1, strides=[1, 1, 1, 1], padding='SAME') + b_conv1)
h_pool1 = tf.nn.max_pool(h_conv1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')

# 第二層
W_conv2 = tf.Variable(tf.truncated_normal([CONV2_PATCH_SIZEX, CONV2_PATCH_SIZEY, CONV1_OUTPUT, CONV2_OUTPUT], stddev=0.1))
b_conv2 = tf.Variable(tf.constant(0.1, shape=[CONV2_OUTPUT]))
h_conv2 = tf.nn.relu(tf.nn.conv2d(h_pool1, W_conv2, strides=[1, 1, 1, 1], padding='SAME') + b_conv2)
h_pool2 = tf.nn.max_pool(h_conv2, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')

W_fc1 = tf.Variable(tf.truncated_normal([int(IMG_SIZEX /4*IMG_SIZEY/4*CONV2_OUTPUT), 1024], stddev=0.1))
b_fc1 = tf.Variable(tf.constant(0.1, shape=[1024]))
h_pool2_flat = tf.reshape(h_pool2, [-1, int(IMG_SIZEX /4 * IMG_SIZEY /4*CONV2_OUTPUT)])
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)

# Dropout
keep_prob = tf.placeholder("float")
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)

# 出来上がったものに対してSoftmax
W_fc2 = tf.Variable(tf.truncated_normal([1024, LABEL_CNT], stddev=0.1))
b_fc2 = tf.Variable(tf.constant(0.1, shape=[LABEL_CNT]))
y_conv=tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)

# 交差エントロピー
#cross_entropy = -tf.reduce_sum(y_*tf.log(y_conv))
cross_entropy = tf.reduce_sum(tf.square(y_conv-y_))

# 今回はGradientDescentOptimizerではなく、AdamOptimizer
#train_step = tf.train.AdamOptimizer(1e-7).minimize(cross_entropy)
train_step = tf.train.GradientDescentOptimizer(1e-5).minimize(cross_entropy)

correct_prediction = tf.equal(tf.argmax(y_conv,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))

CSVファイルの読み込み と学習キューの格納
## CSVファイルをワークキューとして設定
queue = tf.train.string_input_producer([csvfile])
reader = tf.TextLineReader()
key, val = reader.read(queue)
url, label = tf.decode_csv(val, [[''], [0]])
   
   
Tensorflowの初期化 (自動生成)
myconfig = tf.ConfigProto(
intra_op_parallelism_threads=0 )
myconfig.gpu_options.allow_growth = True
saver = tf.train.Saver()
sess = tf.Session(config=myconfig)
sess.run(tf.global_variables_initializer())

if os.path.exists(ckptdir)==True:
    saver.restore(sess,ckptfile)
    
   
myconfig = tf.ConfigProto(
intra_op_parallelism_threads=0 )
myconfig.gpu_options.allow_growth = True
saver = tf.train.Saver()
sess = tf.Session(config=myconfig)
sess.run(tf.global_variables_initializer())

if os.path.exists(ckptdir)==True:
    saver.restore(sess,ckptfile)
   
   
バッチ処理の準備
   
## バッチ処理の準備(CSVファイルの形式によってバッチ処理変数を適宜調整すること)
batch_url, batch_label = tf.train.batch([url, label], batch_size=batch_size, allow_smaller_final_batch=True)
#この例では、CSVファイルよりurlとlabel変数に格納された配列をbatch_sizeごとに分割している.

バッチ処理のスタート(自動生成)

coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)
try:
 steps = 0
 while steps < step_size and not coord.should_stop():
  steps += 1

   

coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)
try:
 steps = 0
 while steps < step_size and not coord.should_stop():
  steps += 1

   
データの正規化コード

  urls, labels = sess.run([batch_url, batch_label])
  image2=[]
  label2=[]
  for url in urls :
    r=requests.get(url,auth=auth)
    image = r.content

    ## 画像をTensorFlowで処理できるように変換
    image = tf.image.decode_jpeg(image, channels=CHANNELS)
    image = tf.image.resize_image_with_crop_or_pad(image, IMG_SIZEX, IMG_SIZEY)
    image = tf.reshape(image, [-1])
    image_val = sess.run(image).astype("float") / 255.0
    image2.append(image_val)

  for label in labels :
    tmp = np.zeros(LABEL_CNT)
    tmp[label] = 1
    label2.append(tmp)
  image2 = np.asarray(image2)
  lable2 = np.asarray(label2)
  image2_len = len(image2)
   
   
学習コード

  for i in range(training_count):
   _,loss = sess.run([train_step, cross_entropy], feed_dict={x: image2[0:image2_len], y_: label2[0:image2_len], keep_prob: 0.5})
   #print('Step %d, Loss %f' % (i, loss)) #誤差の発散の確認用(デバッグ時のみ有効を推奨)

  sum_loss +=loss #学習終了後の誤差(loss)を加算する.バッチのステップ数分,加算される.
   
識別用コード
#ちょっときたないけど、コードを修正箇所を簡素化するために
p=sess.run(y_conv, feed_dict={x: [image2[0]], y_: [label2[0]]})[0] #判定結果を格納する変数は'p'にしてください。
#print ("{0}:".format(url.decode('utf-8')),end='') #URLを表示
#print (np.argmax(p),end='') #判別結果を表示
#print ("(value = {0})".format(np.max(p))) #判別結果の確率を表示
   
終了処理 (自動生成)
finally:
  coord.request_stop()

coord.join(threads)

av_loss = sum_loss/step_size/batch_size #平均誤差(1検体当たりの誤差)
#print(av_loss) #デバッグ表示用
saver.save(sess,ckptfile)
sess.close()
finally:
  coord.request_stop()

coord.join(threads)

av_loss = sum_loss/step_size/batch_size #平均誤差(1検体当たりの誤差)
#print(av_loss) #デバッグ表示用
saver.save(sess,ckptfile)
sess.close()
教師データのCSVファイルの内容
最後の行は改行しないこと.
https://ftp.yz.yamagata-u.ac.jp/pub/camera/AXIS_000/201708021509.jpg,0
https://ftp.yz.yamagata-u.ac.jp/pub/camera/AXIS_000/201708021519.jpg,1
https://ftp.yz.yamagata-u.ac.jp/pub/camera/AXIS_000/201708031509.jpg,0
https://ftp.yz.yamagata-u.ac.jp/pub/camera/AXIS_000/201708031519.jpg,1
https://ftp.yz.yamagata-u.ac.jp/pub/camera/AXIS_000/201708041509.jpg,0
https://ftp.yz.yamagata-u.ac.jp/pub/camera/AXIS_000/201708041519.jpg,1
https://ftp.yz.yamagata-u.ac.jp/pub/camera/AXIS_000/201708051509.jpg,0
https://ftp.yz.yamagata-u.ac.jp/pub/camera/AXIS_000/201708051519.jpg,1
https://ftp.yz.yamagata-u.ac.jp/pub/camera/AXIS_000/201708061509.jpg,0
https://ftp.yz.yamagata-u.ac.jp/pub/camera/AXIS_000/201708061519.jpg,1
https://ftp.yz.yamagata-u.ac.jp/pub/camera/AXIS_000/201708071509.jpg,0
https://ftp.yz.yamagata-u.ac.jp/pub/camera/AXIS_000/201708071519.jpg,1
https://ftp.yz.yamagata-u.ac.jp/pub/camera/AXIS_000/201708081509.jpg,0
(最後の行は改行しないこと)
教師データのダウンロードURL
https://a.yamagata-u.ac.jp/amenity/Laboratory/Deeplearning/aitenki.aspx
行列のサイズ IMG_SIZEX/4 * IMG_SIZEY/4 * CONV2_OUTPUT * 1024 を記述してください。
おおよその計算に必要なメモリの量を算出します。
例) 320 × 200 × 64 × 1024  = 4194304000
1学習あたりの繰り返し回数 1学習あたりの繰り返し学習回数をして下してください
  <-CSVファイルはご準備ください.