2017-03-26 10 views
1

私は、ラベル、ファイル名、およびデータ(ピクセル)から構成され、次のバイナリファイルを持っている:私は接尾_m.jpgとのそれらのための接尾辞_n.jpg1で画像にラベル0を与えているPython/Tensorflow - この場合、すべての精度値が「1」になるのは正常ですか?

[array([2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 
     0, 2, 1, 0, 2, 1, 0]), array(['10_c.jpg', '10_m.jpg', '10_n.jpg', '1_c.jpg', 
     '1_m.jpg', '1_n.jpg', '2_c.jpg', '2_m.jpg', 
     '2_n.jpg', '3_c.jpg', '3_m.jpg', '3_n.jpg', 
     '4_c.jpg', '4_m.jpg', '4_n.jpg', '5_c.jpg', 
     '5_m.jpg', '5_n.jpg', '6_c.jpg', '6_m.jpg', 
     '6_n.jpg', '7_c.jpg', '7_m.jpg', '7_n.jpg', 
     '8_c.jpg', '8_m.jpg', '8_n.jpg', '9_c.jpg', 
     '9_m.jpg', '9_n.jpg'], 
     dtype='<U15'), array([[255, 252, 255, ..., 255, 255, 255], 
     [136, 137, 138, ..., 114, 110, 111], 
     [200, 200, 199, ..., 179, 178, 177], 
     ..., 
     [146, 157, 165, ..., 202, 202, 201], 
     [228, 225, 222, ..., 219, 221, 223], 
     [128, 127, 127, ..., 133, 129, 127]])] 

を、そして2サフィックス_c.jpg

とのそれらのために私は、畳み込みニューラルネットワーク(CNN)のための次のコード部分を持っている:

import numpy as np 
import matplotlib.pyplot as plt 
import cifar_tools 
import tensorflow as tf 

data, labels = cifar_tools.read_data('C:\\Users\\abc\\Desktop\\Testing') 

x = tf.placeholder(tf.float32, [None, 150 * 150]) 
y = tf.placeholder(tf.float32, [None, 2]) 

w1 = tf.Variable(tf.random_normal([5, 5, 1, 64])) 
b1 = tf.Variable(tf.random_normal([64])) 

w2 = tf.Variable(tf.random_normal([5, 5, 64, 64])) 
b2 = tf.Variable(tf.random_normal([64])) 

w3 = tf.Variable(tf.random_normal([38*38*64, 1024])) 
b3 = tf.Variable(tf.random_normal([1024])) 

w_out = tf.Variable(tf.random_normal([1024, 2])) 
b_out = tf.Variable(tf.random_normal([2])) 

def conv_layer(x,w,b): 
    conv = tf.nn.conv2d(x,w,strides=[1,1,1,1], padding = 'SAME') 
    conv_with_b = tf.nn.bias_add(conv,b) 
    conv_out = tf.nn.relu(conv_with_b) 
    return conv_out 

def maxpool_layer(conv,k=2): 
    return tf.nn.max_pool(conv, ksize=[1,k,k,1], strides=[1,k,k,1], padding='SAME') 

def model(): 
    x_reshaped = tf.reshape(x, shape=[-1, 150, 150, 1]) 

    conv_out1 = conv_layer(x_reshaped, w1, b1) 
    maxpool_out1 = maxpool_layer(conv_out1) 
    norm1 = tf.nn.lrn(maxpool_out1, 4, bias=1.0, alpha=0.001/9.0, beta=0.75) 
    conv_out2 = conv_layer(norm1, w2, b2) 
    norm2 = tf.nn.lrn(conv_out2, 4, bias=1.0, alpha=0.001/9.0, beta=0.75) 
    maxpool_out2 = maxpool_layer(norm2) 

    maxpool_reshaped = tf.reshape(maxpool_out2, [-1, w3.get_shape().as_list()[0]]) 
    local = tf.add(tf.matmul(maxpool_reshaped, w3), b3) 
    local_out = tf.nn.relu(local) 

    out = tf.add(tf.matmul(local_out, w_out), b_out) 
    return out 

