【问题标题】:Tensorflow model predicting Nans预测 Nans 的 TensorFlow 模型
【发布时间】:2020-11-04 18:32:26
【问题描述】:

我是 TensorFlow 框架的新手,我正在尝试应用 Tensorflow 来根据这个泰坦尼克号数据集预测幸存者:https://www.kaggle.com/c/titanic/data。

import tensorflow as tf
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
#%%
titanictrain = pd.read_csv('train.csv')
titanictest = pd.read_csv('test.csv')
df = pd.concat([titanictrain,titanictest],join='outer',keys='PassengerId',sort=False,ignore_index=True).drop(['Name'],1)

#%%

def preprocess(df):
    df['Fare'].fillna(value=df.groupby('Pclass')['Fare'].transform('median'),inplace=True)
    df['Fare'] = df['Fare'].map(lambda x: np.log(x) if x>0 else 0)
    df['Embarked'].fillna(value=df['Embarked'].mode()[0],inplace=True)
    df['CabinAlphabet'] = df['Cabin'].str[0]
    categories_to_one_hot = ['Pclass','Sex','Embarked','CabinAlphabet']
    df = pd.get_dummies(df,columns=categories_to_one_hot,drop_first=True)
    return df
df = preprocess(df)

df = df.drop(['PassengerId','Ticket','Cabin','Survived'],1)

titanic_trainandval = df.iloc[:len(titanictrain)]
titanic_test = df.iloc[len(titanictrain):] #test after preprocessing

titanic_test.head()

#  split train into training and validation set
labels = titanictrain['Survived']
y = labels.values

test = titanic_test.copy() # real test sets
print(len(test), 'test examples')

我在这里尝试对数据进行预处理:

1.Drop Name column and Do one hot coding both on the train and test set

2.Drop ['PassengerId','Ticket','Cabin','Survived'] 为了简单。

  1. 按照原始顺序拆分训练和测试

这是一张显示训练集的图片。

"""# model training"""

from tensorflow.keras.layers import Input, Dense, Activation,Dropout
from tensorflow.keras.models import Model

X = titanic_trainandval.copy()
input_layer = Input(shape=(X.shape[1],))
dense_layer_1 = Dense(10, activation='relu')(input_layer)
dense_layer_2 = Dense(5, activation='relu')(dense_layer_1)
output = Dense(1, activation='softmax',name = 'predictions')(dense_layer_2)

model = Model(inputs=input_layer, outputs=output)
base_learning_rate = 0.0001

model.compile(loss=tf.keras.losses.BinaryCrossentropy(from_logits=True), optimizer=tf.keras.optimizers.Adam(lr=base_learning_rate), metrics=['acc'])

history = model.fit(X, y, batch_size=5, epochs=20, verbose=2, validation_split=0.1,shuffle = False)

submission = pd.DataFrame()
submission['PassengerId'] = titanictest['PassengerId']

然后我将训练集 X 放入模型中得到结果。但是,历史显示以下结果:

无论我如何改变学习率和batch size,结果都没有改变,损失总是'nan',基于测试集的预测也总是'nan'。

谁能解释问题出在哪里并给出一些可能的解决方案?

【问题讨论】:

    标签: python tensorflow keras


    【解决方案1】:

    除了上面的答案,我想补充的还有一件事是,每当你想使用form_logits=True 来解决分类问题时,请使用线性激活函数,即activation='linear',这是激活函数在最后一层。

    【讨论】:

      【解决方案2】:

      Marco Cerliani 在第 1 点和第 2 点上是正确的。

      您拥有 NaN 的真正问题是您在代码中提供了 NaN。如果您仔细观察,即使在您的第三张照片中,Age 列中的第 888 个示例也包含一个 NaN。

      这就是你有 NaN 的原因。解决这个问题,并应用 Marco Cerliani 的建议,你就可以开始了:D

      【讨论】:

        【解决方案3】:

        乍一看,您的代码有两个主要问题:

        1. 你的输出层必须是Dense(2, activation='softmax')。这是因为你的问题是一个二元分类问题,如果你使用 softmax 来生成概率,输出的 dim 必须等于类的数量。 (你可以使用sigmoid激活的一个输出维度)

        2. 你必须改变你的损失函数。使用 softmax 和数字编码目标使用 sparse_categorical_crossentropy。 (您可以将 binary_crossentropy 与 sigmoid 一起使用,并将 from_logits=False 作为默认值)

        PS:确保在开始拟合之前删除原始数据中的所有 NaN

        【讨论】:

          猜你喜欢
          • 2021-05-17
          • 2020-10-21
          • 2018-01-23
          • 1970-01-01
          • 2016-02-16
          • 2019-04-28
          • 2017-10-22
          • 1970-01-01
          • 2021-12-28
          相关资源
          最近更新 更多