【问题标题】:ValueError: Attempt to convert a value (None) with an unsupported type (<class 'NoneType'>) to a Tensor. Flatten LayerValueError:尝试将具有不受支持的类型 (<class 'NoneType'>) 的值 (None) 转换为张量。展平层
【发布时间】:2021-05-26 19:15:16
【问题描述】:

我正在尝试使用 Keras 的 VGG16,我标记了 include_top=false
但我遇到了ValueError: Attempt to convert a value (None) with an unsupported type (&lt;class 'NoneType'&gt;) 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)) = &lt;class 'keras.engine.keras_tensor.KerasTensor'&gt;
我不知道为什么该行引用无类型对象

【问题讨论】:

    标签: python tensorflow machine-learning keras deep-learning


    【解决方案1】:

    我能够复制您的问题,如下所示

    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'>
    

    注意:切勿混合使用 kerastensorflow

    【讨论】:

      【解决方案2】:

      我的代码也有同样的问题:

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

      然后我改成

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

      它成功了。

      【讨论】:

      • 我找到了一些解决方案:
      【解决方案3】:

      我找到了这个解决方案,它对我有用

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-22
        • 1970-01-01
        • 2020-07-05
        • 2020-09-09
        相关资源
        最近更新 更多