2017-07-18 13 views
0

現在、モデルをトレーニングしてcifar-10データセットを分類しようとしています。私はこのようなデータを読む:エラートレーニングCifar-10モデルTensorflow - 精度は0で、最適化されず、損失は報告されません。

def convert_images(raw): 
raw_float = np.array(raw, dtype = float) 
images = raw_float.reshape([-1,3,32,32]) 
images = images.transpose([0,2,3,1]) 
return images 

def load_data(filename): 
data = unpickle(filename) 
raw_images = data[b'data'] 
labels = np.array(data[b'labels']) 
images = convert_images(raw_images) 
return images, labels 

def load_training_data(): 
images = np.zeros(shape=[50000,32,32,3], dtype = float) 
labels = np.zeros(shape = [50000], dtype = int) 
begin = 0 
for i in range(5): 
    filename = "data_batch_" + str(i+1) 
    images_batch, labels_batch = load_data(filename) 
    num_images = len(images_batch) 
    end = begin + num_images 
    images[begin:end, :] = images_batch 
    labels[begin:end] = labels_batch 
    begin = end 
    return images, labels, OneHotEncoder(categorical_features=labels, n_values=10) 

これはありませんが、それはピクセルとRGB色の32x32x3値を持つ4D配列になるようにデータを再構築です。私はこのように私のモデルは(4D配列は、エラーを作成するので、私は最初の行ベクトルであることをXを再形成)を定義:

X = tf.placeholder(tf.float32, [None,32,32,3]) 
Y_labeled = tf.placeholder(tf.int32, [None]) 
data = load_training_data() 

with tf.name_scope('dnn'): 
    XX = tf.reshape(X, [-1,3072]) 
    hidden1 = tf.layers.dense(XX, 300, name = 'hidden1', activation = tf.nn.relu) 
    hidden2 = tf.layers.dense(hidden1, 200, name = 'hidden2', activation = tf.nn.relu) 
    hidden3 = tf.layers.dense(hidden2, 200, name = 'hidden3', activation = tf.nn.relu) 
    hidden4 = tf.layers.dense(hidden3, 100, name = 'hidden4', activation = tf.nn.relu) 
    logits = tf.layers.dense(hidden4, 10, name = 'outputs') 

with tf.name_scope('loss'): 
    cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels = (Y_labeled), logits = logits) 
    loss = tf.reduce_mean(cross_entropy, name = 'loss') 

learning_rate = 0.01 

with tf.name_scope('train'): 
    optimizer = tf.train.GradientDescentOptimizer(learning_rate) 
    training_op = optimizer.minimize(loss) 

with tf.name_scope('eval'): 
    correct = tf.nn.in_top_k(logits,Y_labeled, 1) 
    accuracy = tf.reduce_mean(tf.cast(correct, tf.float32)) 

init = tf.global_variables_initializer() 

batch_size = 100 
n_epochs = 50 

with tf.Session() as sess: 
init.run() 
for epoch in range(n_epochs): 
    for iteration in range(50000 // batch_size): 
     X_batch = data[0][iteration*batch_size:(iteration+1)*batch_size] 
     y_batch = data[1][iteration*batch_size:(iteration+1)*batch_size] 
     #X_batch, y_batch = data.train.next_batch(batch_size) 
     sess.run(training_op, feed_dict = {X: X_batch,Y_labeled: y_batch}) 
    acc_train = accuracy.eval(feed_dict = {X: X_batch,Y_labeled: y_batch}) 
    print(epoch, "train accuracy:", acc_train, "loss", loss) 

は、私は4つの隠された層を有する単純なモデルを定義したいです。私がこれを実行すると、エラーなしでコンパイルされ、 "トレーニング"が開始されますが、精度は0.0で、損失は表示されません。私は誤差が精度と損失の計算にあるのか、私のモデルの定義にあるのかは分かりません。

答えて

0

ラベルの送り方に問題があるようです。 placholder Y_labeled = tf.placeholder(tf.int32, [None, 10])を作成すると次元10のベクトルのように見えますが、後でラベルnumpyテンソルlabels = np.zeros(shape = [50000], dtype = int)を作成するとスカラーと思われます。あなたはこのエラーを持っている理由

これは、プレースホルダは次元(batch_size, 10)のテンソルを供給する必要がありますが、私は私がy_labeledどう定義するか変更して、私のエラーを修正するために管理(batch_size, 0)

+0

でそれを養う(形状(なしを持っています(x、[-1,3072])を使ってxの長さを3072の1つのベクトルに変更します。また、tf.squeeze(y_labels)を取り出して置き換えますそれはクロスエントロピーのy_labelsを持っています。これは私のモデルを実行することができますが、それは私に0の精度を与え続けると、それらが不適切に定義されていると私に信じさせる損失を表示しません。 –

関連する問題