源码
import tensorflow as tf
import sys
# # Training samples path, change to your local path
# training_samples_file_path = tf.keras.utils.get_file("trainingSamples.csv",
# "file:///D:/workSpace/senro-tree-recommend/src/main"+
# "/resources/static/sampledata/trainingSamples2/part-00000-56521c27-aadd-4b1d-b7b3-417a39f0f3c8-c000.csv")
# # Test samples path, change to your local path
# test_samples_file_path = tf.keras.utils.get_file("testSamples.csv",
# "file:///D:/workSpace/senro-tree-recommend/src/main"+
# "/resources/static/sampledata/testSamples2/part-00000-8ec63f48-ecca-49cb-af35-25a6f6da3425-c000.csv")
# basePath=sys.argv[1]
basePath="D:/data/work/"
trainPath="file:///"+basePath+"sampledata/trainingSamples2"
testPath="file:///"+basePath+"sampledata/testSamples2"
tensorPath=basePath+"tensor"
# Training samples path, change to your local path
training_samples_file_path = tf.keras.utils.get_file("trainingSamples.csv",
trainPath)
# Test samples path, change to your local path
test_samples_file_path = tf.keras.utils.get_file("testSamples.csv",
testPath)
# load sample as tf dataset
def get_dataset(file_path):
dataset = tf.data.experimental.make_csv_dataset(
file_path,
batch_size=12,
label_name='label',
na_value="0",
num_epochs=1,
ignore_errors=True)
return dataset
# split as test dataset and training dataset
train_dataset = get_dataset(training_samples_file_path)
test_dataset = get_dataset(test_samples_file_path)
# item id embedding feature
# movie_col = tf.feature_column.categorical_column_with_identity(key='itemId', num_buckets=1001)
movie_col = tf.feature_column.categorical_column_with_hash_bucket(key='itemId', hash_bucket_size=1001)
movie_emb_col = tf.feature_column.embedding_column(movie_col, 10)
# user id embedding feature
# user_col = tf.feature_column.categorical_column_with_identity(key='userId', num_buckets=30001)
user_col = tf.feature_column.categorical_column_with_hash_bucket(key='userId', hash_bucket_size=30001)
user_emb_col = tf.feature_column.embedding_column(user_col, 10)
# define input for keras model
inputs = {
'itemId': tf.keras.layers.Input(name='itemId', shape=(), dtype='string'),
'userId': tf.keras.layers.Input(name='userId', shape=(), dtype='string'),
'rating': tf.keras.layers.Input(name='rating', shape=(), dtype='float32'),
'timestamp': tf.keras.layers.Input(name='timestamp', shape=(), dtype='int32'),
'releaseYear': tf.keras.layers.Input(name='releaseYear', shape=(), dtype='int32'),
'movieGenre1': tf.keras.layers.Input(name='movieGenre1', shape=(), dtype='string'),
'movieGenre2': tf.keras.layers.Input(name='movieGenre2', shape=(), dtype='string'),
'movieGenre3': tf.keras.layers.Input(name='movieGenre3', shape=(), dtype='string'),
# 'movieGenre4': tf.keras.layers.Input(name='movieGenre4', shape=(), dtype='string'),
# 'movieGenre5': tf.keras.layers.Input(name='movieGenre5', shape=(), dtype='string'),
'movieAvgRating': tf.keras.layers.Input(name='movieAvgRating', shape=(), dtype='float32'),
'movieRatingStddev': tf.keras.layers.Input(name='movieRatingStddev', shape=(), dtype='float32'),
'movieRatingCount': tf.keras.layers.Input(name='movieRatingCount', shape=(), dtype='int32'),
'userRatedMovie1': tf.keras.layers.Input(name='userRatedMovie1', shape=(), dtype='int32'),
'userRatedMovie2': tf.keras.layers.Input(name='userRatedMovie2', shape=(), dtype='int32'),
'userRatedMovie3': tf.keras.layers.Input(name='userRatedMovie3', shape=(), dtype='int32'),
'userRatedMovie4': tf.keras.layers.Input(name='userRatedMovie4', shape=(), dtype='int32'),
'userRatedMovie5': tf.keras.layers.Input(name='userRatedMovie5', shape=(), dtype='int32'),
'userAvgReleaseYear': tf.keras.layers.Input(name='userAvgReleaseYear', shape=(), dtype='float32'),
'userReleaseYearStddev': tf.keras.layers.Input(name='userReleaseYearStddev', shape=(), dtype='float32'),
'userAvgRating': tf.keras.layers.Input(name='userAvgRating', shape=(), dtype='float32'),
'userRatingStddev': tf.keras.layers.Input(name='userRatingStddev', shape=(), dtype='float32'),
'userRatingCount': tf.keras.layers.Input(name='userRatingCount', shape=(), dtype='int32'),
'userGenre1': tf.keras.layers.Input(name='userGenre1', shape=(), dtype='string'),
'userGenre2': tf.keras.layers.Input(name='userGenre2', shape=(), dtype='string'),
'userGenre3': tf.keras.layers.Input(name='userGenre3', shape=(), dtype='string'),
'userGenre4': tf.keras.layers.Input(name='userGenre4', shape=(), dtype='string'),
'userGenre5': tf.keras.layers.Input(name='userGenre5', shape=(), dtype='string'),
}
# neural cf model arch two. only embedding in each tower, then MLP as the interaction layers
def neural_cf_model_1(feature_inputs, item_feature_columns, user_feature_columns, hidden_units):
item_tower = tf.keras.layers.DenseFeatures(item_feature_columns)(feature_inputs)
user_tower = tf.keras.layers.DenseFeatures(user_feature_columns)(feature_inputs)
interact_layer = tf.keras.layers.concatenate([item_tower, user_tower])
for num_nodes in hidden_units:
interact_layer = tf.keras.layers.Dense(num_nodes, activation='relu')(interact_layer)
output_layer = tf.keras.layers.Dense(1, activation='sigmoid')(interact_layer)
neural_cf_model = tf.keras.Model(feature_inputs, output_layer)
return neural_cf_model
# neural cf model arch one. embedding+MLP in each tower, then dot product layer as the output
def neural_cf_model_2(feature_inputs, item_feature_columns, user_feature_columns, hidden_units):
item_tower = tf.keras.layers.DenseFeatures(item_feature_columns)(feature_inputs)
for num_nodes in hidden_units:
item_tower = tf.keras.layers.Dense(num_nodes, activation='relu')(item_tower)
user_tower = tf.keras.layers.DenseFeatures(user_feature_columns)(feature_inputs)
for num_nodes in hidden_units:
user_tower = tf.keras.layers.Dense(num_nodes, activation='relu')(user_tower)
output = tf.keras.layers.Dot(axes=1)([item_tower, user_tower])
output = tf.keras.layers.Dense(1, activation='sigmoid')(output)
neural_cf_model = tf.keras.Model(feature_inputs, output)
return neural_cf_model
# neural cf model architecture
model = neural_cf_model_1(inputs, [movie_emb_col], [user_emb_col], [10, 10])
# compile the model, set loss function, optimizer and evaluation metrics
model.compile(
loss='binary_crossentropy',
optimizer='adam',
metrics=['accuracy', tf.keras.metrics.AUC(curve='ROC'), tf.keras.metrics.AUC(curve='PR')])
# train the model
model.fit(train_dataset, epochs=5)
# evaluate the model
test_loss, test_accuracy, test_roc_auc, test_pr_auc = model.evaluate(test_dataset)
print('\n\nTest Loss {}, Test Accuracy {}, Test ROC AUC {}, Test PR AUC {}'.format(test_loss, test_accuracy,
test_roc_auc, test_pr_auc))
# print some predict results
predictions = model.predict(test_dataset)
for prediction, goodRating in zip(predictions[:12], list(test_dataset)[0][1][:12]):
print("Predicted good rating: {:.2%}".format(prediction[0]),
" | Actual rating label: ",
("Good Rating" if bool(goodRating) else "Bad Rating"))
tf.keras.models.save_model(
model,
tensorPath,
overwrite=True,
include_optimizer=True,
save_format=None,
signatures=None,
options=None
)
报错信息如下:
D:\packagepath\python3.7.5\python.exe D:/data/pythonProject/neuralCF2.py
WARNING:root:Limited tf.compat.v2.summary API due to missing TensorBoard installation.
WARNING:root:Limited tf.compat.v2.summary API due to missing TensorBoard installation.
WARNING:root:Limited tf.compat.v2.summary API due to missing TensorBoard installation.
WARNING:root:Limited tf.summary API due to missing TensorBoard installation.
WARNING:root:Limited tf.compat.v2.summary API due to missing TensorBoard installation.
WARNING:root:Limited tf.compat.v2.summary API due to missing TensorBoard installation.
WARNING:root:Limited tf.compat.v2.summary API due to missing TensorBoard installation.
2022-03-08 15:32:04.011173: I tensorflow/core/platform/cpu_feature_guard.cc:151] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX AVX2
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
Epoch 1/5
2022-03-08 15:32:05.163598: W tensorflow/core/framework/op_kernel.cc:1722] OP_REQUIRES failed at cast_op.cc:121 : UNIMPLEMENTED: Cast int64 to string is not supported
Traceback (most recent call last):
File "D:/data/pythonProject/neuralCF2.py", line 127, in
model.fit(train_dataset, epochs=5)
File "D:\packagepath\python3.7.5\lib\site-packages\keras\utils\traceback_utils.py", line 67, in error_handler
raise e.with_traceback(filtered_tb) from None
File "D:\packagepath\python3.7.5\lib\site-packages\tensorflow\python\eager\execute.py", line 55, in quick_execute
inputs, attrs, num_outputs)
tensorflow.python.framework.errors_impl.UnimplementedError: Graph execution error:
Detected at node 'model/Cast_5' defined at (most recent call last):
File "D:/data/pythonProject/neuralCF2.py", line 127, in
model.fit(train_dataset, epochs=5)
File "D:\packagepath\python3.7.5\lib\site-packages\keras\utils\traceback_utils.py", line 64, in error_handler
return fn(*args, **kwargs)
File "D:\packagepath\python3.7.5\lib\site-packages\keras\engine\training.py", line 1384, in fit
tmp_logs = self.train_function(iterator)
File "D:\packagepath\python3.7.5\lib\site-packages\keras\engine\training.py", line 1021, in train_function
return step_function(self, iterator)
File "D:\packagepath\python3.7.5\lib\site-packages\keras\engine\training.py", line 1010, in step_function
outputs = model.distribute_strategy.run(run_step, args=(data,))
File "D:\packagepath\python3.7.5\lib\site-packages\keras\engine\training.py", line 1000, in run_step
outputs = model.train_step(data)
File "D:\packagepath\python3.7.5\lib\site-packages\keras\engine\training.py", line 859, in train_step
y_pred = self(x, training=True)
File "D:\packagepath\python3.7.5\lib\site-packages\keras\utils\traceback_utils.py", line 64, in error_handler
return fn(*args, **kwargs)
File "D:\packagepath\python3.7.5\lib\site-packages\keras\engine\base_layer.py", line 1096, in __call__
outputs = call_fn(inputs, *args, **kwargs)
File "D:\packagepath\python3.7.5\lib\site-packages\keras\utils\traceback_utils.py", line 92, in error_handler
return fn(*args, **kwargs)
File "D:\packagepath\python3.7.5\lib\site-packages\keras\engine\functional.py", line 452, in call
inputs, training=training, mask=mask)
File "D:\packagepath\python3.7.5\lib\site-packages\keras\engine\functional.py", line 571, in _run_internal_graph
y = self._conform_to_reference_input(y, ref_input=x)
File "D:\packagepath\python3.7.5\lib\site-packages\keras\engine\functional.py", line 671, in _conform_to_reference_input
tensor = tf.cast(tensor, dtype=ref_input.dtype)
Node: 'model/Cast_5'
Cast int64 to string is not supported
[[{{node model/Cast_5}}]] [Op:__inference_train_function_2550]
Process finished with exit code 1
各位大佬求救!!!