神经网络 - 仅使用输出层中的一个神经元预测 MNIST 数字
neural network - Predict MNIST digits only with one neuron in the output layer
是否可以创建一个神经网络,我们在输出层中有一个神经元,可以在训练后直接从 NMIST 数据集中预测数字。例如,如果我们给数字 3 作为输入,输出层神经元应该给出接近 3 的输出值。
注意:可能有任意数量的神经元和任意数量的隐藏层。
提前致谢。
这是我使用 Tensorflow 尝试过的。
import tensorflow as tf
from mnist import MNIST
import numpy as np
inputs = tf.placeholder(tf.float32, shape=(1, 784))
labels = tf.placeholder(tf.float32, shape=(1, 1))
logits = tf.layers.dense(inputs, 1)
loss = 9.0 * tf.sigmoid(logits) - labels # As we want predicted value in [0 - 9]
train_op = tf.train.GradientDescentOptimizer(0.01).minimize(loss)
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
mnist = MNIST()
for i in range(100001):
data, label = mnist.get_train_data()
lab = np.zeros((1,1), np.float32)
lab[0][0] = label
_, _loss, _logits= sess.run([train_op, loss, logits], feed_dict={inputs: np.reshape(data, (1, 784)), labels: lab})
if i%5000 == 0:
print("Step: %d Loss: %6f <== logits %s, Actual: %6f" % (i, _loss, str(_logits), label))
Step: 0 Loss: -0.436195 <== logits [[ 0.02835961]], Actual: 5.000000
Step: 5000 Loss: -6.999933 <== logits [[-11.80182171]], Actual: 7.000000
Step: 10000 Loss: -2.999990 <== logits [[-13.7065649]], Actual: 3.000000
Step: 15000 Loss: -4.999864 <== logits [[-11.09644413]], Actual: 5.000000
Step: 20000 Loss: -5.000000 <== logits [[-17.01583481]], Actual: 5.000000
Step: 25000 Loss: -2.999971 <== logits [[-12.66251564]], Actual: 3.000000
Step: 30000 Loss: -2.999927 <== logits [[-11.72266102]], Actual: 3.000000
Step: 35000 Loss: -0.999898 <== logits [[-11.38729763]], Actual: 1.000000
Step: 40000 Loss: -7.000000 <== logits [[-17.59585381]], Actual: 7.000000
Step: 45000 Loss: -3.000000 <== logits [[-17.72655296]], Actual: 3.000000
Step: 50000 Loss: -5.000000 <== logits [[-16.65830421]], Actual: 5.000000
Step: 55000 Loss: -6.999999 <== logits [[-15.97771645]], Actual: 7.000000
Step: 60000 Loss: -3.000000 <== logits [[-17.10641289]], Actual: 3.000000
Step: 65000 Loss: -4.999984 <== logits [[-13.26896667]], Actual: 5.000000
Step: 70000 Loss: -5.000000 <== logits [[-19.57778549]], Actual: 5.000000
Step: 75000 Loss: -2.999995 <== logits [[-14.30502892]], Actual: 3.000000
Step: 80000 Loss: -2.999982 <== logits [[-13.13857365]], Actual: 3.000000
Step: 85000 Loss: -0.999971 <== logits [[-12.63682747]], Actual: 1.000000
Step: 90000 Loss: -7.000000 <== logits [[-19.08620071]], Actual: 7.000000
Step: 95000 Loss: -3.000000 <== logits [[-19.23719406]], Actual: 3.000000
Step: 100000 Loss: -5.000000 <== logits [[-17.85402298]], Actual: 5.000000
当然可以,但这不是一个好主意。数字识别是一个分类问题。通过仅使用单个输出神经元,您建议将其视为回归问题。您所做的隐含假设是数值上彼此接近的数字也 看起来 相似。显然不是这样。例如,3
和 5
看起来比 3
和 4
更相似,因为底部是相同的。
我同意@Geerth,但只想补充一点。确实,如果您使用回归模型而不是分类,这是真实的。但是回归模型假定您的输入是有序的(您可以使用任何顺序,例如 1,2,3.... 或 1,3,2,5,4 或任何其他顺序,您的模型将具有不同的参数)。
"Introduction to Statistical Learning" 这本书有一些很好的想法(而且是免费的)。
是否可以创建一个神经网络,我们在输出层中有一个神经元,可以在训练后直接从 NMIST 数据集中预测数字。例如,如果我们给数字 3 作为输入,输出层神经元应该给出接近 3 的输出值。
注意:可能有任意数量的神经元和任意数量的隐藏层。
提前致谢。
这是我使用 Tensorflow 尝试过的。
import tensorflow as tf
from mnist import MNIST
import numpy as np
inputs = tf.placeholder(tf.float32, shape=(1, 784))
labels = tf.placeholder(tf.float32, shape=(1, 1))
logits = tf.layers.dense(inputs, 1)
loss = 9.0 * tf.sigmoid(logits) - labels # As we want predicted value in [0 - 9]
train_op = tf.train.GradientDescentOptimizer(0.01).minimize(loss)
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
mnist = MNIST()
for i in range(100001):
data, label = mnist.get_train_data()
lab = np.zeros((1,1), np.float32)
lab[0][0] = label
_, _loss, _logits= sess.run([train_op, loss, logits], feed_dict={inputs: np.reshape(data, (1, 784)), labels: lab})
if i%5000 == 0:
print("Step: %d Loss: %6f <== logits %s, Actual: %6f" % (i, _loss, str(_logits), label))
Step: 0 Loss: -0.436195 <== logits [[ 0.02835961]], Actual: 5.000000
Step: 5000 Loss: -6.999933 <== logits [[-11.80182171]], Actual: 7.000000
Step: 10000 Loss: -2.999990 <== logits [[-13.7065649]], Actual: 3.000000
Step: 15000 Loss: -4.999864 <== logits [[-11.09644413]], Actual: 5.000000
Step: 20000 Loss: -5.000000 <== logits [[-17.01583481]], Actual: 5.000000
Step: 25000 Loss: -2.999971 <== logits [[-12.66251564]], Actual: 3.000000
Step: 30000 Loss: -2.999927 <== logits [[-11.72266102]], Actual: 3.000000
Step: 35000 Loss: -0.999898 <== logits [[-11.38729763]], Actual: 1.000000
Step: 40000 Loss: -7.000000 <== logits [[-17.59585381]], Actual: 7.000000
Step: 45000 Loss: -3.000000 <== logits [[-17.72655296]], Actual: 3.000000
Step: 50000 Loss: -5.000000 <== logits [[-16.65830421]], Actual: 5.000000
Step: 55000 Loss: -6.999999 <== logits [[-15.97771645]], Actual: 7.000000
Step: 60000 Loss: -3.000000 <== logits [[-17.10641289]], Actual: 3.000000
Step: 65000 Loss: -4.999984 <== logits [[-13.26896667]], Actual: 5.000000
Step: 70000 Loss: -5.000000 <== logits [[-19.57778549]], Actual: 5.000000
Step: 75000 Loss: -2.999995 <== logits [[-14.30502892]], Actual: 3.000000
Step: 80000 Loss: -2.999982 <== logits [[-13.13857365]], Actual: 3.000000
Step: 85000 Loss: -0.999971 <== logits [[-12.63682747]], Actual: 1.000000
Step: 90000 Loss: -7.000000 <== logits [[-19.08620071]], Actual: 7.000000
Step: 95000 Loss: -3.000000 <== logits [[-19.23719406]], Actual: 3.000000
Step: 100000 Loss: -5.000000 <== logits [[-17.85402298]], Actual: 5.000000
当然可以,但这不是一个好主意。数字识别是一个分类问题。通过仅使用单个输出神经元,您建议将其视为回归问题。您所做的隐含假设是数值上彼此接近的数字也 看起来 相似。显然不是这样。例如,3
和 5
看起来比 3
和 4
更相似,因为底部是相同的。
我同意@Geerth,但只想补充一点。确实,如果您使用回归模型而不是分类,这是真实的。但是回归模型假定您的输入是有序的(您可以使用任何顺序,例如 1,2,3.... 或 1,3,2,5,4 或任何其他顺序,您的模型将具有不同的参数)。 "Introduction to Statistical Learning" 这本书有一些很好的想法(而且是免费的)。