首页 > 解决方案 > 对于自定义正则化参数的值(tensorflow2.3.x keras)

问题描述

我在 tensorflow 2.3.x 中做简单的机器学习。我想在这里创建和实现自定义正则化。我想通过计算一维权重值和我自己创建的矩阵来创建损失。但是,即使我使用参数 x 创建一个权重为 1D 的矩阵,它似乎也不包含任何值。这自然会导致值错误。如果我想用自定义正则化中的权重值进行计算怎么办?这是导致错误的代码。return 语句稍后将被重写。

#import datasets 
from tensorflow.keras.datasets import cifar10
(X_train, Y_train), (X_test, Y_test) = cifar10.load_data()
 
from tensorflow.keras.utils import to_categorical
 
X_train = X_train/255.
X_test = X_test/255.
 
Y_train = to_categorical(Y_train, 10)
Y_test = to_categorical(Y_test, 10)
 
import tensorflow.keras
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D
from tensorflow.keras.layers import Dense, Dropout, Activation, Flatten
import numpy as np
import tensorflow as tf
import random
import os
from tensorflow.keras import regularizers

def set_seed(seed=200):
    tf.random.set_seed(seed)

    # optional
    # for numpy.random
    np.random.seed(seed)
    # for built-in random
    random.seed(seed)
    # for hash seed
    os.environ["PYTHONHASHSEED"] = str(seed)

set_seed(0)

from tensorflow.python.ops import math_ops
from tensorflow.python.keras import backend
import math

class Costom(regularizers.Regularizer):
    def __init__(self, costom):
        self.costom = costom
        
    
    def __call__(self, x):
        w = tf.reduce_mean(tf.reduce_mean(tf.reduce_mean(x,0),0),0)
        print(x.shape[3])
        SK = [[0] * 256 for i in range(x.shape[3])]
        i = 0
        while i < x.shape[3]:
            SK[i][i] = 1
            i += 1

        tf.constant(SK)

        #tf.matmul(w ,SK)
        
        return self.costom * tf.reduce_sum(x)

    def get_config(self):
        return {'costom': float(self.costom)}

model = Sequential([
    Conv2D(32, (3, 3), padding='same',  activation='relu', input_shape=X_train.shape[1:],kernel_regularizer=Costom(0.01)),
    Conv2D(32, (3, 3), padding='same', activation='relu'),
    MaxPooling2D(2, 2),
    Dropout(0.25),
    
    Conv2D(64, (3, 3), padding='same', activation='relu'),
    Conv2D(64, (3, 3), activation='relu'),
    MaxPooling2D(2, 2),
    Dropout(0.25),

    Flatten(),
    Dense(512, activation='relu'),
    Dropout(0.5),
    Dense(10, activation='softmax'),
])

model.compile(loss='categorical_crossentropy',optimizer='SGD',metrics=['accuracy'])
 
history = model.fit(X_train, Y_train, epochs=1)
 
model.save('./CIFAR-10_reg.h5')
 
print(model.evaluate(X_test, Y_test))
 

以下是错误消息输出。

