[英]initialize weight matrix tensorflow custom model
我是神经网络世界的新手,我正在尝试研究它们,我应该在使用自定义 RNN 单元的 tensorflow 上创建一个自定义 model。 该数据集由来自脑电图传感器的 14 个时间序列和表示眼睛是否睁开的 0 或 1 向量组成。 X_train_scaled 是一个 11984 行和 14 列的矩阵,一个用于时间序列,其值介于 0 和 1 之间,而 Y_train 是一个 0 和 1 的向量。我在将“MyCell”class 中的权重矩阵初始化为 self.add_weight 方法时遇到问题返回错误
TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'
我不知道如何继续,因为 MyCell class 中的构建方法中的 input_shape 参数始终为无。 有人有什么建议吗?
代码片段
import tensorflow as tf
from tensorflow import keras
class MyCell(keras.layers.Layer):
def __init__(self, units,**kwargs):
self.units = units
self.state_size = units
super().__init__(**kwargs)
def build(self, input_shape):
# build the input weight matrix
self.kernel = self.add_weight(name="kernel", shape=[input_shape[-1], self.units],
initializer="glorot_normal")
#### rest of the layer ###
self.built = True
def call(self, inputs, states):
# computes the output of the cell
prev = states[0]
input = tf.sparse.sparse_dense_matmul(inputs, self.kernel)
state = tf.sparse.sparse_dense_matmul(prev, self.recurrent_kernel)
output = prev + tf.nn.tanh(input + self.bias + state)
return output, [output]
class DeepLayer(keras.layers.Layer):
def __init__(self, units=100, layers=1, return_sequences=False, **kwargs):
super().__init__(**kwargs)
self.layers = layers
self.units = units
self.nodes_list = [
keras.layers.RNN(MyCell(units=units),return_sequences=True, return_state=True
)]
self.return_sequences = return_sequences
def call(self, inputs):
# compute the output of the deep layer
X = inputs
states = [] # all the states in all the layers
states_last = [] #states in all the layers for the last time step
layer_states = None
for i in range(len(self.nodes_list)):
layer = self.nodes_list[i]
if i > 0:
X = layer_states
[layer_states, layer_states_last] = layer(X)
states.append(layer_states)
states_last.append(layer_states_last)
if self.return_sequences:
return states[-1]
else:
return states_last[-1]
class DeepClassifier(keras.Model):
def __init__(self, num_classes, units=100, layers=5,return_sequences=False, **kwargs):
super().__init__(**kwargs)
self.num_classes = num_classes
self.masking = tf.keras.layers.Masking()
self.hidden = DeepLayer(units=units, layers=layers, return_sequences=return_sequences)
if (num_classes > 2):
self.output_ = tf.keras.layers.Dense(num_classes, activation='softmax')
else:
self.output_ = tf.keras.layers.Dense(1,activation='sigmoid')
def call(self, inputs):
m = self.masking(inputs)
h = self.hidden(m)
y = self.output_(h)
return y
我称 model 为
"""
print(X_train_scaled.shape)
(11984, 14)
print(Y_train.shape)
(11984,)
"""
model = DeepClassifier(num_classes=2, units = 100, layers = 5,return_sequences = False)
model.compile(loss="mse", optimizer="adam")
history = model.fit(X_train_scaled, Y_train, epochs=20,validation_split=0.2)
我是神经网络世界的新手,我正在尝试研究它们,我应该在使用自定义 RNN 单元的 tensorflow 上创建一个自定义 model。 该数据集由来自脑电图传感器的 14 个时间序列和表示眼睛是否睁开的 0 或 1 向量组成。 X_train_scaled 是一个 11984 行和 14 列的矩阵,一个用于时间序列,其值介于 0 和 1 之间,而 Y_train 是一个 0 和 1 的向量。我在将“MyCell”class 中的权重矩阵初始化为 self.add_weight 方法时遇到问题返回错误
TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'
我不知道如何继续,因为 MyCell class 中的构建方法中的 input_shape 参数始终为无。 有人有什么建议吗?
代码片段
import tensorflow as tf
from tensorflow import keras
class MyCell(keras.layers.Layer):
def __init__(self, units,**kwargs):
self.units = units
self.state_size = units
super().__init__(**kwargs)
def build(self, input_shape):
# build the input weight matrix
self.kernel = self.add_weight(name="kernel", shape=[input_shape[-1], self.units],
initializer="glorot_normal")
#### rest of the layer ###
self.built = True
def call(self, inputs, states):
# computes the output of the cell
prev = states[0]
input = tf.sparse.sparse_dense_matmul(inputs, self.kernel)
state = tf.sparse.sparse_dense_matmul(prev, self.recurrent_kernel)
output = prev + tf.nn.tanh(input + self.bias + state)
return output, [output]
class DeepLayer(keras.layers.Layer):
def __init__(self, units=100, layers=1, return_sequences=False, **kwargs):
super().__init__(**kwargs)
self.layers = layers
self.units = units
self.nodes_list = [
keras.layers.RNN(MyCell(units=units),return_sequences=True, return_state=True
)]
self.return_sequences = return_sequences
def call(self, inputs):
# compute the output of the deep layer
X = inputs
states = [] # all the states in all the layers
states_last = [] #states in all the layers for the last time step
layer_states = None
for i in range(len(self.nodes_list)):
layer = self.nodes_list[i]
if i > 0:
X = layer_states
[layer_states, layer_states_last] = layer(X)
states.append(layer_states)
states_last.append(layer_states_last)
if self.return_sequences:
return states[-1]
else:
return states_last[-1]
class DeepClassifier(keras.Model):
def __init__(self, num_classes, units=100, layers=5,return_sequences=False, **kwargs):
super().__init__(**kwargs)
self.num_classes = num_classes
self.masking = tf.keras.layers.Masking()
self.hidden = DeepLayer(units=units, layers=layers, return_sequences=return_sequences)
if (num_classes > 2):
self.output_ = tf.keras.layers.Dense(num_classes, activation='softmax')
else:
self.output_ = tf.keras.layers.Dense(1,activation='sigmoid')
def call(self, inputs):
m = self.masking(inputs)
h = self.hidden(m)
y = self.output_(h)
return y
我称 model 为
"""
print(X_train_scaled.shape)
(11984, 14)
print(Y_train.shape)
(11984,)
"""
model = DeepClassifier(num_classes=2, units = 100, layers = 5,return_sequences = False)
model.compile(loss="mse", optimizer="adam")
history = model.fit(X_train_scaled, Y_train, epochs=20,validation_split=0.2)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.