ValueError:维度必须相等,但在 time2vec 示例中为 2 和 1 为 LSTM 和 T2V 创建生成器定义模型结构FIT T2V + LSTM

如何解决ValueError:维度必须相等,但在 time2vec 示例中为 2 和 1 为 LSTM 和 T2V 创建生成器定义模型结构FIT T2V + LSTM

我有 2 个输入和 4 个输出。我想使用 time2vec 来预测输出。我使用了 https://towardsdatascience.com/time2vec-for-time-series-features-encoding-a03a4f3f937e 中的代码,它适用于一个输入和一个输出。但是当我想使用 for(2 个输入和 4 个输出)时,它给了我以下错误:

import numpy as np
import tensorflow as tf
from keras.layers import Dense,Dropout,Activation,Flatten,LSTM,Embedding,Input,concatenate,Lambda
from sklearn.preprocessing import MinMaxScaler
from keras.callbacks import EarlyStopping
import keras
import random
import os
from sklearn.metrics import mean_absolute_error
from tensorflow.keras.layers import *
from tensorflow.keras.models import *
from tensorflow.keras.callbacks import * 
from tensorflow.keras.optimizers import *
from tensorflow.keras import backend as K
from kerashypetune import KerasGridSearch
import matplotlib.pyplot as plt
w               = 5
ts              = 10              
nt              = 10           
ntest           = nt + int(percent*nt) 
X_train = np.random.rand(90,5,2)
X_test = np.random.rand(5,2)
y_train = np.random.rand(90,4)
y_test = np.random.rand(5,4)

""" ### 定义 T2V 层 ###

class T2V(Layer):
    def __init__(self,output_dim=None,**kwargs):
        self.output_dim = output_dim
        super(T2V,self).__init__(**kwargs)
    
    def build(self,input_shape):
        self.W = self.add_weight(name='W',shape=(1,self.output_dim),initializer='uniform',trainable=True)
        self.P = self.add_weight(name='P',trainable=True)
        self.w = self.add_weight(name='w',1),trainable=True)
        self.p = self.add_weight(name='p',trainable=True)
        super(T2V,self).build(input_shape)
    
    def call(self,x):
        original = self.w * x + self.p
        sin_trans = K.sin(K.dot(x,self.W) + self.P)
        return K.concatenate([sin_trans,original],-1)

为 LSTM 和 T2V 创建生成器

sequence_length = w
def gen_sequence(id_df,seq_length,seq_cols):
    data_matrix  = id_df[seq_cols].values
    num_elements = data_matrix.shape[0]
for start,stop in zip(range(0,num_elements-seq_length),range(seq_length,num_elements)):
    yield data_matrix[start:stop,:]

def gen_labels(id_df,label):
    data_matrix  = id_df[label].values
    num_elements = data_matrix.shape[0]
    return data_matrix[seq_length:num_elements,:]

定义模型结构

def set_seed_TF2(seed):
    tf.random.set_seed(seed)
    os.environ['PYTHONHASHSEED'] = str(seed)
    np.random.seed(seed)
    random.seed(seed)

def T2V_NN(param,dim):
    inp = Input(shape=(dim,2))
    x = T2V(param['t2v_dim'])(inp)
    x = LSTM(param['unit'],activation=param['act'])(x)
    x = Dense(2)(x)
    m = Model(inp,x)
    m.compile(loss='mse',optimizer=Adam(lr=param['lr']))
    return m

def NN(param,2))
    x = LSTM(param['unit'],activation=param['act'])(inp)
    x = Dense(2)(x)
    m = Model(inp,optimizer=Adam(lr=param['lr']))
    return m

参数网格

param_grid = {'unit': [64,32],'t2v_dim': [128,64],'lr': [1e-2,1e-3],'act': ['elu','relu'],'epochs': 1,'batch_size': [512,1024]}

FIT T2V + LSTM

es = EarlyStopping(patience=5,verbose=0,min_delta=0.001,monitor='val_loss',mode='auto',restore_best_weights=True)

hypermodel = lambda x: T2V_NN(param=x,dim=sequence_length)

kgs_t2v = KerasGridSearch(hypermodel,param_grid,greater_is_better=False,tuner_verbose=1)
kgs_t2v.set_seed(set_seed_TF2,seed=33)
kgs_t2v.search(X_train,y_train,validation_split=0.2,callbacks=[es],shuffle=False)

但是当我运行模型时,出现了这个错误:

ValueError: Dimensions must be equal,but are 2 and 1 for '{{node t2v_2/MatMul}} = MatMul[T=DT_FLOAT,transpose_a=false,transpose_b=false](t2v_2/Reshape,t2v_2/Reshape_1)' with input shapes: [?,2],[1,128].

你能帮我解决这个问题吗?

解决方法

您必须更改 T2V 层内部和网络内部的参数才能正确匹配形状

class T2V(Layer):
    
    def __init__(self,output_dim=None,**kwargs):
        self.output_dim = output_dim
        super(T2V,self).__init__(**kwargs)
    
    def build(self,input_shape):
        self.W = self.add_weight(name='W',shape=(input_shape[-1],self.output_dim),initializer='uniform',trainable=True)
        self.P = self.add_weight(name='P',shape=(input_shape[1],trainable=True)
        self.w = self.add_weight(name='w',1),trainable=True)
        self.p = self.add_weight(name='p',trainable=True)
        super(T2V,self).build(input_shape)
    
    def call(self,x):
        original = self.w * x + self.p
        sin_trans = K.sin(K.dot(x,self.W) + self.P)
        return K.concatenate([sin_trans,original],-1)

创建一个虚拟示例

n_sample = 90
timesteps = 5
feat_inp = 2
feat_out = 4

X = np.random.uniform(0,1,(n_sample,timesteps,feat_inp))
y = np.random.uniform(0,feat_out))

def T2V_NN():
    inp = Input(shape=(timesteps,feat_inp))
    x = T2V(32)(inp)
    x = LSTM(8)(x)
    x = Dense(feat_out)(x)
    m = Model(inp,x)
    m.compile(loss='mse',optimizer='adam')
    return m

model = T2V_NN()
model.fit(X,y,epochs=3)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-