use burn::module::Module;
use burn::nn::conv::{Conv1d, Conv1dConfig};
use burn::nn::PaddingConfig1d;
use burn::tensor::{activation, backend::Backend, Tensor};
use crate::minute::lstm::step_2_lstm_cell::LSTM;
#[derive(Module, Debug)]
pub struct CNNLSTM<B: Backend> {
conv1: Conv1d<B>,
lstm: LSTM<B>,
input_size: usize,
hidden_size: usize,
num_layers: usize,
bidirectional: bool,
cnn_output_size: usize,
}
impl<B: Backend> CNNLSTM<B> {
pub fn new(
input_size: usize,
hidden_size: usize,
num_layers: usize,
bidirectional: bool,
device: &B::Device,
) -> Self {
let conv1_config = Conv1dConfig::new(input_size, 16, 3) .with_padding(PaddingConfig1d::Same)
.with_stride(1);
let conv1 = conv1_config.init(device);
let cnn_output_size = 16;
let lstm = LSTM::new(cnn_output_size, hidden_size, num_layers, bidirectional, device);
Self {
conv1,
lstm,
input_size,
hidden_size,
num_layers,
bidirectional,
cnn_output_size,
}
}
pub fn forward(&self, x: Tensor<B, 3>) -> Tensor<B, 3> {
let x_permuted = x.permute([0, 2, 1]);
let conv1_out = self.conv1.forward(x_permuted);
let conv1_out = activation::relu(conv1_out);
let cnn_features = conv1_out.permute([0, 2, 1]);
let lstm_out = self.lstm.forward(cnn_features);
lstm_out
}
}