#python #tensorflow
#python #tensorflow
Вопрос:
class RoastBot(tf.keras.Model):
def __init__(self, vocab_size, embedding_dim, batch_size, conv_arr, rnn_arr):
super(RoastBot, self).__init__()
self.img_input = tf.keras.layers.Input(batch_input_shape=[batch_size,None,None,3])
self.text_input = tf.keras.layers.Embedding(vocab_size, embedding_dim, batch_input_shape=[batch_size,None])
self.vocab = tf.keras.layers.Dense(vocab_size)
def call(self, inputs):
img = np.array(inputs['input_1'])
print(img)
text = tf.convert_to_tensor(inputs['input_2'])
x = self.img_input(img)
x_prime = self.text_input(text)
x = tf.keras.backend.flatten(x)
x = tf.keras.backend.concatenate((x,x_prime))
return self.vocab(x)
В настоящее время у меня возникли проблемы с model.fit, поэтому я занимаюсь некоторой отладкой. Моя модель принимает в качестве входных данных изображение и последовательность целых чисел в качестве двух отдельных входных данных:
input_dict = {}
input_dict['input_1'] = img
input_dict['input_2'] = tokenizer.texts_to_sequences([u'You look like '])
print(img.shape)
model(input_dict)
Но в call(), строке x = self.img_input(img)
, я получаю TypeError, что тензор не может быть вызван. Я начинаю думать, что входной слой просто не вызывается при создании пользовательской модели, я не прав? В чем здесь проблема?
Ответ №1:
Да, я разобрался с проблемой. Похоже, мое предположение было правильным, проблема заключается в том, что в качестве фактического ввода используется входной слой.
Вместо этого используйте любой следующий слой, в моем случае слой Conv2D, и обязательно установите batch_input_shape
или input_shape