首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Keras: ValueError TimeDistributed()

Keras: ValueError TimeDistributed()
EN

Stack Overflow用户
提问于 2022-11-18 11:59:25
回答 1查看 31关注 0票数 0

我正在修改用于时间序列分类的Keras教程。

代码语言:javascript
复制
def make_model(input_shape):
    input_layer = keras.layers.Input(input_shape)

    conv1 = keras.layers.Conv1D(filters=256, kernel_size=5, padding="same")(input_layer)
    conv1 = keras.layers.BatchNormalization()(conv1)
    conv1 = keras.layers.ReLU()(conv1)
    conv1 = keras.layers.TimeDistributed(conv1)(input_layer)

    conv2 = keras.layers.Conv1D(filters=128, kernel_size=5, padding="same")(conv1)
    conv2 = keras.layers.BatchNormalization()(conv2)
    conv2 = keras.layers.ReLU()(conv2)
    conv2 = keras.layers.TimeDistributed(conv2)(conv2)

    conv3 = keras.layers.Conv1D(filters=64, kernel_size=3, padding="same")(conv2)
    conv3 = keras.layers.BatchNormalization()(conv3)
    conv3 = keras.layers.ReLU()(conv3)
    conv3 = keras.layers.TimeDistributed(conv3)(conv3)

    conv4 = keras.layers.Conv1D(filters=32, kernel_size=3, padding="same")(conv3)
    conv4 = keras.layers.BatchNormalization()(conv4)
    conv4 = keras.layers.ReLU()(conv4)
    conv4 = keras.layers.TimeDistributed(conv4)(conv4)
    conv4 = keras.layers.Dropout(0.5)(conv4)

    pool = keras.layers.MaxPool1D(pool_size=2)(conv4)
    pool = keras.layers.TimeDistributed()(pool)

    flat = keras.layers.Flatten()(pool)
    flat = keras.layers.TimeDistributed(flat)(flat)

    lstm = keras.layers.LSTM(100)(flat)
    lstm = keras.layers.Dropout(0.5)(lstm)

    gap = keras.layers.Dense(100, activation='relu')

    output_layer = keras.layers.Dense(num_classes, activation="softmax")(gap)

    return keras.models.Model(inputs=input_layer, outputs=output_layer)


model = make_model(input_shape=x_train.shape[1:])
keras.utils.plot_model(model, show_shapes=True)

并得到以下错误:

ValueError:请使用tf.keras.layers.Layer实例初始化TimeDistributed层。接收:KerasTensor(type_spec=TensorSpec(无,17808,256个),dtype=tf.float32,name=None),名称=‘Relu_7/Relu:0’,description=“由层‘re_lu_7’创建‘)

我见过一些代码,人们使用Sequential()和add()方法。但是现在,我只是在挣扎于代码的这一部分,我想了解如何使TimeDistributed工作。

编辑

我有一个带有形状的数据集:( 4093,17808,1) --基本上每一行一个样本,包含4093行和17808个时间观察。现在我使用了input_shape = (17808,1)。有了下面的代码建议,我有点迷失了,到底应该是什么重塑维度。显然不是(32,32,32)

EN

回答 1

Stack Overflow用户

发布于 2022-11-18 13:01:49

重要的是,您需要输入任何形状来创建一个矩阵,这是创建时间分布的一种更快的方法。在编码中有几个要点,你可以从你的问题示例代码中找到,但原因是一个域分布来正确地比较或缩放它们。

时间是您在处理序列时可以依赖的一个通道,并且您没有任何域可关联,而是当您处理多个域时,例如输入层的输入或剩余网络。

样本:目标域轴上的时间分布。

代码语言:javascript
复制
import os
from os.path import exists

import tensorflow as tf

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""
: Variables
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.cifar10.load_data()
num_classes = 10

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""
: Class / Definition
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""
def make_model(input_shape):
    input_layer = tf.keras.layers.Input(input_shape)

    conv1 = tf.keras.layers.Conv1D(filters=256, kernel_size=5, padding="same")(input_layer)
    conv1 = tf.keras.layers.BatchNormalization()(conv1)
    conv1 = tf.keras.layers.TimeDistributed( tf.keras.layers.ReLU() )( conv1 )

    conv2 = tf.keras.layers.Conv1D(filters=128, kernel_size=5, padding="same")(conv1)
    conv2 = tf.keras.layers.BatchNormalization()(conv2)
    conv2 = tf.keras.layers.TimeDistributed( tf.keras.layers.ReLU() )( conv2 )

    conv3 = tf.keras.layers.Conv1D(filters=64, kernel_size=3, padding="same")(conv2)
    conv3 = tf.keras.layers.BatchNormalization()(conv3)
    conv3 = tf.keras.layers.TimeDistributed( tf.keras.layers.ReLU() )( conv3 )

    conv4 = tf.keras.layers.Conv1D(filters=32, kernel_size=3, padding="same")(conv3)
    conv4 = tf.keras.layers.BatchNormalization()(conv4)
    conv4 = tf.keras.layers.TimeDistributed( tf.keras.layers.ReLU() )( conv4 )
    conv4 = tf.keras.layers.Dropout(0.5)(conv4)

    pool = tf.keras.layers.Reshape((32, 32, 32))(conv4)
    pool = tf.keras.layers.TimeDistributed( tf.keras.layers.MaxPool1D(pool_size=2) )( pool )

    flat = tf.keras.layers.Flatten()(pool)
    flat = tf.keras.layers.Reshape((128, 128))(flat)

    lstm = tf.keras.layers.LSTM(100)(flat)
    lstm = tf.keras.layers.Dropout(0.5)(lstm)

    gap = tf.keras.layers.Dense(100, activation='relu')(lstm)

    output_layer = tf.keras.layers.Dense(num_classes, activation="softmax")(gap)

    return tf.keras.models.Model(inputs=input_layer, outputs=output_layer)

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""
: Model Initialize
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""
model = make_model(input_shape=(32, 32, 3))
tf.keras.utils.plot_model(model, show_shapes=True)

输出:打印模型摘要,与目标模型进行验证,比较它们的层次和介质。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74489347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档