2

这段代码有一个问题,我删除SeBlock类,只运行 CNN 类,然后一切正常。如果我插入课堂SeBlockCNN则会发生错误,并显示NotImplementedError. 我不知道导致这个问题,我尝试解决这个问题,但是我搜索的所有方法都不起作用。谁能帮帮我,非常感谢!

import tensorflow as tf

class SeBlock(tf.keras.Model):

    def __init__(self, ratio, channel):
        super(SeBlock, self).__init__()
        self.kernel_initializer = tf.keras.initializers.VarianceScaling()
        self.bias_initializer = tf.constant_initializer(value=0.0)
        self.ratio = ratio
        
        self.ReduceMean = tf.keras.layers.GlobalAveragePooling2D()
        self.DenseCut = tf.keras.Sequential([
            tf.keras.layers.Dense(units=channel,
                                  activation=tf.nn.relu, kernel_initializer=self.kernel_initializer,
                                  bias_constraint=self.bias_initializer),
            tf.keras.layers.Dense(units=channel,
                                  activation=tf.nn.sigmoid,
                                  kernel_initializer=self.kernel_initializer,
                                  bias_constraint=self.bias_initializer)

        ])
        self.flatten = tf.keras.layers.Reshape(target_shape=(1, 1, channel,))

    def call(self, inputs, training=True):
        if training:print("training network")
        x = self.ReduceMean(inputs)
        x = self.DenseCut(x, training)
        scale = self.flatten(x)
        scale = tf.keras.layers.multiply([inputs,scale])
        # scale *= inputs
        return scale


class CNN(tf.keras.Model):
    def __init__(self, se_block):
        super(CNN, self).__init__()
        self.conv1 = tf.keras.layers.Conv2D(
            filters=32,             # 
            kernel_size=[5, 5],     # 
            padding='same',         # 
            activation=tf.nn.relu   # 
        )
        self.seblock1 = self._make_layer(se_block= se_block, ratio=1, input_channel=32)
        self.pool1 = tf.keras.layers.MaxPool2D(pool_size=[2, 2], strides=2)
        self.conv2 = tf.keras.layers.Conv2D(
            filters=64,
            kernel_size=[5, 5],
            padding='same',
            activation=tf.nn.relu
        )
        self.pool2 = tf.keras.layers.MaxPool2D(pool_size=[2, 2], strides=2)
        self.flatten = tf.keras.layers.Reshape(target_shape=(112 * 112 * 64,))
        self.dense2 = tf.keras.layers.Dense(units=10)

    def _make_layer(self, se_block, ratio, input_channel):
        return tf.keras.Sequential([se_block(ratio=ratio,channel=input_channel)])

    def call(self, inputs, training=True):
        print("1",inputs.get_shape().as_list())
        x = self.conv1(inputs)                  # [batch_size, 28, 28, 32]

        # print("start se-block")
        x = self.seblock1(x, training)
        # print("end se-block")

        x = self.pool1(x)                       # [batch_size, 14, 14, 32]
        x = self.conv2(x)                       # [batch_size, 14, 14, 64]
        x = self.pool2(x)                       # [batch_size, 7, 7, 64]
        x = self.flatten(x)                     # [batch_size, 7 * 7 * 64]
        x = self.dense2(x)                      # [batch_size, 10]
        return tf.nn.softmax(x)

def CNNDense():
    return CNN(SeBlock)

主要代码如下。

import tensorflow as tf
import LoadImage as readimage
import DenseBSE

tf.keras.backend.clear_session()

train_path = r"E:\BaiduNetdiskDownload\板角\boardtrain"
test_path =  r"E:\BaiduNetdiskDownload\板角\boardtest"

BatchSize = 4
Epoch = 60
lr = 0.001

ds_train, train_count = readimage.load_tensor_img(train_path, 
                                                  batch_size=BatchSize,
                                                  epoch=Epoch)

ds_test, test_count = readimage.load_tensor_img(test_path, 
                                                  batch_size=BatchSize,
                                                  epoch=Epoch)

model = DenseBSE.CNNDense()
model.build(input_shape=(BatchSize, 448, 448, 3))
model.summary()

model.compile(optimizer=tf.keras.optimizers.Adam(),
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])


epoch_steps = train_count // BatchSize
val_steps = test_count // BatchSize


model.fit(ds_train, epochs=Epoch, steps_per_epoch = epoch_steps,
          validation_data=ds_test, validation_steps = val_steps)

并且错误信息显示在下方。

