当我有更多数据时,断言失败了TensorFlow



嗨,我是TensorFlow的新手,我有一个不理解的错误。我有一个生成二进制分类器的脚本。我的总数据集包含超过500万个具有正负结果的条目。阳性数据约占总数据的7.5%。当我为少于800k的条目运行分类器时,一切都很酷。当我试图使用我的所有数据进行训练时,我得到了错误

1/367 [..............................] - ETA: 2:43 - loss: 0.0000e+00 - TruePositive: 8.0000Traceback (most recent call last):
File "d:My ProgramsPythonDeepLearningFraudAnalysisPythonFraudAnalysisKerasClassifierV1.py", line 91, in <module>
model.fit( X_train, y_train, epochs = epochs_no, batch_size = batch_size )
File "C:UsersalexandrosAppDataLocalPackagesPythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0LocalCachelocal-packagesPython39site-packageskerasutilstraceback_utils.py", line 67, in error_handler
raise e.with_traceback(filtered_tb) from None
File "C:UsersalexandrosAppDataLocalPackagesPythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0LocalCachelocal-packagesPython39site-packagestensorflowpythoneagerexecute.py", line 54, in quick_execute
tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name,
tensorflow.python.framework.errors_impl.InvalidArgumentError: Graph execution error:
Detected at node 'assert_greater_equal/Assert/AssertGuard/Assert' defined at (most recent call last):
File "d:My ProgramsPythonDeepLearningFraudAnalysisPythonFraudeAnalysisKerasClassifierV1.py", line 91, in <module>
model.fit( X_train, y_train, epochs = epochs_no, batch_size = batch_size )
File "C:UsersalexandrosAppDataLocalPackagesPythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0LocalCachelocal-packagesPython39site-packageskerasutilstraceback_utils.py", line 64, in error_handler
return fn(*args, **kwargs)
File "C:UsersalexandrosAppDataLocalPackagesPythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0LocalCachelocal-packagesPython39site-packageskerasenginetraining.py", line 1384, in fit
tmp_logs = self.train_function(iterator)
File "C:UsersalexandrosAppDataLocalPackagesPythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0LocalCachelocal-packagesPython39site-packageskerasenginetraining.py", line 1021, in train_function
return step_function(self, iterator)
File "C:UsersalexandrosAppDataLocalPackagesPythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0LocalCachelocal-packagesPython39site-packageskerasenginetraining.py", line 1010, in step_function
outputs = model.distribute_strategy.run(run_step, args=(data,))
File "C:UsersalexandrosAppDataLocalPackagesPythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0LocalCachelocal-packagesPython39site-packageskerasenginetraining.py", line 1000, in run_step
outputs = model.train_step(data)
File "C:UsersalexandrosAppDataLocalPackagesPythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0LocalCachelocal-packagesPython39site-packageskerasenginetraining.py", line 864, in train_step
return self.compute_metrics(x, y, y_pred, sample_weight)
File "C:UsersalexandrosAppDataLocalPackagesPythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0LocalCachelocal-packagesPython39site-packageskerasenginetraining.py", line 957, in compute_metrics
self.compiled_metrics.update_state(y, y_pred, sample_weight)
File "C:UsersalexandrosAppDataLocalPackagesPythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0LocalCachelocal-packagesPython39site-packageskerasenginecompile_utils.py", line 459, in update_state
metric_obj.update_state(y_t, y_p, sample_weight=mask)
File "C:UsersalexandrosAppDataLocalPackagesPythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0LocalCachelocal-packagesPython39site-packageskerasutilsmetrics_utils.py", line 70, in decorated
update_op = update_state_fn(*args, **kwargs)
File "C:UsersalexandrosAppDataLocalPackagesPythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0LocalCachelocal-packagesPython39site-packageskerasmetrics.py", line 178, in update_state_fn
return ag_update_state(*args, **kwargs)
File "C:UsersalexandrosAppDataLocalPackagesPythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0LocalCachelocal-packagesPython39site-packageskerasmetrics.py", line 1073, in update_state
return metrics_utils.update_confusion_matrix_variables(
File "C:UsersalexandrosAppDataLocalPackagesPythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0LocalCachelocal-packagesPython39site-packageskerasutilsmetrics_utils.py", line 602, in update_confusion_matrix_variables
tf.compat.v1.assert_greater_equal(
Node: 'assert_greater_equal/Assert/AssertGuard/Assert'
assertion failed: [predictions must be >= 0] [Condition x >= y did not hold element-wise:] [x (sequential/dense_2/Sigmoid:0) = ] [[0.438505232][0.424332052][0.430545419]...] [y (Cast_2/x:0) = ] [0]
[[{{node assert_greater_equal/Assert/AssertGuard/Assert}}]] [Op:__inference_train_function_870]
PS D:My ProgramsPythonDeepLearningFraudAnalysisPythonFraudAnalysis> 

完整的脚本如下

import constants
from tensorflow import keras
from tensorflow.python.client import device_lib 
from keras.models import Sequential
from keras.layers import Dense, Dropout
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler, MinMaxScaler
from pymongo import MongoClient
import numpy as np
import time
import sys
start_time = time.time()
# Making a Connection with MongoClient
try:
conn = MongoClient()
print("Connected successfully!!!")
except:  
print("Could not connect to MongoDB")
# database
db = conn["fraud_database"]
# collection
avgSamplescollection = db["fraud_samples_avg"]
avgSamplesCount = avgSamplescollection.count_documents({})
limit = 1000000
avgSamplesCount = limit
npAvgSamples = np.zeros( shape = ( constants.TRAINING_DAYS + 1, avgSamplesCount ) )
idx = 0
totalPositiveSamples = 0
for avgSample in avgSamplescollection.find().batch_size( 500000 ).limit(limit):
for j in range( constants.TRAINING_DAYS ):
val = avgSample[ 'data' ][ j ][ 'Close' ]
npAvgSamples[ j ][ idx ] = val
npAvgSamples[ constants.TRAINING_DAYS ][ idx ] = avgSample[ 'tag']
totalPositiveSamples += avgSample[ 'tag' ]
idx += 1
print( "loaded:" + str(idx) + " samples out of:" + str( avgSamplesCount ) + " percentage:" + str( idx /avgSamplesCount * 100 ) + "%" )
scaler = MinMaxScaler()
npAvgSamples = scaler.fit_transform(npAvgSamples)
npAvgSamples = npAvgSamples.transpose()
totalNegativeSamples = avgSamplesCount - totalPositiveSamples
print("Total positive samples:" + str( totalPositiveSamples ) + " Total negative samples:" + str( totalNegativeSamples ) + " Total samples" +  str( avgSamplesCount ) )
inputX = npAvgSamples[ :, 0 : constants.TRAINING_DAYS ]
outputY = npAvgSamples[ :, constants.TRAINING_DAYS ]
#inputX = scaler.fit_transform( inputX )
X_train, X_test, y_train, y_test = train_test_split( inputX, outputY, test_size = 0.25, random_state = 40 )
class_weight = { 0: totalNegativeSamples/avgSamplesCount, 1:totalPositiveSamples/avgSamplesCount }
model = Sequential()
model.add( Dense( constants.TRAINING_DAYS + constants.TRAINING_DAYS / 2, input_dim=constants.TRAINING_DAYS, activation='relu' ) )
model.add( Dense( constants.TRAINING_DAYS / 2, activation='relu' ) )
model.add( Dense( 1, activation = 'sigmoid' ) )
METRICS = [
keras.metrics.TruePositives( name='TruePositive' ),
#keras.metrics.FalsePositives( name='FalsePositive' ),
#keras.metrics.TrueNegatives( name='TrueNegative' ),
#keras.metrics.FalseNegatives( name='FalseNegative' ), 
#keras.metrics.BinaryAccuracy( name='Accuracy' ),
#keras.metrics.Precision( name='Precision' ),
#keras.metrics.Recall( name='Recall' ),
#keras.metrics.AUC( name='auc' ),
#keras.metrics.AUC( name='prc', curve='PR' ),
]
# Compile the model
model.compile( optimizer='adam', loss='categorical_crossentropy', metrics=METRICS )
epochs_no = 100
batch_size = 2048
model.fit( X_train, y_train, epochs = epochs_no, batch_size = batch_size, class_weight = class_weight )
results = model.evaluate( X_test, y_test, batch_size = batch_size )
print("Loss: {:0.4f}".format(results[0]))

model.save( "./avg_keras_model" )
print( "Total execution time:%s seconds:" % ( time.time() - start_time ) )

您面临的图形执行错误并不是因为要训练的数据量。这可能只是一个巧合。

错误的根本原因只是预测不在0和1之间。对于您正在使用的tf.keras.metrics.TruePositives度量,您应该确保您的预测在0和1之间。

对于这个二元分类问题,您在最后一层正确应用了Sigmoid激活函数,预计预测将在上述范围内。然而,似乎并非所有预测都位于{0,1}NaNs的可能性中。

解决这一问题的最简单方法是编写一个自定义函数,以确保我们的输出在适当的范围内。

def normalize_outputs(x):
return [round((i - min(x)) / (max(x) - min(x)), 2) for i in x]

相关内容

最新更新