我正在尝试按照教程:text实现一个具有正常密集层和RBF层的自定义网络。密集层充当编码器,而 RBF 对编码输入进行聚类。我确实解决了这个问题,并且该模型运行完美。 这是自定义 RBF 层的代码:
from tensorflow.keras.layers import Layer
from tensorflow.keras import backend as K
import tensorflow as tf
class RBFLayer(Layer):
def __init__(self, units, gamma, **kwargs):
super(RBFLayer , self).__init__(**kwargs)
self.units = units
self.gamma = K.cast_to_floatx(gamma)
def build(self, input_shape):
# print(input_shape)
# print(self.units)
self.mu = self.add_weight(name='mu',
shape=(int(input_shape[1]), self.units),
initializer='uniform',
trainable=True)
super(RBFLayer, self).build(input_shape)
def call(self, inputs):
diff = K.expand_dims(inputs) - self.mu
l2 = K.sum(K.pow(diff, 2), axis=1)
res = K.exp(-1 * self.gamma * l2)
return res
def compute_output_shape(self, input_shape):
return (input_shape[0], self.units)```
这里是keras实现的代码:
from modules_files.Feature_Selection_module import \*
import keras
import tensorflow as tf
from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras import Sequential, Model
from tensorflow.keras import regularizers
from tensorflow.keras.callbacks import Callback, EarlyStopping
from RBFLayer import RBFLayer
import os
def get_neural_network_model2(\*\*kwargs):
X_train = kwargs\['X_train'\]
y_train = kwargs\['y_train'\]
epochs = kwargs\['epochs'\]
verbose = kwargs\['verbose'\]
SEED = kwargs\['SEED'\]
\# epochs = 30
input_size = X_train.shape\[1\]
output_size = y_train.shape\[1\]
keras.utils.set_random_seed(SEED)
tf.config.experimental.enable_op_determinism()
model = Sequential()
model.add(Dense(input_size,
activation='relu',
kernel_regularizer = regularizers.L1L2(l1=1e-5, l2=1e-4),
bias_regularizer = regularizers.L2(1e-4),
activity_regularizer = regularizers.L2(1e-5))
)
model.add(RBFLayer(output_size, 0.5))
print(" Compile the model")
model.compile(optimizer='adam', loss='mean_squared_error', metrics=['accuracy'])
print(" Train the model")
model.fit(X_train, y_train, epochs=epochs, verbose=verbose, batch_size=1000)
return model
接下来,我对使用以下行
tf.keras.utils.plot_model(model, "model.png", show_shapes=True)
绘制模型(为了检查正确性)感到好奇,Pycharm 告诉我更新/安装 pydot。所以我使用 pycharm 的自动功能来做到这一点,并且我还为此使用了 tensorflow 和 keras。现在一切都不起作用了。
修复了一些虚拟环境 pakeges 设置后,我能够通过将张量流降级到 2.16.1 版本来恢复训练过程(我实际上不记得代码运行时之前使用的张量流版本)。
因此,我可以非常准确地训练模型,但如果我尝试使用以下命令隔离编码器部分:
encoded_model = Model(inputs=NN_model.input, outputs=NN_model.layers[0].output)
但是我得到这个值错误:
Traceback (most recent call last):
File "/Applications/PyCharm.app/Contents/plugins/python/helpers/pydev/pydevconsole.py", line 364, in runcode
coro = func()
File "\<input\>", line 1, in \<module\>
File "/Users/marinopavone/PycharmProjects/RBF_layer_PORCO_DIO/modules_files/Classifiier_function.py", line 186, in get_encoder_model
encoded_model = Model(inputs=NN_model.input, outputs=NN_model.layers\[0\].output)
File "/Users/marinopavone/PycharmProjects/Degradation_Simulator/.venv/lib/python3.9/site-packages/keras/src/ops/operation.py", line 228, in input
return self.\_get_node_attribute_at_index(0, "input_tensors", "input")
File "/Users/marinopavone/PycharmProjects/Degradation_Simulator/.venv/lib/python3.9/site-packages/keras/src/ops/operation.py", line 259, in \_get_node_attribute_at_index
raise ValueError(
ValueError: The layer sequential has never been called and thus has no defined input.
请问有人能看到这个问题吗?
最好的
PS我想指出的是,代码实际上是有效的,所以现在应该是一些兼容性问题
这里是当前设置:我在带有 M3 芯片的 macosx sonoma 14.3 上使用 PyCharm 2023.3.4(专业版)和 Tensorflow 2.16.1。
我尝试卸载并重新安装机器人张量流和keras(独立),并且我尝试使用函数模型的不同路径:
from tensorflow.keras import Sequential, Model
from tensorflow.keras,model import Sequential, Model
from keras import Sequential, Model
我经常重新启动 pycharm 和计算机本身,但错误仍然存在
我在 2023 年工作的代码中遇到了类似的错误,但在 2024 年不再工作。通过替换以下内容解决了问题: 编码模型 = 模型(输入=NN_model.输入,输出=NN_model.layers[0].输出) 经过 编码模型 = 模型(输入=NN_model.layers[0].输入,输出=NN_model.layers[0].输出) 或通过 编码模型 = 模型(输入=NN_model.输入,输出=NN_model.layers[0].输出) 我希望这有助于解决您的问题。