Ошибка значения: Попытка преобразовать значение (Нет) с неподдерживаемым типом () в тензор. Выровнять Слой

#python #tensorflow #machine-learning #keras #deep-learning

Вопрос:

Я пытаюсь использовать VGG16 от Keras , я отметил отмеченный include_top=false
Но я столкнулся с ошибкой, которая говорит ValueError: Attempt to convert a value (None) with an unsupported type (<class 'NoneType'>) to a Tensor.
Вот код :

 input_shape = (150,150,3)
model_1 = VGG16(weights='imagenet',include_top=False,input_shape=input_shape)
Last_layer=model_1.layers[-1].output
print(Last_layer)
print(type(Last_layer))
Model_Vgg=keras.layers.Flatten()(Last_layer) #<---- error rised here
 
#Model_Vgg=keras.Model(model.input,layer_output)

Model_Vgg = layers.Dropout(0.5)(Model_Vgg)


Model_Vgg = layers.Dense(units=3, activation='softmax') (Model_Vgg)

model = keras.Model(inputs =model_1.input,outputs = Model_Vgg )
model.compile(loss='categorical_crossentropy',optimizer=optimizers.SGD(lr=0.005708),metrics=['accuracy'])

monitor = EarlyStopping(monitor='accuracy',patience=50, mode='auto', restore_best_weights=True)
model.fit(X_Train,Y_Train,callbacks=[monitor],epochs=280,verbose=0)
(loss, accuracy) = model.evaluate(X_Test, Y_Test, batch_size=32, verbose=50)
print("[INFO] loss={:.4f}, accuracy: {:.4f}%".format(loss,accuracy * 100)) 
 

И это показывает, что print(type(Last_layer)) = <class 'keras.engine.keras_tensor.KerasTensor'>
Я понятия не имею, почему строка ссылается на объект типа None

Ответ №1:

у меня была та же проблема с кодом:

 from keras.layers import Dense, Flatten
x = vgg.output(Flatten())
 

затем я изменил его на

 from tensorflow.keras import layers
x = layers.Flatten()(vgg.output)
 

и это сработало.

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

1. Я нашел какое-то решение :

Ответ №2:

Я нашел это решение, и оно сработало для меня

 def Create_Model():
  #input_shape = (150,150,3)
  model_1 = VGG16(weights='imagenet',include_top=False)
  input = keras.layers.Input(shape=(150,150,3))
  Last_layer=model_1(input)

  Model_Vgg=keras.layers.Flatten()(Last_layer)   
  #Model_Vgg=keras.Model(model.input,layer_output)
  Model_Vgg = layers.Dropout(0.5)(Model_Vgg)
  Model_Vgg = layers.Dense(units=3, activation='softmax') (Model_Vgg)
  model = keras.Model(inputs =input,outputs = Model_Vgg )
  return model
 

Ответ №3:

Я смог воспроизвести вашу проблему, как показано ниже

 import tensorflow as tf
from tensorflow.keras import layers
from tensorflow.keras.applications.vgg16 import VGG16

input_shape = (150,150,3)
model_1 = VGG16(weights='imagenet',include_top=False,input_shape=input_shape)
Last_layer=model_1.layers[-1].output
#print(Last_layer)
#print(type(Last_layer))
Model_Vgg=keras.layers.Flatten()(Last_layer)
Model_Vgg = layers.Dropout(0.5)(Model_Vgg)
Model_Vgg = layers.Dense(units=3, activation='softmax') (Model_Vgg)

model = keras.Model(inputs =model_1.input,outputs = Model_Vgg )
model.compile(loss='categorical_crossentropy',optimizer=tf.keras.optimizers.SGD(learning_ratek=0.005708),metrics=['accuracy'])
 

Выход:

 ---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-20-3d087167b224> in <module>()
      8 #print(Last_layer)
      9 #print(type(Last_layer))
---> 10 Model_Vgg=keras.layers.Flatten()(Last_layer)
     11 Model_Vgg = layers.Dropout(0.5)(Model_Vgg)
     12 Model_Vgg = layers.Dense(units=3, activation='softmax') (Model_Vgg)

5 frames
/usr/local/lib/python3.7/dist-packages/tensorflow/python/framework/constant_op.py in convert_to_eager_tensor(value, ctx, dtype)
     96       dtype = dtypes.as_dtype(dtype).as_datatype_enum
     97   ctx.ensure_initialized()
---> 98   return ops.EagerTensor(value, ctx.device_name, dtype)
     99 
    100 

ValueError: Attempt to convert a value (None) with an unsupported type (<class 'NoneType'>) to a Tensor.
 

Фиксированный код:

Ваша проблема может быть решена, как только вы замените keras.layers.Flatten() layers.Flatten() ее .

Рабочий код, как показано ниже

 import tensorflow as tf
from tensorflow.keras import layers, Model
from tensorflow.keras.applications.vgg16 import VGG16

input_shape = (150,150,3)
model_1 = VGG16(weights='imagenet',include_top=False,input_shape=input_shape)
Last_layer=model_1.layers[-1].output
print(Last_layer)
print(type(Last_layer))
Model_Vgg=layers.Flatten()(Last_layer)
Model_Vgg = layers.Dropout(0.5)(Model_Vgg)
Model_Vgg = layers.Dense(units=3, activation='softmax') (Model_Vgg)

model = Model(inputs =model_1.input,outputs = Model_Vgg )
model.compile(loss='categorical_crossentropy',optimizer=tf.keras.optimizers.SGD(learning_rate=0.005708),metrics=['accuracy'])
 

Выход:

 KerasTensor(type_spec=TensorSpec(shape=(None, 4, 4, 512), dtype=tf.float32, name=None), name='block5_pool/MaxPool:0', description="created by layer 'block5_pool'")
<class 'tensorflow.python.keras.engine.keras_tensor.KerasTensor'>
 

Примечание: Вы никогда не должны смешивать keras и. tensorflow