使用 MNIST 数据进行分类的损失在每个时期都保持大致相同
Loss for classification using MNIST data stays around the same through every epoch
import numpy as np
import tensorflow as tf
import pandas as pd
data = pd.read_csv('mnist_train.csv')
X = data.drop('label', axis=1).values
y = data['label'].values
with tf.Session() as sess:
Y = tf.one_hot(y, 10).eval()
hidden = [5, 4, 3]
def costa(y, yhat):
loss = tf.nn.softmax_cross_entropy_with_logits_v2(logits=yhat, labels=y)
loss = tf.reduce_sum(loss)
return loss
def train(cost):
train_op = tf.train.GradientDescentOptimizer(0.0001).minimize(cost)
return train_op
with tf.Graph().as_default():
X1 = tf.placeholder(tf.float32, [None, 784])
y1 = tf.placeholder(tf.float32, [None, 10])
w1 = tf.Variable(tf.random_normal((784, hidden[0])))
w2 = tf.Variable(tf.random_normal((hidden[0], hidden[1])))
w3 = tf.Variable(tf.random_normal((hidden[1], hidden[2])))
wo = tf.Variable(tf.random_normal((hidden[2], 10)))
b1 = tf.Variable(tf.random_normal((1, hidden[0])))
b2 = tf.Variable(tf.random_normal((1, hidden[1])))
b3 = tf.Variable(tf.random_normal((1, hidden[2])))
bo = tf.Variable(tf.random_normal((1, 10)))
layer1 = tf.nn.relu(tf.matmul(X1, w1) + b1)
layer2 = tf.nn.relu(tf.matmul(layer1, w2) + b2)
layer3 = tf.nn.relu(tf.matmul(layer2, w3) + b3)
layerout = (tf.matmul(layer3, wo) + bo)
yhat = layerout
cost = costa(y1, yhat)
train_op = train(cost)
init_op = tf.global_variables_initializer()
for epoch in range(1000):
with tf.Session() as sess:
sess.run(init_op)
sess.run(train_op, feed_dict={X1:X, y1:Y})
loss = sess.run(cost, feed_dict={X1:X, y1:Y})
print("Loss for epoch {}: {}".format(epoch, loss))
损失基本保持不变,上下跳动很多,但并没有相应减少。
我似乎找不到这里出了什么问题,我们将不胜感激。
是对层的激活还是我弄错了成本函数?
这里有几个问题:
- 你每个时代都是运行
sess.run(init_op)
。这意味着模型参数在每个时期都被重置为随机数,因此将无法学习。尝试将此操作放在 for epoch in range(1000)
之前
您每个时期都在创建一个新会话。更改您的代码,使其看起来像这样:
with tf.Session() as sess:
sess.run(init_op)
for epoch in range(1000):
sess.run(train_op, feed_dict={X1:X, y1:Y})
loss = sess.run(cost, feed_dict={X1:X, y1:Y})
print("Loss for epoch {}: {}".format(epoch, loss))
好吧,稍微调整一下就成功了,我改为使用 RMSPropOptimizer,损失开始按预期减少。
我仍然需要弄清楚为什么会这样,我还在学习,但现在这是我的解决方案。
虽然损失减少的很慢。
用 (2.0/neurons_in_prev_layer)**0.5
的标准偏差初始化权重对我来说就像一个魅力!
还将隐藏层更改为 2 个隐藏层 256 个 256 个神经元。
import numpy as np
import tensorflow as tf
import pandas as pd
data = pd.read_csv('mnist_train.csv')
X = data.drop('label', axis=1).values
y = data['label'].values
with tf.Session() as sess:
Y = tf.one_hot(y, 10).eval()
hidden = [5, 4, 3]
def costa(y, yhat):
loss = tf.nn.softmax_cross_entropy_with_logits_v2(logits=yhat, labels=y)
loss = tf.reduce_sum(loss)
return loss
def train(cost):
train_op = tf.train.GradientDescentOptimizer(0.0001).minimize(cost)
return train_op
with tf.Graph().as_default():
X1 = tf.placeholder(tf.float32, [None, 784])
y1 = tf.placeholder(tf.float32, [None, 10])
w1 = tf.Variable(tf.random_normal((784, hidden[0])))
w2 = tf.Variable(tf.random_normal((hidden[0], hidden[1])))
w3 = tf.Variable(tf.random_normal((hidden[1], hidden[2])))
wo = tf.Variable(tf.random_normal((hidden[2], 10)))
b1 = tf.Variable(tf.random_normal((1, hidden[0])))
b2 = tf.Variable(tf.random_normal((1, hidden[1])))
b3 = tf.Variable(tf.random_normal((1, hidden[2])))
bo = tf.Variable(tf.random_normal((1, 10)))
layer1 = tf.nn.relu(tf.matmul(X1, w1) + b1)
layer2 = tf.nn.relu(tf.matmul(layer1, w2) + b2)
layer3 = tf.nn.relu(tf.matmul(layer2, w3) + b3)
layerout = (tf.matmul(layer3, wo) + bo)
yhat = layerout
cost = costa(y1, yhat)
train_op = train(cost)
init_op = tf.global_variables_initializer()
for epoch in range(1000):
with tf.Session() as sess:
sess.run(init_op)
sess.run(train_op, feed_dict={X1:X, y1:Y})
loss = sess.run(cost, feed_dict={X1:X, y1:Y})
print("Loss for epoch {}: {}".format(epoch, loss))
损失基本保持不变,上下跳动很多,但并没有相应减少。
我似乎找不到这里出了什么问题,我们将不胜感激。
是对层的激活还是我弄错了成本函数?
这里有几个问题:
- 你每个时代都是运行
sess.run(init_op)
。这意味着模型参数在每个时期都被重置为随机数,因此将无法学习。尝试将此操作放在for epoch in range(1000)
之前
您每个时期都在创建一个新会话。更改您的代码,使其看起来像这样:
with tf.Session() as sess: sess.run(init_op) for epoch in range(1000): sess.run(train_op, feed_dict={X1:X, y1:Y}) loss = sess.run(cost, feed_dict={X1:X, y1:Y}) print("Loss for epoch {}: {}".format(epoch, loss))
好吧,稍微调整一下就成功了,我改为使用 RMSPropOptimizer,损失开始按预期减少。
我仍然需要弄清楚为什么会这样,我还在学习,但现在这是我的解决方案。
虽然损失减少的很慢。
用 (2.0/neurons_in_prev_layer)**0.5
的标准偏差初始化权重对我来说就像一个魅力!
还将隐藏层更改为 2 个隐藏层 256 个 256 个神经元。