我正试图将一个经过训练的模型移动到生产环境中,但在试图复制C#中Keras hashing_trick((函数的行为时遇到了问题。当我对句子进行编码时,我在C#中的输出与在python中的不同:
文本:"信息-配置处理完成。">
Python:[0 0 0 0 0[0 0 0 0 0 217 142 262 113 319 413]
C#:[0,0,0,0,0,0,00,0:0,0:00,0[0,0,433,426,425,461,336,146,52]
(从调试器复制,两个序列的长度都为30(
我尝试过的:
- 更改C#中文本字节的编码以匹配python字符串.encode((函数默认值(UTF8(
- 将字母的大小写更改为小写和大写
- 尝试使用Convert.ToUInt32而不是BitConverter(导致溢出错误(
我的代码(下面(是Keras hashing_trick函数的实现。给出一个输入句子,然后函数将返回相应的编码序列。
public uint[] HashingTrick(string data)
{
const int VOCAB_SIZE = 534; //Determined through python debugging of model
var filters = "!#$%&()*+,-./:;<=>?@[\]^_`{|}~tn".ToCharArray().ToList();
filters.ForEach(x =>
{
data = data.Replace(x, ' ');
});
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作为我的解决方案类型。
您的代码最大的问题是它没有考虑到Python的int
是一个任意精度的整数,而C#的uint
只有32位。这意味着Python正在计算哈希的所有128位的模,而C#则不是(而且BitConverter.ToUInt32
在任何情况下都是错误的,因为endianness是错误的(。另一个让您感到困惑的问题是,