Я получил эту ошибку при обучении модели gru TypeError: неподдерживаемые типы операндов для *: 'int' и 'NoneType'

код из Руководства по машинному обучению с помощью Scikit Learn Keras и TensorFlow 2nd Edition-2019

import tensorflow as tf
from tensorflow import keras

from __future__ import print_function
from keras.callbacks import LambdaCallback
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.optimizers import RMSprop
from keras.utils.data_utils import get_file
import numpy as np
import random
import sys
import io
import gzip
import urllib

shakespeare_url = "https://homl.info/shakespeare" # shortcut URL
filepath = keras.utils.get_file("shakespeare.txt", shakespeare_url)
with open(filepath) as f:
    shakespeare_text = f.read()

tokenizer = keras.preprocessing.text.Tokenizer(char_level=True)
tokenizer.fit_on_texts([shakespeare_text])

max_id = len(tokenizer.word_index) # number of distinct characters
dataset_size = tokenizer.document_count # total number of characters

[encoded] = np.array(tokenizer.texts_to_sequences([shakespeare_text])) - 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 # target = input shifted 1 character ahead
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)

при выполнении history = model.fit(dataset, epochs=20) это дает мне 1/Unknown - 3s 3s/step и ошибку TypeError: неподдерживаемый тип(ы) операнда для *: 'int' и 'NoneType'


person Ahmad Mohammed Abd Elhameed    schedule 13.12.2019    source источник
comment
Что вы сделали, чтобы попытаться решить эту проблему? Это вся трассировка ошибок? Что вы понимаете из этого сообщения об ошибке?   -  person AMC    schedule 13.12.2019
comment
Я думал, что проблема в keras, тогда я использовал tf.keras, но то же самое   -  person Ahmad Mohammed Abd Elhameed    schedule 13.12.2019
comment
Это как-то связано с данными, нет?   -  person AMC    schedule 13.12.2019
comment
Я изменил его с другими текстовыми файлами. Та же ошибка   -  person Ahmad Mohammed Abd Elhameed    schedule 14.12.2019


Ответы (1)


Я воспроизвел вашу ошибку, ошибка связана не с данными или какими-либо пакетами, а с тем, как вы пытаетесь подогнать токенизатор к своим данным, используя tokenizer.fit_on_texts().
Поскольку вы сформировали свои данные в строку, вам нужно подогнать использование строковых данных напрямую, а не в списке.

Я изменил ваш код, и он работает без ошибок.

import tensorflow as tf
from tensorflow import keras

from __future__ import print_function
from keras.callbacks import LambdaCallback
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.optimizers import RMSprop
from keras.utils.data_utils import get_file
import numpy as np
import random
import sys
import io
import gzip
import urllib 

shakespeare_url = "https://homl.info/shakespeare" # shortcut URL
filepath = keras.utils.get_file("shakespeare.txt", shakespeare_url)
with open(filepath) as f:
    shakespeare_text = f.read() 


tokenizer = keras.preprocessing.text.Tokenizer(char_level=True)
#tokenizer.fit_on_texts(shakespeare_text) old line with text input as a list.
tokenizer.fit_on_texts(shakespeare_text)



max_id = len(tokenizer.word_index) # number of distinct characters
dataset_size = tokenizer.document_count # total number of characters

[encoded] = np.array(tokenizer.texts_to_sequences([shakespeare_text])) - 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 # target = input shifted 1 character ahead
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,steps_per_epoch=train_size // batch_size, epochs=20)  

Поскольку это большие данные, я не мог предоставить здесь вывод, учитывая затраты времени.

Выполняется обучение:

Epoch 1/20
  138/31370 [..............................] - ETA: 3:47:54 - loss: 2.8267
person Tensorflow Warrior    schedule 23.05.2020
comment
@Ahmad Mohammed Abd Elhameed - Если ваша проблема решена из приведенного выше ответа, пожалуйста, примите и поддержите ответ, спасибо. - person Tensorflow Warrior; 23.05.2020