Ошибка Tensorflow «TypeError: тензоры в списке, переданном в 'values' операции 'Pack', имеют типы [int32, int64, int32, int32, int32], которые не все совпадают». - PullRequest
0 голосов
/ 01 августа 2020

Я новичок в Tensorflow и Keras. Я загрузил набор данных из CSV и создал train_dataset как таковой:

column_names = ['a', 'date', 'c', 'd', 'e', 'f']
label_name = column_names[0]
feature_names = column_names[1:]
class_names = ['good', 'bad']

train_dataset = tf.data.experimental.make_csv_dataset(
    train_dataset_fp,
    batch_size,
    column_names=column_names,
    label_name=label_name,
    num_epochs=1)

features, labels = next(iter(train_dataset))
print(features)

Мои функции - это OrderedDict и печатаю как:

OrderedDict ([('b', ), ('Дата', ), ('d', ), ('е', ), ('f', )])

Как видите, у одного из них dtype = int64. Затем я использую следующую функцию для упаковки функций в массив:

def pack_features_vector(features, labels):
  features = tf.stack(list(features.values()), axis=1)
  return features, labels

Однако, когда я запускаю ее:

train_dataset = train_dataset.map(pack_features_vector)

, я получаю следующую ошибку:

«TypeError: тензоры в списке, переданном в« значения »операции« Pack », имеют типы [int32, int64, int32, int32, int32], которые не совпадают со всеми.»

Я понимаю, что проблема в функция стека. У меня есть дата в формате эпохи в качестве второй функции, которая была прочитана как int64. Я думаю, что проще всего преобразовать все тензоры в один и тот же dType, но я не уверен, как это сделать. Я вижу, что коллекция функций - это OrderedDict из Numpy массивов, но я не знаю, как изменить dType элементов. Я пробовал следующее, это не дало результатов, но когда я снова распечатал свои функции, все типы dtypes остались прежними:

for k,v in train_dataset:
  tf.dtypes.cast(v, tf.int64)

Я был бы очень признателен за любую помощь. Спасибо.

1 Ответ

0 голосов
/ 01 августа 2020

Думаю, я понял. Мне нужно было добавить column_defaults:

column_names = ['a', 'b', 'date', 'd', 'e', 'f']
column_defaults=[tf.int64, tf.int64, tf.int64, tf.int64, tf.int64, tf.int64]
label_name = column_names[0]
feature_names = column_names[1:]
class_names = ['good', 'bad']

batch_size = 32

train_dataset = tf.data.experimental.make_csv_dataset(
    train_dataset_fp,
    batch_size,
    column_names=column_names,
    column_defaults=column_defaults,
    label_name=label_name,
    num_epochs=1)

features, labels = next(iter(train_dataset))

def pack_features_vector(features, labels):
  features = tf.stack(list(features.values()), axis=1)
  return features, labels

train_dataset = train_dataset.map(pack_features_vector)

Но теперь я пытаюсь создать модель и прогнозы:

model = tf.keras.Sequential([
  tf.keras.layers.Dense(128, activation=tf.nn.relu, input_shape=(5,)),
  tf.keras.layers.Dense(128, activation=tf.nn.relu),
  tf.keras.layers.Dense(2)
])

predictions = model(features)

И получить «KeyError: 'density_input'», не знаю почему.

...