Объект PrefetchDataset’ не имеет атрибута ‘ndim’

#python #tensorflow #keras

#python #тензорный поток #keras

Вопрос:

Я использую приведенный ниже код для прогнозирования следующего слова с использованием GRU.

 import numpy as np
shakespeare_url = "https://homl.info/shakespeare"
filepath = keras.utils.get_file("shakespeare.txt",shakespeare_urlspeare_url)

with open(filepath) as f:
    shakespeare_txt = f.read()
    
tokenizer = keras.preprocessing.text.Tokenizer(char_level=True)
tokenizer.fit_on_texts(shakespeare_txt)
max_id = len(tokenizer.word_index) ## Number of distinct words
dataset_size = tokenizer.document_count ## total number of character
[encoded] = np.array(tokenizer.texts_to_sequences([shakespeare_txt])) - 1
train_size = (dataset_size * 90) // 100
dataset = tf.data.Dataset.from_tensor_slices(encoded[:train_size])
n_steps = 100
window_length = n_steps  1
dataset = dataset.window(window_length,shift=1,drop_remainder=True)
dataset = dataset.flat_map(lambda window : window.batch(window_length))
batch_size =32
dataset = dataset.shuffle(10000).batch(batch_size)
dataset = dataset.map(lambda windows : (windows[:,:-1],windows[:,1:]))
dataset = dataset.map(lambda X_batch,Y_batch : (tf.one_hot(X_batch,depth = max_id),Y_batch))
dataset = dataset.prefetch(1)
model = keras.models.Sequential([
    keras.layers.GRU(128, return_sequences=True, input_shape =[None,max_id], dropout=0.2,recurrent_dropout=0.2),
    keras.layers.GRU(128,return_sequences=True,dropout=0.2,recurrent_dropout=0.2),
    keras.layers.TimeDistributed(keras.layers.Dense(max_id,activation='softmax'))
])
model.compile(loss='sparse_categorical_crossentropy',optimizer='adam')
history = model.fit(dataset,epochs=20)
  

Получаю исключение ниже. Пожалуйста, помогите мне решить эту проблему??

Обратная трассировка ошибки атрибута (последнего вызова) в —-> 1 истории = model.fit(набор данных, эпохи = 20)

c:usersdixitappdatalocalprogramspythonpython38libsite-packageskerasenginetraining.py в fit(self, x, y, batch_size, epochs, подробный, обратные вызовы, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_freq, max_queue_size, workers, use_multiprocessing, ** kwargs) 1148 1149 # Случай 2: символический тензоры или что-то вроде массива Numpy. -> 1150 x, y, sample_weights = self._standardize_user_data(1151 x, y, 1152 sample_weight=sample_weight,

c:usersdixitappdatalocalprogramspythonpython38libsite-packageskerasenginetraining.py в _standardize_user_data(self, x, y, sample_weight, class_weight, check_array_lengths, batch_size) 572 573 # Стандартизировать входные данные. —> 574 x = training_utils.standardize_input_data( 575 x, 576 feed_input_names,

c:usersdixitappdatalocalprogramspythonpython38libsite-packageskerasenginetraining_utils.py в standardize_input_data(данные, имена, фигуры, check_batch_axis, exception_prefix) 97 data = данные.значения, если data.class.name == ‘DataFrame’ else data 98 data = [данные] —> 99 data = [стандартизовать единый массив (x) для x в данных] 100 101 если len(данные) != len(имена):

c:usersdixitappdatalocalprogramspythonpython38libsite-packageskerasenginetraining_utils.py в (.0) 97 data = данные.значения, если data.class.name == ‘DataFrame’ else data 98 data = [данные] —> 99 data = [standardize_single_array(x) для x в данных] 100 101 если len(данные) != len(имена):

c:usersdixitappdatalocalprogramspythonpython38libsite-packageskerasenginetraining_utils.py в standardize_single_array(x) 32 ‘Получил тензор с формой: %s’ % str(shape)) 33 возвращает x —> 34 elif x.ndim == 1: 35 x = np.expand_dims(x, 1) 36 возвращает x

Ошибка атрибута: объект ‘PrefetchDataset’ не имеет атрибута ‘ndim’

Ответ №1:

Обязательно импортируйте keras из tensorflow и используйте версию 2.2.4-tf. Получил ту же ошибку, и это сработало для меня.

 from tensorflow import keras
keras.__version__
  

2.2.4-tf