【问题标题】:My neural network has a very bad accuracy我的神经网络的准确性很差
【发布时间】:2020-06-03 21:17:11
【问题描述】:

import tensorflow as tf
import pandas as pd
import numpy as np
import matplotlib as plt
from sklearn.model_selection import train_test_split
from tensorflow import keras
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
import functools

COLUMNS = ["Alter", "Gender", "BMI", "Fever", "Nausea", "Fatigue",
                  "WBC", "RBC", "HGB", "Plat", "AST1", "ALT1", "ALT4", "ALT12", "ALT24", "ALT36", "ALT48", "ALT24w",
                  "RNABase", "RNA4", "Baseline", "Endstage"]

feature_name = COLUMNS[:-1]
LABEL_NAME = 'Endstage'

batch_size = 32

def get_dataset(file_path, **kwargs):
    train_dataset = tf.data.experimental.make_csv_dataset(
        file_path,
        batch_size = batch_size,
        label_name = LABEL_NAME,
        ignore_errors=True,
        num_epochs=5,
        **kwargs
    )
    return train_dataset

train_data = get_dataset("HCVnew.csv")


def show_batch(dataset):
  for batch, label in dataset.take(1):
    for key, value in batch.items():
      print("{:20s}: {}".format(key,value.numpy()))



SELECT_COLUMNS = ["Alter", "Gender", "BMI", "Fever", "Nausea", "Fatigue",
                  "WBC", "RBC", "HGB", "Plat", "AST1", "ALT1", "ALT4", "ALT12", "ALT24", "ALT36", "ALT48", "ALT24w",
                  "RNABase", "RNA4", "Baseline", "Endstage"]

DEFAULTS = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
            0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]

uni_data = get_dataset("HCVnew.csv", select_columns = SELECT_COLUMNS, column_defaults = DEFAULTS)



def pack(features, label):
  return tf.stack(list(features.values()), axis=-1), label

packed_dataset = uni_data.map(pack)
"""
for features, labels in packed_dataset.take(1):
  print(features.numpy())
  print()
  print(labels.numpy())
"""


class PackNumericFeatures(object):
  def __init__(self, names):
    self.names = names

  def __call__(self, features, labels):
    numeric_features = [features.pop(name) for name in self.names]
    numeric_features = [tf.cast(feat, tf.float32) for feat in numeric_features]
    numeric_features = tf.stack(numeric_features, axis=-1)
    features['numeric'] = numeric_features

    return features, labels

NUMERIC_FEATURES = ["Alter", "Gender", "BMI", "Fever", "Nausea", "Fatigue",
                  "WBC", "RBC", "HGB", "Plat", "AST1", "ALT1", "ALT4", "ALT12", "ALT24", "ALT36", "ALT48", "ALT24w",
                  "RNABase", "RNA4", "Baseline"]

packed_train_data = train_data.map(
    PackNumericFeatures(NUMERIC_FEATURES))

#show_batch(packed_train_data)

desc = pd.read_csv("HCVnew.csv")[NUMERIC_FEATURES].describe()
desc

MEAN = np.array(desc.T['mean'])
STD = np.array(desc.T['std'])

def normalize_numeric_data(data, mean, std):
  # Center the data
  return (data-mean)/std

normalizer = functools.partial(normalize_numeric_data, mean=MEAN, std=STD)

numeric_column = tf.feature_column.numeric_column('numeric', normalizer_fn=normalizer, shape=[len(NUMERIC_FEATURES)])
numeric_columns = [numeric_column]

numeric_layer = tf.keras.layers.DenseFeatures(numeric_columns)

#preprocessing_layer = tf.keras.layers.DenseFeatures(numeric_columns)

model = tf.keras.Sequential([
  numeric_layer,
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dense(1),
])

model.compile(
    loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
    optimizer='adam',
    metrics=['accuracy'])

train_data = packed_train_data.shuffle(500)

model.fit(train_data, epochs=20)

我的神经网络有 25% 的准确率,非常糟糕。我的训练数据包含 1200 个样本,但在一两个 epoch 之后,准确率仍然保持在 25%,我尝试更改批量大小和 epoch 数量,但没有任何效果。标签数量为 4(1、2、3、4)。 如果有人知道我可以改进什么,请告诉我。 非常感谢您的帮助!

【问题讨论】:

  • 它不是 python,也不是 numpy 或 tensorflow 相关的东西。您的特征可能无法很好地表征您的数据,或者所选算法不适合该问题。此外,您可能需要调整所选算法的参数。这绝对不是python相关的

标签: python numpy tensorflow keras neural-network


【解决方案1】:

标签数量为4(1、2、3、4)

如果您有 4 个标签,那么这不是一个二元问题,因此您需要使您的网络适应多标签分类:

  • 一个热编码您的标签
  • 使用具有 NB_CLASS 神经元(在您的情况下为 4 个)和 Softmax 激活的最后一个 Dense 层
  • 使用 categorical_crossentropy 作为损失

如果你使用这样的密集层:

tf.keras.layers.Dense(1)

它将具有默认参数,在这种情况下具有线性激活,这不是您在二元或多标签分类中想要的。

【讨论】:

  • 非常感谢您的快速回复!因为,正如你所清楚看到的,我对神经网络很陌生,像你这样的 cmets 对我来说是液体黄金!如果您知道任何可以准确解释此类内容的好平台,请告诉我。再次感谢您的帮助!
  • 很高兴为您提供帮助!您可以从这个链接开始:cs231n.github.io。正如你所说,这门课程是“液态黄金”;)
猜你喜欢
  • 1970-01-01
  • 2017-08-31
  • 1970-01-01
  • 2018-04-10
  • 2017-07-05
  • 1970-01-01
  • 2019-01-07
  • 2018-06-05
  • 2017-11-17
相关资源
最近更新 更多