Tensorflow 2.0: ValueError: индекс 0 среза измерения 0 выходит за пределы - PullRequest
0 голосов
/ 05 августа 2020

Моя текущая задача - выполнить двоичную классификацию с использованием как числовых, так и порядковых категориальных данных.

Для этой задачи я эффективно воспроизвел код из следующего руководства Tensorflow: https://www.tensorflow.org/tutorials/structured_data/feature_columns

В настоящее время я изо всех сил пытаюсь найти причину, по которой возникает следующая ошибка, и как ее исправить.

Ошибка:

ValueError: slice index 0 of dimension 0 out of bounds. for 'strided_slice' (op: 'StridedSlice') with input shapes: [0], [1], [1], [1] and with computed input tensors: input[1] = <0>, input[2] = <1>, input[3] = <1>.

Код:

from tensorflow import feature_column
from tensorflow.keras import layers
from sklearn.preprocessing import StandardScaler, PolynomialFeatures

# A utility method to create a tf.data dataset from a Pandas Dataframe
def df_to_dataset(dataframe, shuffle=True, batch_size=32):
    dataframe = dataframe.copy()
    labels = dataframe.pop('target').astype('float64')
    ds = tf.data.Dataset.from_tensor_slices((dict(dataframe), labels))
    if shuffle:
        ds = ds.shuffle(buffer_size=len(dataframe))
        ds = ds.batch(batch_size)
    return ds

scaler = StandardScaler()
vals = ["Low", "Med", "High"]


# Categorical data preparation 
# Creativity, Productivity, Optimism, Pessimism is ordinal categorical --> numerical
for c in features[2:]:
    if c != "Creativity":
        data[c] = pd.Categorical(data[c], categories = vals, ordered = True)
        data[c] = data[c].cat.codes / 2
        
    else:
        data[c] = pd.Categorical(data[c], categories = ["No", "Yes"], ordered = False)
        data[c] = data[c].cat.codes.astype('float64')
        
data.loc[:, ["Social", "Exercise"]] = scaler.fit_transform(X = data.loc[:, ["Social", "Exercise"]].values)

# Splitting Data
train, test = train_test_split(data, test_size=0.2)
train, val = train_test_split(train, test_size=0.2)

# Tried reducing batch size as per a solution to a similar StackOverflow query 
batch_size = 2
train_ds = df_to_dataset(train, batch_size=batch_size)
val_ds = df_to_dataset(val, shuffle=False, batch_size=batch_size)
test_ds = df_to_dataset(test, shuffle=False, batch_size=batch_size)


feature_columns = []

# numeric cols
for header in features:
      feature_columns.append(feature_column.numeric_column(header))

# This is to concatenate all of these features for each example into single vectors
feature_layer = tf.keras.layers.DenseFeatures(feature_columns)

# Model Architecture
model = tf.keras.Sequential([
  feature_layer,
  layers.Dense(128, activation='relu'),
  layers.Dense(128, activation='relu'),
  layers.Dropout(.1),
  layers.Dense(1, activation='sigmoid')
])

model.compile(optimizer='adam',
              loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
              metrics=['accuracy'])

model.fit(train_ds,validation_data=val_ds, epochs=10)

Данные

Every feature: ['Creativity', 'Productivity', 'Optimism', 'Pessimism']
A batch of Creativity: tf.Tensor([0. 0.], shape=(2,), dtype=float64)
A batch of Productivity: tf.Tensor([0.5 0.5], shape=(2,), dtype=float64)
A batch of Optimism: tf.Tensor([-0.5 -0.5], shape=(2,), dtype=float64)
A batch of Pessimism: tf.Tensor([-0.5 -0.5], shape=(2,), dtype=float64)
A batch of targets: tf.Tensor([0. 0.], shape=(2,), dtype=float64)

Любая помощь в понимании того, где возникла эта ошибка и как ее решить, будет fantasti c!

** РЕДАКТИРОВАТЬ: ** После запуска в Google Colaboratory я получаю эту ошибку при запуске model.fit()

    ValueError: Feature (key: Creativity) cannot have rank 0. Given: Tensor("sequential_2/Cast:0", shape=(), dtype=float32)

1 Ответ

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

Итак, проведя небольшое исследование: я обнаружил, что эта ошибка вызвана ds = ds.batch(batch_size), который имеет неправильный отступ.

Функция df_to_dataset должна быть написана следующим образом (я, должно быть, скопировал ее неверно из учебника):

# A utility method to create a tf.data dataset from a Pandas Dataframe
def df_to_dataset(dataframe, shuffle=True, batch_size=32):
    dataframe = dataframe.copy()
    labels = dataframe.pop('target').astype('float64')
    ds = tf.data.Dataset.from_tensor_slices((dict(dataframe), labels))
    if shuffle:
        ds = ds.shuffle(buffer_size=len(dataframe))
    ds = ds.batch(batch_size)
    return ds
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...