使用张量流,损失不会低于 ~60,测试精度永远不会超过 ~40%



>问题

在 Tensorflow 上使用 DNNClassifier,我永远无法将损失低于 60 左右,测试准确度高于 40% 左右。我以前遇到过一个问题,我的测试准确率几乎定在 25%,但在规范化我的所有输入后,我能够将我的测试准确度提高一点,但并不多。

数据

关于这些数据,你需要知道的是我有大约127,000条犯罪率数据记录。 15 个功能和一个标签。网络的目的是将它们分类为正确的人口四分位数(基于每个县的人口(,因此输出标签仅为 4 类 (0-3(。

代码

import pandas as pd
import tensorflow as tf
import os
dir_path = os.path.dirname(os.path.realpath(__file__))
csv_path = dir_path + "/testing.csv"
CSV_COLUMN_NAMES = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '15', 'Quartile']

def load_data():
all = pd.read_csv(csv_path, names=CSV_COLUMN_NAMES, header=0).sample(frac=1)
x = all.drop(['Quartile'], axis=1)
y = all[['Quartile']].copy()
size = x.shape[0]
cutoff = int(0.75*size)
train_x = x.head(cutoff)
train_y = y.head(cutoff)
test_x = x.tail(size-cutoff)
test_y = y.tail(size-cutoff)
return (train_x, train_y), (test_x, test_y)

def train_input_fn(features, labels, batch_size):
dataset = tf.data.Dataset.from_tensor_slices((dict(features), labels))
dataset = dataset.shuffle(1000).repeat().batch(batch_size)
return dataset

def eval_input_fn(features, labels, batch_size):
features=dict(features)
if labels is None:
inputs = features
else:
inputs = (features, labels)
dataset = tf.data.Dataset.from_tensor_slices(inputs)
assert batch_size is not None, "batch_size must not be None"
dataset = dataset.batch(batch_size)
return dataset

def main(argv):
batch_size = 50
(train_x, train_y), (test_x, test_y) = load_data()
my_feature_columns = []
for key in train_x.keys():
my_feature_columns.append(tf.feature_column.numeric_column(key=key))
classifier = tf.estimator.DNNClassifier(
feature_columns=my_feature_columns,
hidden_units=[10, 10],
optimizer=tf.train.GradientDescentOptimizer(0.001),
n_classes=4)
# training
classifier.train(
input_fn=lambda:train_input_fn(train_x, train_y, batch_size), steps=5000)
# testing
eval_result = classifier.evaluate(
input_fn=lambda:eval_input_fn(test_x, test_y, batch_size))
print('nTest set accuracy: {accuracy:0.3f}n'.format(**eval_result))

if __name__ == '__main__':
tf.logging.set_verbosity(tf.logging.INFO)
tf.app.run(main)

我尝试过什么

  • 梯度下降优化器中弄乱我的学习率
  • 将损失减少更改为MEAN,而不是默认为SUM
  • 更改我的步长(甚至高达 100000
  • ! 仅尝试一个隐藏层(大小:
  • 10(和两个隐藏层(大小:各 90
  • (

我希望你们能够提出我的神经网络似乎停滞不前的任何可能原因。谢谢!

您可以查看以下方向:

  • 深入网络,隐藏单元的数量就越少(例如,10 - 5 个,但不是 10 - 10(。
  • 使用 Adam 而不是(随机(梯度下降,或尝试另一种一阶优化方法。
  • 将批大小增加到2的幂(64、128、256 等(。

最新更新