【发布时间】:2018-10-05 14:41:23
【问题描述】:
我正在训练一个分类器,它接受一个 RGB 输入(所以三个 0 到 255 值)并返回黑色或白色(0 或 1)字体是否最适合该颜色。训练后,我的分类器总是返回 0.5(或大约),并且永远不会比这更准确。
代码如下:
import tensorflow as tf
import numpy as np
from tqdm import tqdm
print('Creating Datasets:')
x_train = []
y_train = []
for i in tqdm(range(10000)):
x_train.append([np.random.uniform(0, 255), np.random.uniform(0, 255), np.random.uniform(0, 255)])
for elem in tqdm(x_train):
if (((elem[0] + elem[1] + elem[2]) / 3) / 255) > 0.5:
y_train.append(0)
else:
y_train.append(1)
x_train = np.array(x_train)
y_train = np.array(y_train)
graph = tf.Graph()
with graph.as_default():
x = tf.placeholder(tf.float32)
y = tf.placeholder(tf.float32)
w_1 = tf.Variable(tf.random_normal([3, 10], stddev=1.0), tf.float32)
b_1 = tf.Variable(tf.random_normal([10]), tf.float32)
l_1 = tf.sigmoid(tf.matmul(x, w_1) + b_1)
w_2 = tf.Variable(tf.random_normal([10, 10], stddev=1.0), tf.float32)
b_2 = tf.Variable(tf.random_normal([10]), tf.float32)
l_2 = tf.sigmoid(tf.matmul(l_1, w_2) + b_2)
w_3 = tf.Variable(tf.random_normal([10, 5], stddev=1.0), tf.float32)
b_3 = tf.Variable(tf.random_normal([5]), tf.float32)
l_3 = tf.sigmoid(tf.matmul(l_2, w_3) + b_3)
w_4 = tf.Variable(tf.random_normal([5, 1], stddev=1.0), tf.float32)
b_4 = tf.Variable(tf.random_normal([1]), tf.float32)
y_ = tf.sigmoid(tf.matmul(l_3, w_4) + b_4)
loss = tf.reduce_mean(tf.squared_difference(y, y_))
optimizer = tf.train.AdadeltaOptimizer().minimize(loss)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print('Training:')
for step in tqdm(range(5000)):
index = np.random.randint(0, len(x_train) - 129)
feed_dict = {x : x_train[index:index+128], y : y_train[index:index+128]}
sess.run(optimizer, feed_dict=feed_dict)
if step % 1000 == 0:
print(sess.run([loss], feed_dict=feed_dict))
while True:
inp1 = int(input(''))
inp2 = int(input(''))
inp3 = int(input(''))
print(sess.run(y_, feed_dict={x : [[inp1, inp2, inp3]]}))
如您所见,我首先导入将要使用的模块。接下来我生成我的输入 x 数据集和所需的输出 y 数据集。 x_train 数据集由 10000 个随机 RGB 值组成,而 y_train 数据集由 0 和 1 组成,其中 1 对应于均值低于 128 的 RGB 值,0 对应于均值高于 128 的 RGB 值(这确保明亮的背景得到深色字体,反之亦然)。
无可否认,我的神经网络过于复杂(或者我假设如此),但据我所知,它是一个非常标准的前馈网络,具有 Adadelta 优化器和默认学习率。
就我有限的知识而言,网络的训练是正常的,但模型总是吐出 0.5。
最后一段代码允许用户输入值并查看它们在传递到神经网络时会变成什么。
我弄乱了不同的激活函数、损失、初始化偏差的方法等。但无济于事。有时当我修改代码时,模型总是分别返回 1 或 0,但这仍然与优柔寡断并一遍又一遍地返回 0.5 一样不准确。我无法在网上找到合适的解决方案来解决我的问题。欢迎任何意见或建议。
编辑:
损失、权重、偏差和输出在训练过程中变化不大(权重和偏差每 1000 次迭代仅变化百分之一和千分之一,损失在 0.3 左右波动)。此外,输出有时会根据输入变化 f(如您所料),但其他时间是恒定的。该程序的一次运行导致常量 0.7 作为输出,而另一次总是返回 0.5,除了非常接近于零,它返回 0.3 或 0.4 类型值。上述都不是所需的输出。应该发生的是 (255, 255, 255) 应该映射到 0 并且 (0, 0, 0) 应该映射到 1 并且 (128, 128, 128) 应该映射到 1 或 0,如在字体中间颜色并不重要。
【问题讨论】:
-
你的体重有变化吗?你的损失表现如何?你的梯度发散了吗?提供更多信息,以便我们为您提供帮助
-
损失收敛了吗?打印训练数据的分类时会发生什么?
-
查看我的回答 here,它提供了一个
debug_minimize函数来查看您的权重是否发生了变化
标签: python tensorflow machine-learning