Traceback (most recent call last):
  File "train.py", line 112, in <module>
    history = model.fit(X_train, Y_train, epochs=1)
  File "C:\Users\81805\anaconda3\envs\tf23\lib\site-packages\tensorflow\python\keras\engine\training.py", line 108, in _method_wrapper
    return method(self, *args, **kwargs)
  File "C:\Users\81805\anaconda3\envs\tf23\lib\site-packages\tensorflow\python\keras\engine\training.py", line 1098, in fit
    tmp_logs = train_function(iterator)
  File "C:\Users\81805\anaconda3\envs\tf23\lib\site-packages\tensorflow\python\eager\def_function.py", line 780, in __call__
    result = self._call(*args, **kwds)
  File "C:\Users\81805\anaconda3\envs\tf23\lib\site-packages\tensorflow\python\eager\def_function.py", line 823, in _call
    self._initialize(args, kwds, add_initializers_to=initializers)
  File "C:\Users\81805\anaconda3\envs\tf23\lib\site-packages\tensorflow\python\eager\def_function.py", line 696, in _initialize
    self._stateful_fn._get_concrete_function_internal_garbage_collected(  # pylint: disable=protected-access
  File "C:\Users\81805\anaconda3\envs\tf23\lib\site-packages\tensorflow\python\eager\function.py", line 2855, in _get_concrete_function_internal_garbage_collected
    graph_function, _, _ = self._maybe_define_function(args, kwargs)
  File "C:\Users\81805\anaconda3\envs\tf23\lib\site-packages\tensorflow\python\eager\function.py", line 3213, in _maybe_define_function
    graph_function = self._create_graph_function(args, kwargs)
  File "C:\Users\81805\anaconda3\envs\tf23\lib\site-packages\tensorflow\python\eager\function.py", line 3065, in _create_graph_function
    func_graph_module.func_graph_from_py_func(
  File "C:\Users\81805\anaconda3\envs\tf23\lib\site-packages\tensorflow\python\framework\func_graph.py", line 986, in func_graph_from_py_func
    func_outputs = python_func(*func_args, **func_kwargs)
  File "C:\Users\81805\anaconda3\envs\tf23\lib\site-packages\tensorflow\python\eager\def_function.py", line 600, in wrapped_fn
    return weak_wrapped_fn().__wrapped__(*args, **kwds)
  File "C:\Users\81805\anaconda3\envs\tf23\lib\site-packages\tensorflow\python\framework\func_graph.py", line 973, in wrapper
    raise e.ag_error_metadata.to_exception(e)
ValueError: in user code:

    C:\Users\81805\anaconda3\envs\tf23\lib\site-packages\tensorflow\python\keras\engine\training.py:806 train_function  *
        return step_function(self, iterator)
    C:\Users\81805\anaconda3\envs\tf23\lib\site-packages\tensorflow\python\keras\engine\training.py:796 step_function  **
        outputs = model.distribute_strategy.run(run_step, args=(data,))
    C:\Users\81805\anaconda3\envs\tf23\lib\site-packages\tensorflow\python\distribute\distribute_lib.py:1211 run
        return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)
    C:\Users\81805\anaconda3\envs\tf23\lib\site-packages\tensorflow\python\distribute\distribute_lib.py:2585 call_for_each_replica
        return self._call_for_each_replica(fn, args, kwargs)
    C:\Users\81805\anaconda3\envs\tf23\lib\site-packages\tensorflow\python\distribute\distribute_lib.py:2945 _call_for_each_replica
        return fn(*args, **kwargs)
    C:\Users\81805\anaconda3\envs\tf23\lib\site-packages\tensorflow\python\keras\engine\training.py:789 run_step  **
        outputs = model.train_step(data)
    C:\Users\81805\anaconda3\envs\tf23\lib\site-packages\tensorflow\python\keras\engine\training.py:749 train_step
        y, y_pred, sample_weight, regularization_losses=self.losses)
    C:\Users\81805\anaconda3\envs\tf23\lib\site-packages\tensorflow\python\keras\engine\base_layer.py:1433 losses
        loss_tensor = regularizer()
    C:\Users\81805\anaconda3\envs\tf23\lib\site-packages\tensorflow\python\keras\engine\base_layer.py:1509 _tag_callable
        loss = loss()
    C:\Users\81805\anaconda3\envs\tf23\lib\site-packages\tensorflow\python\keras\engine\base_layer.py:2433 _loss_for_variable
        regularization = regularizer(v)
    train.py:61 __call__
        tf.matmul(w ,SK)
    C:\Users\81805\anaconda3\envs\tf23\lib\site-packages\tensorflow\python\util\dispatch.py:201 wrapper
        return target(*args, **kwargs)
    C:\Users\81805\anaconda3\envs\tf23\lib\site-packages\tensorflow\python\ops\math_ops.py:3253 matmul
        return gen_math_ops.mat_mul(
    C:\Users\81805\anaconda3\envs\tf23\lib\site-packages\tensorflow\python\ops\gen_math_ops.py:5640 mat_mul
        _, _, _op, _outputs = _op_def_library._apply_op_helper(
    C:\Users\81805\anaconda3\envs\tf23\lib\site-packages\tensorflow\python\framework\op_def_library.py:742 _apply_op_helper
        op = g._create_op_internal(op_type_name, inputs, dtypes=None,
    C:\Users\81805\anaconda3\envs\tf23\lib\site-packages\tensorflow\python\framework\func_graph.py:591 _create_op_internal
        return super(FuncGraph, self)._create_op_internal(  # pylint: disable=protected-access
    C:\Users\81805\anaconda3\envs\tf23\lib\site-packages\tensorflow\python\framework\ops.py:3477 _create_op_internal
        ret = Operation(
    C:\Users\81805\anaconda3\envs\tf23\lib\site-packages\tensorflow\python\framework\ops.py:1974 __init__
        self._c_op = _create_c_op(self._graph, node_def, inputs,
    C:\Users\81805\anaconda3\envs\tf23\lib\site-packages\tensorflow\python\framework\ops.py:1815 _create_c_op
        raise ValueError(str(e))

    ValueError: Shape must be rank 2 but is rank 1 for '{{node conv2d/kernel/Regularizer/MatMul}} = MatMul[T=DT_FLOAT, transpose_a=false, transpose_b=false](conv2d/kernel/Regularizer/Mean_2, conv2d/kernel/Regularizer/MatMul/b)' with input shapes: [32], [32,256].

标签: pythontensorflow

解决方案


推荐阅读