python - 对于自定义正则化参数的值(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].
解决方案
推荐阅读
- php - 使用数组的 PHP 递归
- java - Flutter 说它“无法解决项目”
- angular - 同一页面上的多个 Angular 数据表错误显示分页控件
- java - @ApiResponse 响应体为空(Spring Boot)
- r - 对 0 和 1 的 p 值执行 qnorm()
- elasticsearch - 包含算术的内联脚本的观察条件失败
- windows - Electron 应用程序 - 如何在全屏模式下禁用/隐藏任务栏中的窗口
- javascript - Angular 8 click 用作 javascript onload 函数
- python-3.x - Python:如何比较两个二维列表,处理其值并将其存储在一个新列表中?
- logging - SLF4J 中的自定义级别日志记录