2017-04-30 2 views
0
import tensorflow as tf 
import numpy as np 
import matplotlib.pyplot as plt 

Nclass = 500 
D = 2 
M = 3 
K = 3 

X1 = np.random.randn(Nclass, D) + np.array([0, -2]) 
X2 = np.random.randn(Nclass, D) + np.array([2, 2]) 
X3 = np.random.randn(Nclass, D) + np.array([-2, 2]) 
X = np.vstack ([X1, X2, X3]).astype(np.float32) 

Y = np.array([0]*Nclass + [1]*Nclass + [2]*Nclass) 

plt.scatter(X[:,0], X[:,1], c=Y, s=100, alpha=0.5) 
plt.show() 

N = len(Y) 

T = np.zeros((N, K)) 
for i in range(N): 
    T[i, Y[i]] = 1 

def init_weights(shape): 
    return tf.Variable(tf.random_normal(shape, stddev=0.01)) 

def forward(X, W1, b1, W2, b2): 
    Z = tf.nn.sigmoid(tf.matmul(X, W1) + b1) 
    return tf.matmul(Z, W2) + b2 

tfX = tf.placeholder(tf.float32, [None, D]) 
tfY = tf.placeholder(tf.float32, [None, K]) 

W1 = init_weights([D, M]) 
b1 = init_weights([M]) 
W2 = init_weights([M, K]) 
b2 = init_weights([K]) 

py_x = forward(tfX, W1, b1, W2, b2) 

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=py_x, logits=T)) 

train_op = tf.train.GradientDescentOptimizer(0.05).minimize(cost) 
predict_op = tf.argmax(py_x, 1) 

sess = tf.Session() 
inti = tf.initizalize_all_variables() 

for i in range(1000): 
    sess.run(train_op, feed_dict={tfX: X, tfY: T}) 
    pred = sess.run(predict_op, feed_dict={tfX: X, tfY: T}) 
    if i % 10 == 0: 
     print(np.mean(Y == pred)) 

ich ein kleines Problem haben:Keine für jede Variable bereitgestellt Gradienten

Traceback (most recent call last): 
    File "test.py", line 45, in <module> 
    train_op = tf.train.GradientDescentOptimizer(0.05).minimize(cost) 
    File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/training/optimizer.py", line 322, in minimize 
    ([str(v) for _, v in grads_and_vars], loss)) 
ValueError: No gradients provided for any variable, check your graph for ops that do not support gradients, between variables ["<tf.Variable 'Variable:0' shape=(2, 3) dtype=float32_ref>", "<tf.Variable 'Variable_1:0' shape=(3,) dtype=float32_ref>", "<tf.Variable 'Variable_2:0' shape=(3, 3) dtype=float32_ref>", "<tf.Variable 'Variable_3:0' shape=(3,) dtype=float32_ref>"] and loss Tensor("Mean:0", shape=(), dtype=float64). 

Es ist unklar, was ich habe hier zu tun. Kann mir jetzt jemand helfen?

Antwort

0

Wenn T sind die wahren Etiketten und py_x die Netzausgänge, werden Sie die Argumente in der Kreuzentropie Funktion wechseln müssen:

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=T, logits=py_x)) 

Die Logits müssen die Netzwerk-Ausgänge und die Etiketten müssen das wahr sein Etiketten. Wenn Sie die Argumente verwechseln, kann das Optimierungsprogramm nicht zurückgespreizt werden, da kein Farbverlauf vorhanden ist. Sie müssen Ihre Variablen auch vor dem Training initialisieren; Ihr Code eine sess.run (init) Aussage fehlt (Sie hatte auch einen Tippfehler in Ihrem initialize_all_variables() ich Ihre Daten auch gemischt;.. vielleicht wird es auf den Etiketten zu einer schnelleren Konvergenz führen

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

Nclass = 500 
D = 2 
M = 3 
K = 3 

X1 = np.random.randn(Nclass, D) + np.array([0, -2]) 
X2 = np.random.randn(Nclass, D) + np.array([2, 2]) 
X3 = np.random.randn(Nclass, D) + np.array([-2, 2]) 
X = np.vstack ([X1, X2, X3]).astype(np.float32) 
Y = np.array([0]*Nclass + [1]*Nclass + [2]*Nclass) 
perm = np.random.permutation(len(X)) 
X = X[perm] 
Y = Y[perm] 


# plt.scatter(X[:,0], X[:,1], c=Y, s=100, alpha=0.5) 
# plt.show() 

N = len(Y) 

T = np.zeros((N, K)) 
for i in range(N): 
    T[i, Y[i]] = 1 
print(T) 

def init_weights(shape): 
    return tf.Variable(tf.random_normal(shape, stddev=0.01)) 

def forward(X, W1, b1, W2, b2): 
    Z = tf.nn.sigmoid(tf.matmul(X, W1) + b1) 
    return tf.matmul(Z, W2) + b2 

tfX = tf.placeholder(tf.float32, [None, D]) 
tfY = tf.placeholder(tf.float32, [None, K]) 

W1 = init_weights([D, M]) 
b1 = init_weights([M]) 
W2 = init_weights([M, K]) 
b2 = init_weights([K]) 

py_x = forward(tfX, W1, b1, W2, b2) 

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=T, logits=py_x)) 

train_op = tf.train.GradientDescentOptimizer(0.1).minimize(cost) 
predict_op = tf.argmax(py_x, 1) 

sess = tf.Session() 
init = tf.initialize_all_variables() 

sess.run(init) 
for i in range(1000): 
    sess.run(train_op, feed_dict={tfX: X, tfY: T}) 
    pred = sess.run(predict_op, feed_dict={tfX: X, tfY: T}) 
    if i % 10 == 0: 
     print(np.mean(Y == pred)) 
Verwandte Themen