簡體   English   中英

使用Tensorflow的神經網絡准確性低

[英]Low accuracy in neural network with Tensorflow

我正在研究有關神經網絡的Google代碼實驗室 ,因此決定使用Cifar10數據集而不是MNIST數據集來進行簡單的圖像分類,但是由於某些原因,我的准確性非常低,並且交叉熵很高。

訓練后,准確度約為0.1(永遠不超過0.2),並且交叉熵不會低於230。

我的代碼:

import tensorflow as tf
import numpy as np
import matplotlib as mpt
# Just disables the warning, doesn't enable AVX/FMA
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

def unpickle(file):
    import pickle
    with open(file, 'rb') as fo:
        dict = pickle.load(fo, encoding='bytes')
    return dict

def returnMiniBatch(dictionary,start,number):
    matrix=np.zeros([number,3072],dtype=np.int)
    labels=np.zeros([number],dtype=np.int)
    for i in range(0,number):
        matrix[i]=dictionary[b'data'][i+start]
        labels[i]=dictionary[b'labels'][i+start]
    return matrix,labels

def formatLabels(labels,number):
    lab=np.zeros([number,10])
    for i in range(0,number):
        lab[i][labels[i]]=1
    return lab

data='D:/cifar-10-python/cifar-10-batches-py/data_batch_1'
dictionary=unpickle(data)
tf.set_random_seed(0)

L = 200
M = 100
N = 60
O = 30


X=tf.placeholder(tf.float32,[None,3072])
Y_=tf.placeholder(tf.float32,[None,10])



W1 = tf.Variable(tf.truncated_normal([3072,L],stddev=0.1))
B1 = tf.Variable(tf.ones([L])/10)
W2 = tf.Variable(tf.truncated_normal([L, M], stddev=0.1))
B2 = tf.Variable(tf.ones([M])/10)
W3 = tf.Variable(tf.truncated_normal([M, N], stddev=0.1))
B3 = tf.Variable(tf.ones([N])/10)
W4 = tf.Variable(tf.truncated_normal([N, O], stddev=0.1))
B4 = tf.Variable(tf.ones([O])/10)
W5 = tf.Variable(tf.truncated_normal([O, 10], stddev=0.1))
B5 = tf.Variable(tf.ones([10]))

Y1 = tf.nn.relu(tf.matmul(X, W1) + B1)
Y2 = tf.nn.relu(tf.matmul(Y1, W2) + B2)
Y3 = tf.nn.relu(tf.matmul(Y2, W3) + B3)
Y4 = tf.nn.relu(tf.matmul(Y3, W4) + B4)


Ylogits = tf.matmul(Y4, W5) + B5
Y = tf.nn.softmax(Ylogits)

cross_entropy = tf.nn.softmax_cross_entropy_with_logits(logits=Ylogits,         
                labels=Y_)
cross_entropy = tf.reduce_mean(cross_entropy)*100

correct_prediction=tf.equal(tf.argmax(Y,1),tf.argmax(Y_,1))
accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))

train_step = tf.train.AdamOptimizer(0.003).minimize(cross_entropy)

init=tf.global_variables_initializer()
sess=tf.Session()
sess.run(init)

def training_step(i):
    global dictionary
    val,lab=returnMiniBatch(dictionary,i * 100,100)
    Ylabels=formatLabels(lab,100)
    _,a,c = sess.run([train_step,accuracy, cross_entropy], feed_dict={X: 
                     val, Y_: Ylabels})
    print("Accuracy: ",a)
    print("Cross-Entropy",c)

for i in range (0,100):
    training_step(i%100)

如果我沒記錯的話,那看起來就像是一個非卷積網絡。 您需要尋找卷積網絡體系結構。 因此,請尋找一些使用conv2d的教程。

原因:MNIST是單通道二進制數據。 CIFAR是8色的3通道(RGB)。 僅增加輸入占位符的大小是不夠的。 您需要告訴網絡這三個通道(和相鄰像素)是相關的。 您可以通過使用卷積網絡體系結構來做到這一點。

0.1表示沒有比隨機機會好。 網絡沒有學到任何可以概括的東西。

解決方案是對輸入數據進行標准化。 我添加了一個新功能來規范化數據

def formatData(values):
    ret = values.reshape(100,3072).astype("float32")
    ret/=255
    return ret

並格式化數據,然后再將其添加到Feed字典中。

X_Data=formatData(val)
    _,a,c = sess.run([train_step,accuracy, cross_entropy], feed_dict={X: 
                     X_Data, Y_: Ylabels})

更改之后,網絡開始正確學習(卷積網絡在Pam指示出來的情況下仍然是更好的選擇)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM