Keras多实例分类问题

时间:2019-05-23 15:26:39

标签: python tensorflow machine-learning keras classification

我正在尝试对一维信号的数据集执行二进制分类任务。这是训练批次x和实地真实批次y的输入形状。换句话说,对于每个批次,我有16个信号,具有38400个时间步长,每个时间步长有1个特征。每个信号被分类为150次一类(多实例学习问题)。

  

x形状(16,38400,1)

     

y形(16、150、1)

这是我到目前为止正在使用的网络:

model = Sequential()
model.add(LSTM(2, return_sequences=True, input_shape=params['input_shape'], dropout=0.5))
model.add(TimeDistributed(Dense(params["num_categories"])))
model.add(Activation('softmax' if params['num_categories'] != 1 else 'sigmoid'))

from keras.optimizers import Adam
optimizer = Adam(lr=params['learning_rate'], clipnorm=params.get("clipnorm", 1))
model.compile(loss='binary_crossentropy', optimizer=optimizer, metrics=['accuracy'])

return model

请注意,params['input_shape']等于[:, :, None]。这是运行代码时网络层的输出形状:

Tensor("lstm_1/transpose_1:0", shape=(?, ?, 2), dtype=float32) : (1, 38400, 2)
Tensor("time_distributed_1/Reshape_1:0", shape=(?, ?, 1), dtype=float32) : (1, 38400, 1)
Tensor("activation_1/Sigmoid:0", shape=(?, ?, 1), dtype=float32) : (1, 38400, 1)

问题是我们遇到此错误:

tensorflow.python.framework.errors_impl.InvalidArgumentError: Incompatible shapes: [4,150,1] vs. [4,38400,1]
     [[{{node metrics/acc/Equal}} = Equal[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:GPU:0"](_arg_activation_1_target_0_1/_65, metrics/acc/Round)]]
     [[{{node metrics/auroc/auc/assert_greater_equal/Assert/AssertGuard/Assert/Switch_2/_93}} = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device="/job:localhost/replica:0/task:0/device:GPU:0", send_device_incarnation=1, tensor_name="edge_1152_...t/Switch_2", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"]()]]

我知道此错误与y有关,该错误的网络输出形状不同。但是,我不确定应该将哪种层添加到网络中以获得所需的形状。你能帮忙吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

您可以在网络中添加一个完全连接的层。如果网络的输出为B大小,并且您希望其为A大小,则可以定义一个完全连接的层,以接收B大小的输入并产生A大小的输出。请参阅tf.keras.layers的文档。密集:https://www.tensorflow.org/api_docs/python/tf/keras/layers/Dense