model_op = model() 

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(model_op, y)) 
train_op = tf.train.AdamOptimizer(learning_rate=0.001).minimize(cost) 

correct_pred = tf.equal(tf.argmax(model_op, 1), tf.argmax(y,1)) 
accuracy = tf.reduce_mean(tf.cast(correct_pred,tf.float32)) 

with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    onehot_labels = tf.one_hot(labels, 2, on_value=1.,off_value=0.,axis=-1) 
    onehot_vals = sess.run(onehot_labels) 
    batch_size = 1 
    for j in range(0, 5): 
     print('EPOCH', j) 
     for i in range(0, len(data), batch_size): 
      batch_data = data[i:i+batch_size, :] 
      batch_onehot_vals = onehot_vals[i:i+batch_size, :] 
      _, accuracy_val = sess.run([train_op, accuracy], feed_dict={x: batch_data, y: batch_onehot_vals}) 
      print(i, accuracy_val) 

     print('DONE WITH EPOCH') 

私はプログラムを実行すると、私は5つのエポックのために、次を得る:

EPOCH 0 
0 1.0 
1 1.0 
2 0.0 
3 0.0 
4 0.0 
5 1.0 
6 0.0 
7 0.0 
8 0.0 
9 0.0 
10 0.0 
11 1.0 
12 1.0 
13 0.0 
14 0.0 
15 0.0 
16 1.0 
17 0.0 
18 0.0 
19 0.0 
20 1.0 
21 1.0 
22 0.0 
23 1.0 
24 0.0 
25 1.0 
26 0.0 
27 0.0 
28 0.0 
29 1.0 
DONE WITH EPOCH 
EPOCH 1 
0 0.0 
1 1.0 
2 1.0 
3 1.0 
4 0.0 
5 0.0 
6 1.0 
7 1.0 
8 0.0 
9 0.0 
10 1.0 
11 1.0 
12 1.0 
13 0.0 
14 1.0 
15 1.0 
16 1.0 
17 0.0 
18 0.0 
19 1.0 
20 1.0 
21 0.0 
22 0.0 
23 1.0 
24 1.0 
25 1.0 
26 0.0 
27 0.0 
28 0.0 
29 1.0 
DONE WITH EPOCH 
EPOCH 2 
0 0.0 
1 0.0 
2 0.0 
3 1.0 
4 1.0 
5 0.0 
6 1.0 
7 0.0 
8 1.0 
9 0.0 
10 1.0 
11 0.0 
12 0.0 
13 0.0 
14 1.0 
15 1.0 
16 0.0 
17 0.0 
18 1.0 
19 1.0 
20 0.0 
21 0.0 
22 1.0 
23 1.0 
24 1.0 
25 0.0 
26 1.0 
27 1.0 
28 1.0 
29 0.0 
DONE WITH EPOCH 
EPOCH 3 
0 0.0 
1 1.0 
2 1.0 
3 0.0 
4 0.0 
5 1.0 
6 0.0 
7 0.0 
8 1.0 
9 1.0 
10 1.0 
11 0.0 
12 0.0 
13 1.0 
14 0.0 
15 0.0 
16 0.0 
17 1.0 
18 1.0 
19 0.0 
20 1.0 
21 1.0 
22 1.0 
23 0.0 
24 0.0 
25 1.0 
26 0.0 
27 1.0 
28 0.0 
29 1.0 
DONE WITH EPOCH 
EPOCH 4 
0 1.0 
1 1.0 
2 0.0 
3 1.0 
4 1.0 
5 0.0 
6 1.0 
7 1.0 
8 1.0 
9 1.0 
10 1.0 
11 1.0 
12 1.0 
13 1.0 
14 0.0 
15 0.0 
16 1.0 
17 1.0 
18 0.0 
19 0.0 
20 1.0 
21 1.0 
22 0.0 
23 1.0 
24 0.0 
25 1.0 
26 0.0 
27 0.0 
28 1.0 
29 1.0 
DONE WITH EPOCH 

は、上記のデータに基づいて、通常、これらの値(精度)はありますか?私が求めている理由は、他のデータ(しかし、10クラスの膨大な量のデータ)で、元のプログラム(自分のデータで動作させるためにいくつかの調整を行った)が次のような結果:

