繁体   English   中英

初始化权重矩阵 tensorflow 自定义 model

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM