【问题标题】:Traing a CNN using Prelu activation function使用 Relu 激活函数训练 CNN
【发布时间】:2021-03-30 03:50:16
【问题描述】:

我正在尝试使用prelu 激活函数训练模型,但出现以下错误

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
/usr/local/lib/python3.7/dist-packages/tensorflow/python/ops/array_ops.py in zeros(shape, dtype, name)
   2965         shape = constant_op._tensor_shape_tensor_conversion_function(
-> 2966             tensor_shape.TensorShape(shape))
   2967       except (TypeError, ValueError):

31 frames
ValueError: Cannot convert a partially known TensorShape to a Tensor: (None, None, 64)

During handling of the above exception, another exception occurred:

ValueError                                Traceback (most recent call last)
/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.

我正在使用下面提到的代码,请告诉我如何更正它。

from tensorflow.keras.applications import MobileNet
from tensorflow.keras.layers import (Conv2D, MaxPooling2D, 
                                     GlobalAveragePooling2D, Dropout, Dense)
from tensorflow.keras import Model
from tensorflow import keras

CLASSES = 2
#model.compile()

# setup model
base_model = MobileNet(weights='imagenet', include_top=False)
input = (224, 224, 3)
x = base_model.output
x = Conv2D(64, (3,3), padding='same', activation = keras.layers.PReLU(alpha_initializer='zeros', alpha_regularizer=None, alpha_constraint=None, shared_axes=None), strides= (2,2), name='layer1')(x)
x = MaxPooling2D(pool_size=(2,2))(x)

x = Conv2D(128, (3,3), padding='same', activation = keras.layers.PReLU(alpha_initializer='zeros', alpha_regularizer=None, alpha_constraint=None, shared_axes=None), name='layer2')(x)

x = GlobalAveragePooling2D(name='avg_pool')(x)

x = Dropout(0.4)(x)
predictions = Dense(CLASSES, activation=tf.keras.activations.sigmoid)(x)
model = Model(inputs=base_model.input, outputs=predictions)
 
# transfer learning
for layer in base_model.layers:
 layer.trainable = False
 
model.compile(optimizer='rmsprop',loss='categorical_crossentropy',metrics=['accuracy'])

【问题讨论】:

  • 请使用完整的错误跟踪更新您的问题。
  • 我添加了一些必要的导入并重现了 OP 的错误并将它们添加到问题中。

标签: python tensorflow machine-learning deep-learning conv-neural-network


【解决方案1】:

您的张量输入错误。你需要这样设置

input_s = layers.Input((224, 224, 3))
base_model = keras.applications.MobileNet(weights='imagenet', 
                                 include_top=False, input_tensor=input_s)
...

完整的工作代码

from tensorflow.keras.applications import MobileNet
from tensorflow.keras.layers import (Conv2D, MaxPooling2D, 
                                     GlobalAveragePooling2D, Dropout, Dense)
from tensorflow.keras import Model
from tensorflow import keras
from tensorflow.keras import layers
import tensorflow as tf 
CLASSES = 2
# setup model
input_s = layers.Input((224, 224, 3))
base_model = keras.applications.MobileNet(weights='imagenet', 
                      include_top=False, input_tensor=input_s)
x = layers.Conv2D(64, (3,3), padding='same', 
                  activation = keras.layers.PReLU(
                      alpha_initializer='zeros', 
                      alpha_regularizer=None,
                       alpha_constraint=None, 
                       shared_axes=None), 
                  strides= (2,2), name='layer1')(base_model.output)
x = layers.MaxPooling2D(pool_size=(2,2))(x)
x = layers.Conv2D(128, (3,3), padding='same', 
                  activation = keras.layers.PReLU(alpha_initializer='zeros', 
                                                  alpha_regularizer=None, 
                                                  alpha_constraint=None, 
                                                  shared_axes=None), name='layer2')(x)

x = layers.GlobalAveragePooling2D(name='avg_pool')(x)
x = layers.Dropout(0.4)(x)

predictions = layers.Dense(CLASSES, 
                      activation=tf.keras.activations.sigmoid)(x)
model = tf.keras.Model(inputs=base_model.input, outputs=predictions)

# transfer learning
for layer in base_model.layers:
 layer.trainable = False

model.compile(optimizer='rmsprop',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

【讨论】:

  • 尝试了代码,但出现以下错误“input_s = layers.Input((224, 224, 3)) NameError: name 'layers' is not defined"
  • 如果你不明白,请不要犹豫。请使用最新发现更新您的问题。
  • 当然我会试试,如果我能做到,我会告诉你,谢谢。
  • 更新了答案。只需添加这些进口。它应该可以工作。
猜你喜欢
  • 2019-11-16
  • 2021-08-31
  • 1970-01-01
  • 1970-01-01
  • 2021-02-10
  • 2018-01-12
  • 2017-05-06
  • 2018-04-17
  • 2010-10-05
相关资源
最近更新 更多