EPOCH 0 
1 0.104 
2 0.1 
3 0.136 
4 0.14 
5 0.124 
6 0.156 
7 0.16 
8 0.172 
9 0.16 
10 0.164 
11 0.148 
... 
... 
... 

あなたは私が取得していた結果が正常であると思いますか(つまりのみ0または1)?

EDIT-1

私はへbatch_sizeを変更している次のように私が今抱えている出力がある

batch_size = len(data) // 2 

EPOCH 0 
0 0.466667 
15 0.666667 
DONE WITH EPOCH 
EPOCH 1 
0 0.666667 
15 0.6 
DONE WITH EPOCH 
EPOCH 2 
0 0.333333 
15 0.333333 
DONE WITH EPOCH 
EPOCH 3 
0 0.333333 
15 0.333333 
DONE WITH EPOCH 
EPOCH 4 
0 0.533333 
15 0.666667 
DONE WITH EPOCH 

それは正しいでしょうか?だから、私は30枚の画像を持っています(私はそれらがほんのわずかであることを知っていますが、目的を証明するためです)。それらをバッチに入れる最良の方法は何ですか?上記の出力が正しいかどうかを表す良い方法はありますか?このような小さなデータセットの場合は、すべてを1つのバッチにまとめることができます(つまりbatch_size = len(data))。私はBATCH_SIZE = LEN(データ)を設定する。例えば

、私は次の取得:

EPOCH 0 
0 0.333333 
DONE WITH EPOCH 
EPOCH 1 
0 0.666667 
DONE WITH EPOCH 
EPOCH 2 
0 0.666667 
DONE WITH EPOCH 
EPOCH 3 
0 0.333333 
DONE WITH EPOCH 
EPOCH 4 
0 0.366667 
DONE WITH EPOCH 

感謝を。

答えて

1

あなたのコード内のbatch_sizeの値が1であるので、あなたは

sess.run([train_op, accuracy], feed_dict={x: batch_data, y: batch_onehot_vals}) 

を実行するたびに、あなたは、唯一の絵を調べます。その後、あなたは次の2行を持っている:

correct_pred = tf.equal(tf.argmax(model_op, 1), tf.argmax(y,1)) 
accuracy = tf.reduce_mean(tf.cast(correct_pred,tf.float32)) 

だからbesically、correct_predはただ1番号(0または1)それは、1枚の画像に基づいているため、(。そうtf.argmax(model_op, 1)=tf.argmax(y,1)ならば、correct_pred=1それ以外の場合は0に等しいです)。

次にaccuracyは、この番号に等しいです。したがって、その値は常に0または1です。

への応答1:数値は意味があります。batch_size=15なので、精度は1/15 = 0.0667の整数倍でなければなりません。これは実際にはテーブルのすべての値に当てはまるようです。これは1/15の整数倍でなければならない 理由は、次の2行のものである:(それはtf.equalの結果であるため)

correct_pred = tf.equal(tf.argmax(model_op, 1), tf.argmax(y,1)) 
accuracy = tf.reduce_mean(tf.cast(correct_pred,tf.float32)) 

アレイcorrect_predがちょうど0-1ベクトルです。 accuracyは、correct_predの値の合計を15のバッチサイズで割ったものに過ぎません。

最適なバッチサイズについては、多くの要因によって異なります。例えば、hereのディスカッションでそのことについてもっと読むことができます。

+0

ご返信ありがとうございます。 batch_size = len(data)// 200.データの長さは50000、batch_sizeは250です。つまり、毎回250枚の画像を調べていますか? – Simplicity

+1

はい、すべてのモデルの出力を同時に計算することを意味します。これは、x_reshaped = tf.reshape(x、shape = [ - 1,1,150,150,1])に-1がある理由です。 -1は、頭が分からない写真の数を表しますが、一度feed_dictに渡すとわかります。ご覧のように、すべての畳み込みはbatch_data全体に適用されます(feed_dictにx_reshaped = batch_dataがあるため)。 –

+0

ありがとうございます。 ** EDIT-1 **を私の質問で親切に見ることができますか? – Simplicity

関連する問題