我想在训练,验证和推理阶段使用TensorFlow Transform将标记转换为单词向量.
我按照这个StackOverflow帖子实现了从标记到向量的初始转换.转换按预期工作,我获取EMB_DIM每个令牌的向量.
import numpy as np
import tensorflow as tf
tf.reset_default_graph()
EMB_DIM = 10
def load_pretrained_glove():
tokens = ["a", "cat", "plays", "piano"]
return tokens, np.random.rand(len(tokens), EMB_DIM)
# sample string
string_tensor = tf.constant(["plays", "piano", "unknown_token", "another_unknown_token"])
pretrained_vocab, pretrained_embs = load_pretrained_glove()
vocab_lookup = tf.contrib.lookup.index_table_from_tensor(
mapping = tf.constant(pretrained_vocab),
default_value = len(pretrained_vocab))
string_tensor = vocab_lookup.lookup(string_tensor)
# define the word embedding
pretrained_embs = tf.get_variable(
name="embs_pretrained",
initializer=tf.constant_initializer(np.asarray(pretrained_embs), dtype=tf.float32),
shape=pretrained_embs.shape,
trainable=False)
unk_embedding = tf.get_variable(
name="unk_embedding",
shape=[1, EMB_DIM],
initializer=tf.random_uniform_initializer(-0.04, 0.04),
trainable=False)
embeddings = …Run Code Online (Sandbox Code Playgroud) 我按照以下指南编写了TF Records,我曾经在那里tf.Transform预处理我的功能.现在,我想部署我的模型,我需要在真实的实时数据上应用这个预处理功能.
首先,假设我有2个功能:
features = ['amount', 'age']
Run Code Online (Sandbox Code Playgroud)
我有transform_fn来自Apache Beam,来自working_dir=gs://path-to-transform-fn/
然后我使用以下方法加载转换函数:
tf_transform_output = tft.TFTransformOutput(working_dir)
我认为在生产中服务的最简单方法是获取一系列处理过的数据,然后调用model.predict()(我使用的是Keras模型).
要做到这一点,我认为transform_raw_features()方法正是我所需要的.
但是,似乎在构建架构之后:
raw_features = {}
for k in features:
raw_features.update({k: tf.constant(1)})
print(tf_transform_output.transform_raw_features(raw_features))
Run Code Online (Sandbox Code Playgroud)
我明白了:
AttributeError: 'Tensor' object has no attribute 'indices'
Run Code Online (Sandbox Code Playgroud)
现在,我假设发生了这种情况,因为我tf.VarLenFeature()在我定义架构时使用了preprocessing_fn.
def preprocessing_fn(inputs):
outputs = inputs.copy()
for _ in features:
outputs[_] = tft.scale_to_z_score(outputs[_])
Run Code Online (Sandbox Code Playgroud)
我使用以下方法构建元数据:
RAW_DATA_FEATURE_SPEC = {}
for _ in features:
RAW_DATA_FEATURE_SPEC[_] = tf.VarLenFeature(dtype=tf.float32)
RAW_DATA_METADATA = dataset_metadata.DatasetMetadata(
dataset_schema.from_feature_spec(RAW_DATA_FEATURE_SPEC))
Run Code Online (Sandbox Code Playgroud)
所以简而言之,给一本字典:
d = …
python tensorflow tensorflow-serving apache-beam tensorflow-transform
我正在使用Tensorflow使用我自己的数据集进行神经网络预测.我做的第一个是与我的计算机中的小数据集一起使用的模型.在此之后,我更改了代码,以便使用具有更大数据集的Google Cloud ML-Engine在ML-Engine中实现列车和预测.
我正在规范熊猫数据框中的功能,但这引入了偏差,我的预测结果很差.
我真正想要的是使用库tf-transform来规范化图中的数据.为此,我想创建一个函数preprocessing_fn 并使用' tft.scale_to_0_1'.https://github.com/tensorflow/transform/blob/master/getting_started.md
我发现的主要问题是当我试图做预测时.我正在寻找互联网,但我没有找到任何导出模型的例子,其中数据在训练中被标准化.在我发现的所有示例中,数据未在任何地方进行标准化.
我想知道的是,如果我对训练中的数据进行规范化,并发送一个带有新数据的新实例来进行预测,那么如何对这些数据进行归一化?
¿可能在Tensorflow数据管道中?进行规范化的变量是否保存在某个地方?
总结:我正在寻找一种方法来规范化我的模型的输入,然后新实例也变得标准化.
python google-cloud-platform tensorflow google-cloud-ml tensorflow-transform
我们正在尝试构建一个管道,在 TensorFlow 中进行训练之前,从 BigQuery 获取数据,通过 TensorFlow Transform 运行。
管道已启动并正在运行,但我们在 BigQuery 中处理空值时遇到困难。
我们使用 Beam 从 BigQuery 加载:
raw_data = (pipeline
| '{}_read_from_bq'.format(step) >> beam.io.Read(
beam.io.BigQuerySource(query=source_query,
use_standard_sql=True,
)))
Run Code Online (Sandbox Code Playgroud)
我正在使用数据集元数据,尝试FixedLenFeature各种VarLenFeature列:
# Categorical feature schema
categorical_features = {
column_name: tf.io.FixedLenFeature([], tf.string) for column_name in categorical_columns
}
raw_data_schema.update(categorical_features)
# Numerical feature schema
numerical_features = {
column_name: tf.io.VarLenFeature(tf.float32) for column_name in numerical_columns
}
raw_data_schema.update(numerical_features)
# Create dataset_metadata given raw_data_schema
raw_metadata = dataset_metadata.DatasetMetadata(
schema_utils.schema_from_feature_spec(raw_data_schema))
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,如果您尝试将 BigQuery NULL 输入到 a 中FixedLenFeature,它就会中断。
但是,当我尝试输入字符串或整数 …
python google-bigquery tensorflow apache-beam tensorflow-transform
内容:
我的文本输入管道当前包括两个主要部分:
我。复杂的文本预处理并导出tf.SequenceExamples到tfrecord(自定义标记化,词汇创建,统计信息计算,规范化以及整个数据集以及每个单独示例中的更多操作)。对于每个数据配置,只需完成一次。
二。一个tf.Dataset(TFRecords)管道在训练期间也进行了大量处理(string_split转换为字符,表查找,存储区,条件过滤等)。
原始数据集存在于多个位置(BigQuery,GCS,RDS等)。
问题:
问题在于,随着生产数据集快速增长(几个TB),为每种可能的数据配置(第1部分具有很多超参数)重新创建tfrecords文件是不可行的,因为每个文件都将具有数百TB的巨大容量。更不用说,tf.Dataset当tf.SequenceExamples或tfrecords变大时,读取速度会意外降低。
有很多可能的解决方案:
,但以下任何一项似乎都无法完全满足我的要求:
tf.Dataset一种或另一种方式直接发送数据(protos?)以用于第二部分。(可选)能够针对数据的所选部分预先计算一些全程统计信息。
编辑: Python 3支持会很棒。
tf.data.Dataset管道最合适的选择是什么?在这种情况下,最佳做法是什么?
提前致谢!
google-bigquery google-cloud-dataflow tensorflow tensorflow-datasets tensorflow-transform
我有一个对特征进行操作的模型,其中之一是先前事件的时间戳数组。
我想计算这个数组的每个元素,每个时间戳的星期几(“星期一”到“星期日”或 [0, 7) 中的整数)
我想在图表中执行此操作,因为我希望我的模型能够在设备上进行预测时复制此转换。
星期几只是我想从时间戳中提取的信息之一,理想情况下我还可以获得年、月等...到目前为止我发现的最接近的是 tfa.parse_time ,它的作用几乎与我想要实现什么。
是否有这样的运算符的现有实现?如果没有,我该如何考虑闰年、时区、夏令时等来实现这一点......?
假设我将此数据框保存为镶木地板格式
import numpy as np
import pandas as pd
data = pd.DataFrame(dict(
a=[1.0, 2.0, 3.0, 4.0, 5.0, 6.0],
b=[1.0, 1.0, 1.0, np.NaN, 0.0, np.NaN],
c=[0.9, np.NaN, 1.0, 0.0, 0.0, 0.0]
))
data.to_parquet('data.parquet')
Run Code Online (Sandbox Code Playgroud)
以及一本字典,它告诉我应该使用哪些值进行插补。然后我可以编写一个预处理函数。
import tensorflow as tf
impute_dictionary = dict(b=1.0, c=0.0)
def preprocessing_fn(inputs):
outputs = inputs.copy()
for key, value in impute_dictionary.items():
outputs[key] = tf.where(
tf.math.is_nan(outputs[key]),
tf.constant(value, shape=outputs[key].shape),
outputs[key]
)
return outputs
Run Code Online (Sandbox Code Playgroud)
并在 Apache Beam 管道中使用它
import tempfile
import apache_beam as beam
import tensorflow_transform.beam as tft_beam
from tensorflow_transform.tf_metadata import dataset_metadata, schema_utils …Run Code Online (Sandbox Code Playgroud) python tensorflow apache-beam tensorflow-transform tensorflow2.0