У меня есть следующие коды и проблема при попытке создать OrderedDict для нескольких входов функций (то есть функций a-g) и одной метки h.
def preprocess(dataset):
def batch_format_fn(element):
return collections.OrderedDict(
x=collections.OrderedDict(
a=tf.TensorSpec(shape=[None,], dtype=tf.int32),
b=tf.TensorSpec(shape=[None,], dtype=tf.int32),
c=tf.TensorSpec(shape=[None,], dtype=tf.int32),
d=tf.TensorSpec(shape=[None,], dtype=tf.int32),
e=tf.TensorSpec(shape=[None,], dtype=tf.int32),
f=tf.TensorSpec(shape=[None,], dtype=tf.int32),
g=tf.TensorSpec(shape=[None,], dtype=tf.int32)),
y=tf.TensorSpec(shape=[None,], dtype=tf.int32))
return dataset.map(batch_format_fn).prefetch(PREFETCH_BUFFER)
preprocessed_sample_dataset = preprocess(example_dataset)
def create_keras_model():
model = Sequential([
feature_layer,
Dense(64, activation='relu'),
Dense(64, activation='relu'),
Dense(3, activation='softmax') #classification 3 outputs
])
return model
def model_fn():
keras_model = create_keras_model()
return tff.learning.from_keras_model(
keras_model,
input_spec=preprocessed_sample_dataset.element_spec,
loss=losses.SparseCategoricalCrossentropy(),
metrics=[metrics.SparseCategoricalAccuracy()])
Он показывает такую ошибку при выполнении input_spec=preprocessed_sample_dataset.element_spec
:
TypeError: Unsupported return value from function passed to Dataset.map(): OrderedDict([('x', OrderedDict([('a', TensorSpec(shape=(None,), dtype=tf.int32, name=None)), ('b', TensorSpec(shape=(None,), dtype=tf.int32, name=None)), ('c', TensorSpec(shape=(None,), dtype=tf.int32, name=None)), ('d', TensorSpec(shape=(None,), dtype=tf.int32, name=None)), ('e', TensorSpec(shape=(None,), dtype=tf.int32, name=None)), ('f', TensorSpec(shape=(None,), dtype=tf.int32, name=None)), ('g', TensorSpec(shape=(None,), dtype=tf.int32, name=None))])), ('y', TensorSpec(shape=(None,), dtype=tf.int32, name=None))]).
Я прочитал это альтернативное решение, однако непонятно, как это реализовать в моем случае. Следовательно, как правильно назначить упорядоченный dict для нескольких функций в TFF?
Текущий example_dataset.element_spec выглядит следующим образом:
OrderedDict([
('a', TensorSpec(shape=(None,), dtype=tf.int32, name=None)),
('b', TensorSpec(shape=(None,), dtype=tf.int32, name=None)),
('c', TensorSpec(shape=(None,), dtype=tf.int32, name=None)),
('d', TensorSpec(shape=(None,), dtype=tf.int32, name=None)),
('e', TensorSpec(shape=(None,), dtype=tf.int32, name=None)),
('f', TensorSpec(shape=(None,), dtype=tf.int32, name=None)),
('g', TensorSpec(shape=(None,), dtype=tf.int32, name=None)),
('y', TensorSpec(shape=(None,), dtype=tf.int32, name=None))])
Я хочу, чтобы element_spec стал таким:
OrderedDict([('x', OrderedDict([
('a', TensorSpec(shape=(None,), dtype=tf.int32, name=None)),
('b', TensorSpec(shape=(None,), dtype=tf.int32, name=None)),
('c', TensorSpec(shape=(None,), dtype=tf.int32, name=None)),
('d', TensorSpec(shape=(None,), dtype=tf.int32, name=None)),
('e', TensorSpec(shape=(None,), dtype=tf.int32, name=None)),
('f', TensorSpec(shape=(None,), dtype=tf.int32, name=None)),
('g', TensorSpec(shape=(None,), dtype=tf.int32, name=None))])),
('y', TensorSpec(shape=(None,), dtype=tf.int32, name=None))])
Как сделать element_spec последним, используя batch_format_fn?
batch_format_fn
, похоже, что возвращаемое значение не зависит от аргументаelement
; Я подозреваю, что вы получите ту же ошибку, если просто перебираете набор данных. Может быть, возвращенныйOrderedDict
должен изменитьelement
? - person Keith Rush   schedule 15.07.2020element_spec
example_dataset
? Я считаю, что нам это понадобится, чтобы понять, как изменить - person Keith Rush   schedule 15.07.2020element_spec
- person tfreak   schedule 16.07.2020