我正在尝试将一个已训练的模型移植到生产环境中,并在尝试在C#中复制Keras hashing_trick()函数的行为时遇到了问题。当我尝试对句子进行编码时,C#中的输出与Python中的输出不同:
文本:"Information - The configuration processing is completed."
Python:[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 217 142 262 113 319 413]
C#:[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 433, 426, 425, 461, 336, 146, 52]
(从调试器中复制,两个序列长度均为30)
我的尝试:
1. 将C#中文本字节的编码更改为与Python string.encode()函数默认值(UTF8)相匹配
2. 更改字母的大小写
3. 尝试使用Convert.ToUInt32代替BitConverter(结果导致溢出错误)
我的代码(如下)是我实现Keras hashing_trick函数的方式。给定一个输入句子,然后该函数将返回相应的编码序列。
文本:"Information - The configuration processing is completed."
Python:[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 217 142 262 113 319 413]
C#:[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 433, 426, 425, 461, 336, 146, 52]
(从调试器中复制,两个序列长度均为30)
我的尝试:
1. 将C#中文本字节的编码更改为与Python string.encode()函数默认值(UTF8)相匹配
2. 更改字母的大小写
3. 尝试使用Convert.ToUInt32代替BitConverter(结果导致溢出错误)
我的代码(如下)是我实现Keras hashing_trick函数的方式。给定一个输入句子,然后该函数将返回相应的编码序列。
public uint[] HashingTrick(string data)
{
const int VOCAB_SIZE = 534; //Determined through python debugging of model
var filters = "!#$%&()*+,-./:;<=>?@[\\]^_`{|}~\t\n".ToCharArray().ToList();
filters.ForEach(x =>
{
data = data.Replace(x, '\0');
});
string[] parts = data.Split(' ');
var encoded = new List<uint>();
parts.ToList().ForEach(x =>
{
using (System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create())
{
byte[] inputBytes = System.Text.Encoding.UTF8.GetBytes(x);
byte[] hashBytes = md5.ComputeHash(inputBytes);
uint val = BitConverter.ToUInt32(hashBytes, 0);
encoded.Add(val % (VOCAB_SIZE - 1) + 1);
}
});
return PadSequence(encoded, 30);
}
private uint[] PadSequence(List<uint> seq, int maxLen)
{
if (seq.Count < maxLen)
{
while (seq.Count < maxLen)
{
seq.Insert(0, 0);
}
return seq.ToArray();
}
else if (seq.Count > maxLen)
{
return seq.GetRange(seq.Count - maxLen - 1, maxLen).ToArray();
}
else
{
return seq.ToArray();
}
}
您可以在此处找到keras实现的哈希技巧:这里
如果有帮助的话,我正在使用ASP.NET Web API作为我的解决方案类型。
534
从哪里来,这将是我的首要调查线索。其次,要看哪些数字是正确的 - 每个整数对应上述代码中的一个散列单词,因此如果存在差异,则是由于字符串被分割方式不同或结果被收集方式不同所致。我没有很仔细地调试Python代码。(例如,尝试“configuration configuration configuration”- Python会生成三个数字还是只有一个?) - Jeroen MostertMD5
类替换hashlib
,这只需要进行最小化的代码调整(假设在程序中一直使用的是 MD5)。 - Jeroen Mostert