TensorFlowサンプルコード
Revision | cbd658819edfff3a97e56d48ee984680968e5e5d (tree) |
---|---|
Time | 2018-01-18 18:32:59 |
Author | hylom <hylom@hylo...> |
Commiter | hylom |
add tensorboard sample
@@ -0,0 +1,10 @@ | ||
1 | +0,1,1,1,1,0,1,1,0,1,1,0,1,1,1,1 | |
2 | +1,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 | |
3 | +2,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1 | |
4 | +3,1,1,1,0,0,1,1,1,1,0,0,1,1,1,1 | |
5 | +4,1,0,1,1,0,1,1,1,1,0,0,1,0,0,1 | |
6 | +5,1,1,1,1,0,0,1,1,1,0,0,1,1,1,1 | |
7 | +6,1,1,1,1,0,0,1,1,1,1,0,1,1,1,1 | |
8 | +7,1,1,1,0,0,1,0,0,1,0,0,1,0,0,1 | |
9 | +8,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1 | |
10 | +9,1,1,1,1,0,1,1,1,1,0,0,1,1,1,1 |
@@ -0,0 +1,134 @@ | ||
1 | +#!/usr/bin/env python | |
2 | +# -*- coding: utf-8 -*- | |
3 | + | |
4 | +import tensorflow as tf | |
5 | + | |
6 | +INPUT_SIZE = 15 | |
7 | +W1_SIZE = 15 | |
8 | +OUTPUT_SIZE = 10 | |
9 | + | |
10 | +# 入力 | |
11 | +x1 = tf.placeholder(dtype=tf.float32, name="x1") | |
12 | +y = tf.placeholder(dtype=tf.float32, name="y") | |
13 | + | |
14 | +# 第2層 | |
15 | +tf.set_random_seed(1234) | |
16 | +W1 = tf.get_variable("W1", | |
17 | + shape=[INPUT_SIZE, W1_SIZE], | |
18 | + dtype=tf.float32, | |
19 | + initializer=tf.random_normal_initializer(stddev=0.05)) | |
20 | +b1 = tf.get_variable("b1", | |
21 | + shape=[W1_SIZE], | |
22 | + dtype=tf.float32, | |
23 | + initializer=tf.random_normal_initializer(stddev=0.05)) | |
24 | +x2 = tf.sigmoid(tf.matmul(x1, W1) + b1, name="x2") | |
25 | + | |
26 | +# 第3層 | |
27 | +W2 = tf.get_variable("W2", | |
28 | + shape=[W1_SIZE, OUTPUT_SIZE], | |
29 | + dtype=tf.float32, | |
30 | + initializer=tf.random_normal_initializer(stddev=0.05)) | |
31 | +b2 = tf.get_variable("b2", | |
32 | + shape=[OUTPUT_SIZE], | |
33 | + dtype=tf.float32, | |
34 | + initializer=tf.random_normal_initializer(stddev=0.05)) | |
35 | +x3 = tf.nn.softmax(tf.matmul(x2, W2) + b2, name="x3") | |
36 | + | |
37 | +# コスト関数 | |
38 | +cross_entropy = -tf.reduce_sum(y * tf.log(x3), name="cross_entropy") | |
39 | + | |
40 | +# 最適化アルゴリズムを定義 | |
41 | +optimizer = tf.train.GradientDescentOptimizer(0.01, name="optimizer") | |
42 | +minimize = optimizer.minimize(cross_entropy, name="minimize") | |
43 | + | |
44 | +## データセットを読み込むためのパイプラインを作成する | |
45 | +# リーダーオブジェクトを作成する | |
46 | +reader = tf.TextLineReader() | |
47 | + | |
48 | +# 読み込む対象のファイルを格納したキューを作成する | |
49 | +file_queue = tf.train.string_input_producer(["digits_data.csv", "test_data.csv"]) | |
50 | + | |
51 | +# キューからデータを読み込む | |
52 | +key, value = reader.read(file_queue) | |
53 | + | |
54 | +# 読み込んだCSV型式データをデコードする | |
55 | +# [[] for i in range(16)] は | |
56 | +# [[], [], [], [], [], [], [], [], | |
57 | +# [], [], [], [], [], [], [], []]に相当 | |
58 | +data = tf.decode_csv(value, record_defaults=[[] for i in range(16)]) | |
59 | + | |
60 | +# 10件のデータを読み出す | |
61 | +# 10件ずつデータを読み出す | |
62 | +# 第1カラム(data[0])はその文字が示す数だが、 | |
63 | +# ニューラルネットワークの出力は10要素の1次元テンソルとなる。 | |
64 | +# そのため、10×10の対角行列を作成し、そのdata[0]行目を取り出す操作を行うことで | |
65 | +# 1次元テンソルに変換する。dataは浮動小数点小数型なので、このとき | |
66 | +# int32型にキャストして使用する | |
67 | +data_x, data_y, y_value = tf.train.batch([ | |
68 | + tf.stack(data[1:]), | |
69 | + tf.reshape(tf.slice(tf.eye(10), [tf.cast(data[0], tf.int32), 0], [1, 10]), [10]), | |
70 | + tf.cast(data[0], tf.int64), | |
71 | +], 10) | |
72 | + | |
73 | +# セッションの作成 | |
74 | +sess = tf.Session() | |
75 | + | |
76 | +# 変数の初期化を実行する | |
77 | +sess.run(tf.global_variables_initializer()) | |
78 | + | |
79 | +# コーディネータの作成 | |
80 | +coord = tf.train.Coordinator() | |
81 | + | |
82 | +# キューの開始 | |
83 | +threads = tf.train.start_queue_runners(sess=sess, coord=coord) | |
84 | + | |
85 | +# ファイルからのデータの読み出し | |
86 | +# 1回目のデータ読み込み。1つ目のファイルから10件のデータが読み込まれる | |
87 | +# 1つ目のファイルには10件のデータがあるので、これで全データが読み込まれる | |
88 | +dataset_x, dataset_y, values_y = sess.run([data_x, data_y, y_value]) | |
89 | + | |
90 | +# 2回目のデータ読み込み。1つ目のファイルのデータはすべて読み出したので、 | |
91 | +# 続けて2つ目のファイルから読み込みが行われる。 | |
92 | +testdata_x, testdata_y, testvalues_y = sess.run([data_x, data_y, y_value]) | |
93 | + | |
94 | +# 学習を開始 | |
95 | +for i in range(100): | |
96 | + for j in range(100): | |
97 | + sess.run(minimize, {x1: dataset_x, y: dataset_y}) | |
98 | + print("CROSS ENTROPY:", sess.run(cross_entropy, {x1: dataset_x, y: dataset_y})) | |
99 | + | |
100 | +## 結果の出力 | |
101 | +# 出力テンソルの中でもっとも値が大きいもののインデックスが | |
102 | +# 正答と等しいかどうかを計算する | |
103 | +y_value = tf.placeholder(dtype=tf.int64) | |
104 | +correct = tf.equal(tf.argmax(x3,1), y_value) | |
105 | +accuracy = tf.reduce_mean(tf.cast(correct, "float")) | |
106 | + | |
107 | +# 学習に使用したデータを入力した場合の | |
108 | +# ニューラルネットワークの出力を表示 | |
109 | +print("----result----") | |
110 | +print("raw output:") | |
111 | +print(sess.run(x3,feed_dict={x1: dataset_x})) | |
112 | +print("answers:", sess.run(tf.argmax(x3, 1), feed_dict={x1: dataset_x})) | |
113 | + | |
114 | +# このときの正答率を出力 | |
115 | +print("accuracy:", sess.run(accuracy, feed_dict={x1: dataset_x, y_value: values_y})) | |
116 | + | |
117 | + | |
118 | +# テスト用データを入力した場合の | |
119 | +# ニューラルネットワークの出力を表示 | |
120 | +print("----test----") | |
121 | +print("raw output:") | |
122 | +print(sess.run(x3,feed_dict={x1: testdata_x})) | |
123 | +print("answers:", sess.run(tf.argmax(x3, 1), feed_dict={x1: testdata_x})) | |
124 | + | |
125 | +# このときの正答率を出力 | |
126 | +print("accuracy:", sess.run(accuracy, feed_dict={x1: testdata_x, y_value: testvalues_y})) | |
127 | + | |
128 | + | |
129 | +# サマリ情報の出力 | |
130 | +summary_writer = tf.summary.FileWriter('./data', graph=sess.graph) | |
131 | + | |
132 | +# キューの終了 | |
133 | +coord.request_stop() | |
134 | +coord.join(threads) |
@@ -0,0 +1,137 @@ | ||
1 | +#!/usr/bin/env python | |
2 | +# -*- coding: utf-8 -*- | |
3 | + | |
4 | +import tensorflow as tf | |
5 | + | |
6 | +INPUT_SIZE = 15 | |
7 | +W1_SIZE = 15 | |
8 | +OUTPUT_SIZE = 10 | |
9 | + | |
10 | +with tf.variable_scope('model') as scope: | |
11 | + | |
12 | + # 入力 | |
13 | + x1 = tf.placeholder(dtype=tf.float32, name="x1") | |
14 | + y = tf.placeholder(dtype=tf.float32, name="y") | |
15 | + | |
16 | + # 第2層 | |
17 | + tf.set_random_seed(1234) | |
18 | + W1 = tf.get_variable("W1", | |
19 | + shape=[INPUT_SIZE, W1_SIZE], | |
20 | + dtype=tf.float32, | |
21 | + initializer=tf.random_normal_initializer(stddev=0.05)) | |
22 | + b1 = tf.get_variable("b1", | |
23 | + shape=[W1_SIZE], | |
24 | + dtype=tf.float32, | |
25 | + initializer=tf.random_normal_initializer(stddev=0.05)) | |
26 | + x2 = tf.sigmoid(tf.matmul(x1, W1) + b1, name="x2") | |
27 | + | |
28 | + # 第3層 | |
29 | + W2 = tf.get_variable("W2", | |
30 | + shape=[W1_SIZE, OUTPUT_SIZE], | |
31 | + dtype=tf.float32, | |
32 | + initializer=tf.random_normal_initializer(stddev=0.05)) | |
33 | + b2 = tf.get_variable("b2", | |
34 | + shape=[OUTPUT_SIZE], | |
35 | + dtype=tf.float32, | |
36 | + initializer=tf.random_normal_initializer(stddev=0.05)) | |
37 | + x3 = tf.nn.softmax(tf.matmul(x2, W2) + b2, name="x3") | |
38 | + | |
39 | + # コスト関数 | |
40 | + cross_entropy = -tf.reduce_sum(y * tf.log(x3), name="cross_entropy") | |
41 | + | |
42 | + # 最適化アルゴリズムを定義 | |
43 | + optimizer = tf.train.GradientDescentOptimizer(0.01, name="optimizer") | |
44 | + minimize = optimizer.minimize(cross_entropy, name="minimize") | |
45 | + | |
46 | +with tf.variable_scope('pipeline') as scope: | |
47 | + ## データセットを読み込むためのパイプラインを作成する | |
48 | + # リーダーオブジェクトを作成する | |
49 | + reader = tf.TextLineReader() | |
50 | + | |
51 | + # 読み込む対象のファイルを格納したキューを作成する | |
52 | + file_queue = tf.train.string_input_producer(["digits_data.csv", "test_data.csv"]) | |
53 | + | |
54 | + # キューからデータを読み込む | |
55 | + key, value = reader.read(file_queue) | |
56 | + | |
57 | + # 読み込んだCSV型式データをデコードする | |
58 | + # [[] for i in range(16)] は | |
59 | + # [[], [], [], [], [], [], [], [], | |
60 | + # [], [], [], [], [], [], [], []]に相当 | |
61 | + data = tf.decode_csv(value, record_defaults=[[] for i in range(16)]) | |
62 | + | |
63 | + # 10件のデータを読み出す | |
64 | + # 10件ずつデータを読み出す | |
65 | + # 第1カラム(data[0])はその文字が示す数だが、 | |
66 | + # ニューラルネットワークの出力は10要素の1次元テンソルとなる。 | |
67 | + # そのため、10×10の対角行列を作成し、そのdata[0]行目を取り出す操作を行うことで | |
68 | + # 1次元テンソルに変換する。dataは浮動小数点小数型なので、このとき | |
69 | + # int32型にキャストして使用する | |
70 | + data_x, data_y, y_value = tf.train.batch([ | |
71 | + tf.stack(data[1:]), | |
72 | + tf.reshape(tf.slice(tf.eye(10), [tf.cast(data[0], tf.int32), 0], [1, 10]), [10]), | |
73 | + tf.cast(data[0], tf.int64), | |
74 | + ], 10) | |
75 | + | |
76 | +# セッションの作成 | |
77 | +sess = tf.Session() | |
78 | + | |
79 | +# 変数の初期化を実行する | |
80 | +sess.run(tf.global_variables_initializer()) | |
81 | + | |
82 | +# コーディネータの作成 | |
83 | +coord = tf.train.Coordinator() | |
84 | + | |
85 | +# キューの開始 | |
86 | +threads = tf.train.start_queue_runners(sess=sess, coord=coord) | |
87 | + | |
88 | +# ファイルからのデータの読み出し | |
89 | +# 1回目のデータ読み込み。1つ目のファイルから10件のデータが読み込まれる | |
90 | +# 1つ目のファイルには10件のデータがあるので、これで全データが読み込まれる | |
91 | +dataset_x, dataset_y, values_y = sess.run([data_x, data_y, y_value]) | |
92 | + | |
93 | +# 2回目のデータ読み込み。1つ目のファイルのデータはすべて読み出したので、 | |
94 | +# 続けて2つ目のファイルから読み込みが行われる。 | |
95 | +testdata_x, testdata_y, testvalues_y = sess.run([data_x, data_y, y_value]) | |
96 | + | |
97 | +# 学習を開始 | |
98 | +for i in range(100): | |
99 | + for j in range(100): | |
100 | + sess.run(minimize, {x1: dataset_x, y: dataset_y}) | |
101 | + print("CROSS ENTROPY:", sess.run(cross_entropy, {x1: dataset_x, y: dataset_y})) | |
102 | + | |
103 | +## 結果の出力 | |
104 | +# 出力テンソルの中でもっとも値が大きいもののインデックスが | |
105 | +# 正答と等しいかどうかを計算する | |
106 | +y_value = tf.placeholder(dtype=tf.int64) | |
107 | +correct = tf.equal(tf.argmax(x3,1), y_value) | |
108 | +accuracy = tf.reduce_mean(tf.cast(correct, "float")) | |
109 | + | |
110 | +# 学習に使用したデータを入力した場合の | |
111 | +# ニューラルネットワークの出力を表示 | |
112 | +print("----result----") | |
113 | +print("raw output:") | |
114 | +print(sess.run(x3,feed_dict={x1: dataset_x})) | |
115 | +print("answers:", sess.run(tf.argmax(x3, 1), feed_dict={x1: dataset_x})) | |
116 | + | |
117 | +# このときの正答率を出力 | |
118 | +print("accuracy:", sess.run(accuracy, feed_dict={x1: dataset_x, y_value: values_y})) | |
119 | + | |
120 | + | |
121 | +# テスト用データを入力した場合の | |
122 | +# ニューラルネットワークの出力を表示 | |
123 | +print("----test----") | |
124 | +print("raw output:") | |
125 | +print(sess.run(x3,feed_dict={x1: testdata_x})) | |
126 | +print("answers:", sess.run(tf.argmax(x3, 1), feed_dict={x1: testdata_x})) | |
127 | + | |
128 | +# このときの正答率を出力 | |
129 | +print("accuracy:", sess.run(accuracy, feed_dict={x1: testdata_x, y_value: testvalues_y})) | |
130 | + | |
131 | + | |
132 | +# サマリ情報の出力 | |
133 | +summary_writer = tf.summary.FileWriter('data', graph=sess.graph) | |
134 | + | |
135 | +# キューの終了 | |
136 | +coord.request_stop() | |
137 | +coord.join(threads) |
@@ -0,0 +1,149 @@ | ||
1 | +#!/usr/bin/env python | |
2 | +# -*- coding: utf-8 -*- | |
3 | + | |
4 | +import tensorflow as tf | |
5 | + | |
6 | +INPUT_SIZE = 15 | |
7 | +W1_SIZE = 15 | |
8 | +OUTPUT_SIZE = 10 | |
9 | + | |
10 | +with tf.variable_scope('model') as scope: | |
11 | + | |
12 | + # 入力 | |
13 | + x1 = tf.placeholder(dtype=tf.float32, name="x1") | |
14 | + y = tf.placeholder(dtype=tf.float32, name="y") | |
15 | + | |
16 | + # 第2層 | |
17 | + tf.set_random_seed(1234) | |
18 | + W1 = tf.get_variable("W1", | |
19 | + shape=[INPUT_SIZE, W1_SIZE], | |
20 | + dtype=tf.float32, | |
21 | + initializer=tf.random_normal_initializer(stddev=0.05)) | |
22 | + b1 = tf.get_variable("b1", | |
23 | + shape=[W1_SIZE], | |
24 | + dtype=tf.float32, | |
25 | + initializer=tf.random_normal_initializer(stddev=0.05)) | |
26 | + x2 = tf.sigmoid(tf.matmul(x1, W1) + b1, name="x2") | |
27 | + | |
28 | + # 第3層 | |
29 | + W2 = tf.get_variable("W2", | |
30 | + shape=[W1_SIZE, OUTPUT_SIZE], | |
31 | + dtype=tf.float32, | |
32 | + initializer=tf.random_normal_initializer(stddev=0.05)) | |
33 | + b2 = tf.get_variable("b2", | |
34 | + shape=[OUTPUT_SIZE], | |
35 | + dtype=tf.float32, | |
36 | + initializer=tf.random_normal_initializer(stddev=0.05)) | |
37 | + x3 = tf.nn.softmax(tf.matmul(x2, W2) + b2, name="x3") | |
38 | + | |
39 | + # コスト関数 | |
40 | + cross_entropy = -tf.reduce_sum(y * tf.log(x3), name="cross_entropy") | |
41 | + tf.summary.scalar('cross_entropy', cross_entropy) | |
42 | + | |
43 | + # 正答率 | |
44 | + correct = tf.equal(tf.argmax(x3,1), tf.argmax(y,1), name="correct") | |
45 | + accuracy = tf.reduce_mean(tf.cast(correct, "float"), name="accuracy") | |
46 | + tf.summary.scalar('accuracy', accuracy) | |
47 | + | |
48 | + # 最適化アルゴリズムを定義 | |
49 | + global_step = tf.Variable(0, name='global_step', trainable=False) | |
50 | + optimizer = tf.train.GradientDescentOptimizer(0.01, name="optimizer") | |
51 | + minimize = optimizer.minimize(cross_entropy, global_step=global_step, name="minimize") | |
52 | + | |
53 | +with tf.variable_scope('pipeline') as scope: | |
54 | + ## データセットを読み込むためのパイプラインを作成する | |
55 | + # リーダーオブジェクトを作成する | |
56 | + reader = tf.TextLineReader() | |
57 | + | |
58 | + # 読み込む対象のファイルを格納したキューを作成する | |
59 | + file_queue = tf.train.string_input_producer(["digits_data.csv", "test_data.csv"]) | |
60 | + | |
61 | + # キューからデータを読み込む | |
62 | + key, value = reader.read(file_queue) | |
63 | + | |
64 | + # 読み込んだCSV型式データをデコードする | |
65 | + # [[] for i in range(16)] は | |
66 | + # [[], [], [], [], [], [], [], [], | |
67 | + # [], [], [], [], [], [], [], []]に相当 | |
68 | + data = tf.decode_csv(value, record_defaults=[[] for i in range(16)]) | |
69 | + | |
70 | + # 10件のデータを読み出す | |
71 | + # 10件ずつデータを読み出す | |
72 | + # 第1カラム(data[0])はその文字が示す数だが、 | |
73 | + # ニューラルネットワークの出力は10要素の1次元テンソルとなる。 | |
74 | + # そのため、10×10の対角行列を作成し、そのdata[0]行目を取り出す操作を行うことで | |
75 | + # 1次元テンソルに変換する。dataは浮動小数点小数型なので、このとき | |
76 | + # int32型にキャストして使用する | |
77 | + data_x, data_y, y_value = tf.train.batch([ | |
78 | + tf.stack(data[1:]), | |
79 | + tf.reshape(tf.slice(tf.eye(10), [tf.cast(data[0], tf.int32), 0], [1, 10]), [10]), | |
80 | + tf.cast(data[0], tf.int64), | |
81 | + ], 10) | |
82 | + | |
83 | +# セッションの作成 | |
84 | +sess = tf.Session() | |
85 | + | |
86 | +# 変数の初期化を実行する | |
87 | +sess.run(tf.global_variables_initializer()) | |
88 | + | |
89 | +# サマリを取得するための処理 | |
90 | +summary_op = tf.summary.merge_all() | |
91 | +summary_writer = tf.summary.FileWriter('data', graph=sess.graph) | |
92 | + | |
93 | + | |
94 | +# コーディネータの作成 | |
95 | +coord = tf.train.Coordinator() | |
96 | + | |
97 | +# キューの開始 | |
98 | +threads = tf.train.start_queue_runners(sess=sess, coord=coord) | |
99 | + | |
100 | +# ファイルからのデータの読み出し | |
101 | +# 1回目のデータ読み込み。1つ目のファイルから10件のデータが読み込まれる | |
102 | +# 1つ目のファイルには10件のデータがあるので、これで全データが読み込まれる | |
103 | +dataset_x, dataset_y, values_y = sess.run([data_x, data_y, y_value]) | |
104 | + | |
105 | +# 2回目のデータ読み込み。1つ目のファイルのデータはすべて読み出したので、 | |
106 | +# 続けて2つ目のファイルから読み込みが行われる。 | |
107 | +testdata_x, testdata_y, testvalues_y = sess.run([data_x, data_y, y_value]) | |
108 | + | |
109 | +# 学習を開始 | |
110 | +for i in range(100): | |
111 | + for j in range(100): | |
112 | + _, summary = sess.run([minimize, summary_op], {x1: dataset_x, y: dataset_y}) | |
113 | + print("CROSS ENTROPY:", sess.run(cross_entropy, {x1: dataset_x, y: dataset_y})) | |
114 | + summary_writer.add_summary(summary, global_step=tf.train.global_step(sess, global_step)) | |
115 | + | |
116 | + | |
117 | +## 結果の出力 | |
118 | +# 出力テンソルの中でもっとも値が大きいもののインデックスが | |
119 | +# 正答と等しいかどうかを計算する | |
120 | +y_value = tf.placeholder(dtype=tf.int64) | |
121 | +correct = tf.equal(tf.argmax(x3,1), y_value) | |
122 | +accuracy = tf.reduce_mean(tf.cast(correct, "float")) | |
123 | + | |
124 | +# 学習に使用したデータを入力した場合の | |
125 | +# ニューラルネットワークの出力を表示 | |
126 | +print("----result----") | |
127 | +print("raw output:") | |
128 | +print(sess.run(x3,feed_dict={x1: dataset_x})) | |
129 | +print("answers:", sess.run(tf.argmax(x3, 1), feed_dict={x1: dataset_x})) | |
130 | + | |
131 | +# このときの正答率を出力 | |
132 | +print("accuracy:", sess.run(accuracy, feed_dict={x1: dataset_x, y_value: values_y})) | |
133 | + | |
134 | + | |
135 | +# テスト用データを入力した場合の | |
136 | +# ニューラルネットワークの出力を表示 | |
137 | +print("----test----") | |
138 | +print("raw output:") | |
139 | +print(sess.run(x3,feed_dict={x1: testdata_x})) | |
140 | +print("answers:", sess.run(tf.argmax(x3, 1), feed_dict={x1: testdata_x})) | |
141 | + | |
142 | +# このときの正答率を出力 | |
143 | +print("accuracy:", sess.run(accuracy, feed_dict={x1: testdata_x, y_value: testvalues_y})) | |
144 | + | |
145 | + | |
146 | + | |
147 | +# キューの終了 | |
148 | +coord.request_stop() | |
149 | +coord.join(threads) |
@@ -0,0 +1,153 @@ | ||
1 | +#!/usr/bin/env python | |
2 | +# -*- coding: utf-8 -*- | |
3 | + | |
4 | +import tensorflow as tf | |
5 | + | |
6 | +INPUT_SIZE = 15 | |
7 | +W1_SIZE = 15 | |
8 | +OUTPUT_SIZE = 10 | |
9 | + | |
10 | +with tf.variable_scope('model') as scope: | |
11 | + | |
12 | + # 入力 | |
13 | + x1 = tf.placeholder(dtype=tf.float32, name="x1") | |
14 | + y = tf.placeholder(dtype=tf.float32, name="y") | |
15 | + | |
16 | + # 第2層 | |
17 | + tf.set_random_seed(1234) | |
18 | + W1 = tf.get_variable("W1", | |
19 | + shape=[INPUT_SIZE, W1_SIZE], | |
20 | + dtype=tf.float32, | |
21 | + initializer=tf.random_normal_initializer(stddev=0.05)) | |
22 | + b1 = tf.get_variable("b1", | |
23 | + shape=[W1_SIZE], | |
24 | + dtype=tf.float32, | |
25 | + initializer=tf.random_normal_initializer(stddev=0.05)) | |
26 | + x2 = tf.sigmoid(tf.matmul(x1, W1) + b1, name="x2") | |
27 | + | |
28 | + # W1のヒストグラムを記録 | |
29 | + tf.summary.histogram('W1', W1) | |
30 | + | |
31 | + # 第3層 | |
32 | + W2 = tf.get_variable("W2", | |
33 | + shape=[W1_SIZE, OUTPUT_SIZE], | |
34 | + dtype=tf.float32, | |
35 | + initializer=tf.random_normal_initializer(stddev=0.05)) | |
36 | + b2 = tf.get_variable("b2", | |
37 | + shape=[OUTPUT_SIZE], | |
38 | + dtype=tf.float32, | |
39 | + initializer=tf.random_normal_initializer(stddev=0.05)) | |
40 | + x3 = tf.nn.softmax(tf.matmul(x2, W2) + b2, name="x3") | |
41 | + | |
42 | + # コスト関数 | |
43 | + cross_entropy = -tf.reduce_sum(y * tf.log(x3), name="cross_entropy") | |
44 | + tf.summary.scalar('cross_entropy', cross_entropy) | |
45 | + | |
46 | + # 正答率 | |
47 | + correct = tf.equal(tf.argmax(x3,1), tf.argmax(y,1), name="correct") | |
48 | + accuracy = tf.reduce_mean(tf.cast(correct, "float"), name="accuracy") | |
49 | + tf.summary.scalar('accuracy', accuracy) | |
50 | + | |
51 | + | |
52 | + # 最適化アルゴリズムを定義 | |
53 | + global_step = tf.Variable(0, name='global_step', trainable=False) | |
54 | + optimizer = tf.train.GradientDescentOptimizer(0.01, name="optimizer") | |
55 | + minimize = optimizer.minimize(cross_entropy, global_step=global_step, name="minimize") | |
56 | + | |
57 | +with tf.variable_scope('pipeline') as scope: | |
58 | + ## データセットを読み込むためのパイプラインを作成する | |
59 | + # リーダーオブジェクトを作成する | |
60 | + reader = tf.TextLineReader() | |
61 | + | |
62 | + # 読み込む対象のファイルを格納したキューを作成する | |
63 | + file_queue = tf.train.string_input_producer(["digits_data.csv", "test_data.csv"]) | |
64 | + | |
65 | + # キューからデータを読み込む | |
66 | + key, value = reader.read(file_queue) | |
67 | + | |
68 | + # 読み込んだCSV型式データをデコードする | |
69 | + # [[] for i in range(16)] は | |
70 | + # [[], [], [], [], [], [], [], [], | |
71 | + # [], [], [], [], [], [], [], []]に相当 | |
72 | + data = tf.decode_csv(value, record_defaults=[[] for i in range(16)]) | |
73 | + | |
74 | + # 10件のデータを読み出す | |
75 | + # 10件ずつデータを読み出す | |
76 | + # 第1カラム(data[0])はその文字が示す数だが、 | |
77 | + # ニューラルネットワークの出力は10要素の1次元テンソルとなる。 | |
78 | + # そのため、10×10の対角行列を作成し、そのdata[0]行目を取り出す操作を行うことで | |
79 | + # 1次元テンソルに変換する。dataは浮動小数点小数型なので、このとき | |
80 | + # int32型にキャストして使用する | |
81 | + data_x, data_y, y_value = tf.train.batch([ | |
82 | + tf.stack(data[1:]), | |
83 | + tf.reshape(tf.slice(tf.eye(10), [tf.cast(data[0], tf.int32), 0], [1, 10]), [10]), | |
84 | + tf.cast(data[0], tf.int64), | |
85 | + ], 10) | |
86 | + | |
87 | +# セッションの作成 | |
88 | +sess = tf.Session() | |
89 | + | |
90 | +# 変数の初期化を実行する | |
91 | +sess.run(tf.global_variables_initializer()) | |
92 | + | |
93 | +# サマリを取得するための処理 | |
94 | +summary_op = tf.summary.merge_all() | |
95 | +summary_writer = tf.summary.FileWriter('data', graph=sess.graph) | |
96 | + | |
97 | + | |
98 | +# コーディネータの作成 | |
99 | +coord = tf.train.Coordinator() | |
100 | + | |
101 | +# キューの開始 | |
102 | +threads = tf.train.start_queue_runners(sess=sess, coord=coord) | |
103 | + | |
104 | +# ファイルからのデータの読み出し | |
105 | +# 1回目のデータ読み込み。1つ目のファイルから10件のデータが読み込まれる | |
106 | +# 1つ目のファイルには10件のデータがあるので、これで全データが読み込まれる | |
107 | +dataset_x, dataset_y, values_y = sess.run([data_x, data_y, y_value]) | |
108 | + | |
109 | +# 2回目のデータ読み込み。1つ目のファイルのデータはすべて読み出したので、 | |
110 | +# 続けて2つ目のファイルから読み込みが行われる。 | |
111 | +testdata_x, testdata_y, testvalues_y = sess.run([data_x, data_y, y_value]) | |
112 | + | |
113 | +# 学習を開始 | |
114 | +for i in range(100): | |
115 | + for j in range(100): | |
116 | + _, summary = sess.run([minimize, summary_op], {x1: dataset_x, y: dataset_y}) | |
117 | + print("CROSS ENTROPY:", sess.run(cross_entropy, {x1: dataset_x, y: dataset_y})) | |
118 | + summary_writer.add_summary(summary, global_step=tf.train.global_step(sess, global_step)) | |
119 | + | |
120 | + | |
121 | +## 結果の出力 | |
122 | +# 出力テンソルの中でもっとも値が大きいもののインデックスが | |
123 | +# 正答と等しいかどうかを計算する | |
124 | +y_value = tf.placeholder(dtype=tf.int64) | |
125 | +correct = tf.equal(tf.argmax(x3,1), y_value) | |
126 | +accuracy = tf.reduce_mean(tf.cast(correct, "float")) | |
127 | + | |
128 | +# 学習に使用したデータを入力した場合の | |
129 | +# ニューラルネットワークの出力を表示 | |
130 | +print("----result----") | |
131 | +print("raw output:") | |
132 | +print(sess.run(x3,feed_dict={x1: dataset_x})) | |
133 | +print("answers:", sess.run(tf.argmax(x3, 1), feed_dict={x1: dataset_x})) | |
134 | + | |
135 | +# このときの正答率を出力 | |
136 | +print("accuracy:", sess.run(accuracy, feed_dict={x1: dataset_x, y_value: values_y})) | |
137 | + | |
138 | + | |
139 | +# テスト用データを入力した場合の | |
140 | +# ニューラルネットワークの出力を表示 | |
141 | +print("----test----") | |
142 | +print("raw output:") | |
143 | +print(sess.run(x3,feed_dict={x1: testdata_x})) | |
144 | +print("answers:", sess.run(tf.argmax(x3, 1), feed_dict={x1: testdata_x})) | |
145 | + | |
146 | +# このときの正答率を出力 | |
147 | +print("accuracy:", sess.run(accuracy, feed_dict={x1: testdata_x, y_value: testvalues_y})) | |
148 | + | |
149 | + | |
150 | + | |
151 | +# キューの終了 | |
152 | +coord.request_stop() | |
153 | +coord.join(threads) |
@@ -0,0 +1,10 @@ | ||
1 | +0,0,1,0,1,0,1,1,0,1,1,0,1,0,1,0 | |
2 | +1,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0 | |
3 | +2,1,1,0,0,0,1,0,0,1,0,1,0,1,1,1 | |
4 | +3,1,1,0,0,0,1,0,1,0,0,0,1,1,1,0 | |
5 | +4,0,1,1,1,0,1,1,1,1,0,0,1,0,0,1 | |
6 | +5,1,1,1,1,0,0,1,1,0,0,0,1,1,1,0 | |
7 | +6,0,1,1,1,0,0,1,1,0,1,0,1,1,1,1 | |
8 | +7,1,1,1,1,0,1,0,0,1,0,1,0,1,0,0 | |
9 | +8,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0 | |
10 | +9,0,1,1,1,0,1,0,1,1,0,0,1,1,1,0 |