Traceback (most recent call last):
  File "C:\ProgramData\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py", line 3343, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-2-41c34ae2b3b4>", line 1, in <module>
    runfile('E:/PythonProject/CNN_training.py', wdir='E:/PythonProject')
  File "C:\Program Files\JetBrains\PyCharm 2020.3.5\plugins\python\helpers\pydev\_pydev_bundle\pydev_umd.py", line 197, in runfile
    pydev_imports.execfile(filename, global_vars, local_vars)  # execute the script
  File "C:\Program Files\JetBrains\PyCharm 2020.3.5\plugins\python\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "E:/PythonProject/CNN_training.py", line 35, in <module>
    model.fit(ds_train, epochs=Epoch, steps_per_epoch = epoch_steps,
  File "C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\keras\engine\training.py", line 1100, in fit
    tmp_logs = self.train_function(iterator)
  File "C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\eager\def_function.py", line 828, in __call__
    result = self._call(*args, **kwds)
  File "C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\eager\def_function.py", line 871, in _call
    self._initialize(args, kwds, add_initializers_to=initializers)
  File "C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\eager\def_function.py", line 725, in _initialize
    self._stateful_fn._get_concrete_function_internal_garbage_collected(  # pylint: disable=protected-access
  File "C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\eager\function.py", line 2969, in _get_concrete_function_internal_garbage_collected
    graph_function, _ = self._maybe_define_function(args, kwargs)
  File "C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\eager\function.py", line 3361, in _maybe_define_function
    graph_function = self._create_graph_function(args, kwargs)
  File "C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\eager\function.py", line 3196, in _create_graph_function
    func_graph_module.func_graph_from_py_func(
  File "C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\framework\func_graph.py", line 990, in func_graph_from_py_func
    func_outputs = python_func(*func_args, **func_kwargs)
  File "C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\eager\def_function.py", line 634, in wrapped_fn
    out = weak_wrapped_fn().__wrapped__(*args, **kwds)
  File "C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\framework\func_graph.py", line 977, in wrapper
    raise e.ag_error_metadata.to_exception(e)
NotImplementedError: in user code:
    C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\keras\engine\training.py:805 train_function  *
        return step_function(self, iterator)
    C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\keras\engine\training.py:795 step_function  **
        outputs = model.distribute_strategy.run(run_step, args=(data,))
    C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\distribute\distribute_lib.py:1259 run
        return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)
    C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\distribute\distribute_lib.py:2730 call_for_each_replica
        return self._call_for_each_replica(fn, args, kwargs)
    C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\distribute\distribute_lib.py:3417 _call_for_each_replica
        return fn(*args, **kwargs)
    C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\keras\engine\training.py:788 run_step  **
        outputs = model.train_step(data)
    C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\keras\engine\training.py:757 train_step
        self.optimizer.minimize(loss, self.trainable_variables, tape=tape)
    C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\keras\optimizer_v2\optimizer_v2.py:498 minimize
        return self.apply_gradients(grads_and_vars, name=name)
    C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\keras\optimizer_v2\optimizer_v2.py:631 apply_gradients
        return distribute_ctx.get_replica_context().merge_call(
    C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\distribute\distribute_lib.py:2941 merge_call
        return self._merge_call(merge_fn, args, kwargs)
    C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\distribute\distribute_lib.py:2948 _merge_call
        return merge_fn(self._strategy, *args, **kwargs)
    C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\keras\optimizer_v2\optimizer_v2.py:682 _distributed_apply  **
        update_ops.extend(distribution.extended.update(
    C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\distribute\distribute_lib.py:2494 update
        return self._update(var, fn, args, kwargs, group)
    C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\distribute\distribute_lib.py:3431 _update
        return self._update_non_slot(var, fn, (var,) + tuple(args), kwargs, group)
    C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\distribute\distribute_lib.py:3437 _update_non_slot
        result = fn(*args, **kwargs)
    C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\keras\optimizer_v2\optimizer_v2.py:661 apply_grad_to_update_var  **
        return var.assign(var.constraint(var))
    C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\ops\init_ops_v2.py:290 __call__
        return constant_op.constant(self.value, dtype=dtype, shape=shape)
    C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\framework\constant_op.py:264 constant
        return _constant_impl(value, dtype, shape, name, verify_shape=False,
    C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\framework\constant_op.py:281 _constant_impl
        tensor_util.make_tensor_proto(
    C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\framework\tensor_util.py:454 make_tensor_proto
        if shape is not None and np.prod(shape, dtype=np.int64) == 0:
    <__array_function__ internals>:5 prod
        
    C:\ProgramData\Anaconda3\lib\site-packages\numpy\core\fromnumeric.py:2961 prod
        return _wrapreduction(a, np.multiply, 'prod', axis, dtype, out,
    C:\ProgramData\Anaconda3\lib\site-packages\numpy\core\fromnumeric.py:90 _wrapreduction
        return ufunc.reduce(obj, axis, dtype, out, **passkwargs)
    C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\ops\resource_variable_ops.py:483 __array__
        return np.asarray(self.numpy())
    C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\ops\resource_variable_ops.py:619 numpy
        raise NotImplementedError(
    NotImplementedError: numpy() is only available when eager execution is enabled.
4

1 回答 1

-1

这个笔记本应该有助于升级、检查和启用。祝你好运!

于 2021-04-07T16:25:05.663 回答