我正在修改用于时间序列分类的Keras教程。
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)
发布于 2022-11-18 13:01:49
重要的是,您需要输入任何形状来创建一个矩阵,这是创建时间分布的一种更快的方法。在编码中有几个要点,你可以从你的问题示例代码中找到,但原因是一个域分布来正确地比较或缩放它们。
时间是您在处理序列时可以依赖的一个通道,并且您没有任何域可关联,而是当您处理多个域时,例如输入层的输入或剩余网络。
样本:目标域轴上的时间分布。
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)输出:打印模型摘要,与目标模型进行验证,比较它们的层次和介质。

https://stackoverflow.com/questions/74489347
复制相似问题