Ошибка Tensorflow keras model_load: ошибка ValueError: должно быть определено последнее измерение входных данных для `Dense`. Найдено `None`

#python #tensorflow #keras

#python #tensorflow #keras

Вопрос:

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

Это модель, которая была разработана

 import tensorflow as tf
from tensorflow.keras.utils import Sequence
from tensorflow.keras.applications.vgg16 import VGG16
from keras.layers.core import Dense, Dropout, Activation, Flatten
from tensorflow.keras.applications.vgg16 import VGG16

def create_model():
    model = tf.keras.Sequential()
    model.add(tf.keras.layers.Input((320, 640, 3)))

    vgg_model = VGG16(weights='imagenet', include_top=False)

    model.add(vgg_model)

    model.add(tf.keras.layers.Flatten())
    model.add(tf.keras.layers.Dense(256))
    model.add(tf.keras.layers.Activation('relu'))
    model.add(tf.keras.layers.Dropout(0.5))

    model.add(tf.keras.layers.Dense(128))
    model.add(tf.keras.layers.Activation('relu'))
    model.add(tf.keras.layers.Dropout(0.5))

    model.add(tf.keras.layers.Dense(1))
    model.add(tf.keras.layers.Activation('linear'))
    
    optimizer = tf.keras.optimizers.Adam(learning_rate = 0.0001)
    model.compile(loss = 'mean_squared_error', optimizer = optimizer)
  
    return model


model = create_model()
model.fit(data_generator, epochs = 1)
model.save(model_folder   '/model.h5')

  

После обучения модели в моем наборе данных я пытаюсь загрузить в другой скрипт

 model = tf.keras.models.load_model(model_folder   '/model.h5')
  

Это приводит к следующей ошибке

 raise ValueError('The last dimension of the inputs to `Dense` '
ValueError: The last dimension of the inputs to `Dense` should be defined. Found `None`.
  

Я использую tensorflow версии 2.1.0 и keras версии 2.3.1

Есть идеи, почему это происходит и как решить эту проблему?

Комментарии:

1. Рекомендуется не смешивать keras и tensorflow.keras импортировать. Все импортируемые keras должны быть from tensorflow.keras.layers import Dense . Может быть, попробуйте это?

2. Я внес изменения, чтобы не сохранять модель как файл ‘.h5’ и разрешить tensorflow сохранять ее в том виде, в котором она была получена, просто указав путь к каталогу. И это сработало, когда я это сделал. Новая команда сохранения будет model.save(model_folder '/model')

Ответ №1:

Возможно, вам потребуется указать input_shape в соответствии с документами tf, где указано

input_shape: необязательный кортеж формы, который следует указывать, только если include_top имеет значение False (в противном случае форма ввода должна быть (224, 224, 3)

В вашем случае vgg_model = VGG16(weights='imagenet', include_top=False, input_shape=((320, 640, 3))) может помочь?