使用 DataFrame 列表列初始化 Keras StringLookup
Initialise Keras StringLookup with DataFrame list column
我在 pd.DataFrame
列中有以下格式的数据:
col
0 ['str1', 'str2', 'str3']
1 []
2 ['str1']
3 ['str20']
我使用下面的代码构造一个查找层:
lookup_layer = tf.keras.layers.StringLookup(max_tokens=335)
lookup_layer.adapt(df.col)
失败:
ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type list).
我还尝试将列连接到一个列表中,因为错误表明嵌套列表是问题所在:
lookup_layer.adapt(itertools.chain(*df.col))
这导致:
AttributeError: 'str' object has no attribute 'shape'
我也尝试了各种 tf.cast
/tf.convert_to_tensor
电话,但无济于事。
如何将我的 DataFrame
字符串列表列转换为 Tensorflow 接受的内容?
您必须将您的字符串列表列表转换为单个列表,然后您的 StringLookup
层应该可以工作:
import pandas as pd
import tensorflow as tf
import numpy as np
d = {'col': [['str1', 'str2', 'str3'], [], ['str1', 'str2', 'str3'], ['str1', 'str2', 'str3']]}
df = pd.DataFrame(data=d)
lookup_layer = tf.keras.layers.StringLookup(max_tokens=335)
flattened_data = sum(list(df.col), [])
lookup_layer.adapt(flattened_data)
print(lookup_layer.get_vocabulary())
['[UNK]', 'str3', 'str2', 'str1']
另请查看此 post 关于不同列表展平方法的性能。
作为替代方案,您可以使用 tf.ragged.constant 而不是 col
pd.Series.
lookup_layer = tf.keras.layers.StringLookup(max_tokens=335)
lookup_layer.adapt(tf.ragged.constant(df.col))
我在 pd.DataFrame
列中有以下格式的数据:
col
0 ['str1', 'str2', 'str3']
1 []
2 ['str1']
3 ['str20']
我使用下面的代码构造一个查找层:
lookup_layer = tf.keras.layers.StringLookup(max_tokens=335)
lookup_layer.adapt(df.col)
失败:
ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type list).
我还尝试将列连接到一个列表中,因为错误表明嵌套列表是问题所在:
lookup_layer.adapt(itertools.chain(*df.col))
这导致:
AttributeError: 'str' object has no attribute 'shape'
我也尝试了各种 tf.cast
/tf.convert_to_tensor
电话,但无济于事。
如何将我的 DataFrame
字符串列表列转换为 Tensorflow 接受的内容?
您必须将您的字符串列表列表转换为单个列表,然后您的 StringLookup
层应该可以工作:
import pandas as pd
import tensorflow as tf
import numpy as np
d = {'col': [['str1', 'str2', 'str3'], [], ['str1', 'str2', 'str3'], ['str1', 'str2', 'str3']]}
df = pd.DataFrame(data=d)
lookup_layer = tf.keras.layers.StringLookup(max_tokens=335)
flattened_data = sum(list(df.col), [])
lookup_layer.adapt(flattened_data)
print(lookup_layer.get_vocabulary())
['[UNK]', 'str3', 'str2', 'str1']
另请查看此 post 关于不同列表展平方法的性能。
作为替代方案,您可以使用 tf.ragged.constant 而不是 col
pd.Series.
lookup_layer = tf.keras.layers.StringLookup(max_tokens=335)
lookup_layer.adapt(tf.ragged.constant(df.col))