我正在研究基本的神经网络分类器。目标是基于3标签数据组训练NN,然后预测值。数据原理图如下:
我的代码提供了垃圾回答。有什么建议吗?
目前的代码如下:
import tensorflow as tf
import numpy as np
#increased the number of epoch
epochs = 100000
# For eq100tion y = b + 0.1, sample data below
myImportedDatax1_np = np.array([[.1],[.1],[.2],[.2],[.3],[.3],[.4],[.4],[.1],[.1],[.2],[.2],],dtype=float)
myImportedDatax2_np = np.array([[.1],[.2],[.1],[.2],[.3],[.4],[.3],[.4],[.3],[.4],[.3],[.4]],dtype=float)
combined_Imported_Data_x = np.append(myImportedDatax1_np, myImportedDatax2_np, axis=1)
myImportedDatay_np = np.array([0,0,0,0,1,1,1,1,2,2,2,2],dtype=int)
number_unique_labels = myImportedDatay_np.max()+1
myImportedDatay_np_one_hot = np.zeros((myImportedDatay_np.size, number_unique_labels))
myImportedDatay_np_one_hot[np.arange(myImportedDatay_np.size),myImportedDatay_np] = 1
print(myImportedDatay_np_one_hot)
x = tf.placeholder(tf.float32, [None, 2], name='x')
y_true = tf.placeholder(tf.float32, [None, number_unique_labels], name='y_true')
nodes_Hidden_Layer_1 = 6
number_Inputs = 2
number_Outputs = 3
W1 = tf.Variable(tf.random_normal([number_Inputs, nodes_Hidden_Layer_1], stddev=0.03), name='W1')
b1 = tf.Variable(tf.random_normal([nodes_Hidden_Layer_1]), name='b1')
W2 = tf.Variable(tf.random_normal([nodes_Hidden_Layer_1, number_Outputs], stddev=0.03), name='W2')
b2 = tf.Variable(tf.random_normal([number_Outputs]), name='b2')
hidden_out = tf.add(tf.matmul(x, W1), b1)
hidden_out = tf.nn.relu(hidden_out)
y_ = (tf.add(tf.matmul(hidden_out, W2), b2))
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true, logits=y_))
optimiser = tf.train.GradientDescentOptimizer(0.7).minimize(cost)
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
# initialise the variables
sess.run(init_op)
for epoch in range(epochs):
_, cost_now = sess.run([optimiser, cost], {x: combined_Imported_Data_x, y_true: myImportedDatay_np_one_hot})
print("Predicted values are:")
print(sess.run(y_, {x: combined_Imported_Data_x}))
答案 0 :(得分:1)
因此,简而言之,代码中缺少的内容如下:
最后,您正在尝试打印y_
,但这是原始的
你不能轻易解释的神经元,这就是为什么它看起来像垃圾,但基本上它是正确的。
您需要通过softmax
传递原始输出,以便将其压缩为可以解释为概率的内容。你的代码通过调用softmax
来通过tf.nn.softmax_cross_entropy_with_logits
,但这最终会在图形的一个单独的分支中出现,这不是你为自己的眼睛打印的东西 - TF得到它cost
计算,但你看不到它
因此,只需单独通过softmax
运行原始输出,然后获取该输出的argmax
。 Argmax
为您提供输入中最大元素的索引,因此基本上是您要查找的类。这最终你需要将其视为预测值。
如果您逐步打印预测的输出,您将看到网络“学习”(基本上是记忆)它是什么 需要做第200次迭代(所以不需要100,000 时代!)。不要忘记,这是一个微不足道的问题 并没有数据集的变化,所以即使你的糟糕6 神经元,网络基本上记住了需要做的事情。 但这可以很好地说明它是如何学习的。
要记住的其他事项要小心:
tf.one_hot()
函数,因此无需手动执行任何操作所以我在代码中添加了一些调整。这是它的样子。我认为这应该没问题:
import tensorflow as tf
import numpy as np
#increased the number of epoch
epochs = 1000
step = 5
# For eq100tion y = b + 0.1, sample data below
myImportedDatax1_np = np.array([[.1],[.1],[.2],[.2],[.3],[.3],[.4],[.4],[.1],[.1],[.2],[.2],],dtype=float)
myImportedDatax2_np = np.array([[.1],[.2],[.1],[.2],[.3],[.4],[.3],[.4],[.3],[.4],[.3],[.4]],dtype=float)
combined_Imported_Data_x = np.append(myImportedDatax1_np, myImportedDatax2_np, axis=1)
myImportedDatay_np = np.array([0,0,0,0,1,1,1,1,2,2,2,2],dtype=int)
number_unique_labels = myImportedDatay_np.max()+1
myImportedDatay_np_one_hot = np.zeros((myImportedDatay_np.size, number_unique_labels))
myImportedDatay_np_one_hot[np.arange(myImportedDatay_np.size),myImportedDatay_np] = 1
print('x {}\n{}\n*****'.format(combined_Imported_Data_x.shape, combined_Imported_Data_x))
print('y {}\n{}\n*****'.format(myImportedDatay_np_one_hot.shape, myImportedDatay_np_one_hot))
x = tf.placeholder(tf.float32, [None, 2], name='x')
y_true = tf.placeholder(tf.float32, [None, number_unique_labels], name='y_true')
nodes_Hidden_Layer_1 = 6
number_Inputs = 2
number_Outputs = 3
W1 = tf.Variable(tf.random_normal([number_Inputs, nodes_Hidden_Layer_1], stddev=0.03), name='W1')
b1 = tf.Variable(tf.random_normal([nodes_Hidden_Layer_1]), name='b1')
W2 = tf.Variable(tf.random_normal([nodes_Hidden_Layer_1, number_Outputs], stddev=0.03), name='W2')
b2 = tf.Variable(tf.random_normal([number_Outputs]), name='b2')
hidden_out = tf.add(tf.matmul(x, W1), b1)
hidden_out = tf.nn.relu(hidden_out)
y_ = (tf.add(tf.matmul(hidden_out, W2), b2))
ys = tf.nn.softmax(y_, name='ys')
pred = tf.argmax(ys, axis=1)
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true, logits=y_))
optimiser = tf.train.GradientDescentOptimizer(0.7).minimize(cost)
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
# initialise the variables
sess.run(init_op)
for epoch in range(epochs):
_, cost_now, p = sess.run([optimiser, cost, pred], {x: combined_Imported_Data_x, y_true: myImportedDatay_np_one_hot})
if epoch % step == 0:
print('Step {}, Predictions: {}'.format(epoch, p))