Tensorflow 如何在Keras中创建multihot嵌入层?
我有顺序数据,其中每个元素是一个向量,如下所示:Tensorflow 如何在Keras中创建multihot嵌入层?,tensorflow,keras,lstm,keras-layer,Tensorflow,Keras,Lstm,Keras Layer,我有顺序数据,其中每个元素是一个向量,如下所示: x_i = [ 0. , 0. , 0. , 0.03666667, 0. , 0. , 0.95666667, 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0
x_i = [ 0. , 0. , 0. , 0.03666667, 0. ,
0. , 0.95666667, 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0.00666667, 0. ,
0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. ,
0. ]
inputs = Input(shape=(FLAGS.look_back, FLAGS.inputlength))
inputs_embedded = EmbeddingMatrix(N_EMBEDDING)(inputs)
encoded = LSTM(N_HIDDEN, dropout=0.2, recurrent_dropout=0.2)(inputs_embedded)
dense = TimeDistributed(Dense(N_DENSE, activation='sigmoid'))(dropout)
dense_output = TimeDistributed(Dense(FLAGS.inputlength, activation='softmax'))(dense)
embedder = Model(inputs, inputs_embedded)
model = Model(inputs, dense_output)
model.compile(loss='mean_squared_error', optimizer = RMSprop(lr=LEARNING_RATE, clipnorm=5))
向量表示用户在一组活动上花费的时间分布(例如,在5分钟的时间段内)。该任务是预测下一时间步t+1内的任务分布,给定前N个步骤(t-N:t)。因此,我的输入形状是:
X.shape=(批处理大小、时间步长、输入长度),例如(32、10、41),其中过去批处理大小为32、10个时间步长,每个元素的维数为41
要做到这一点,我使用的是使用Keras构建的LSTM。在将这个输入传递给LSTM之前,我想创建一个类似于嵌入层的东西,它将这个表示转换成一个密集的高维向量,类似于NLP中所做的,并使用嵌入层将一个热的单词向量嵌入到嵌入空间中。然而,Keras中的嵌入层只接受整数输入(或一个热表示),在我的例子中,我想要实现的是输入向量X(由几个X_I组成,因为它表示时间序列数据)和嵌入矩阵V之间的矩阵积。为了说明:
X.shape=(10,41)
嵌入矩阵形状=(41100)
其作用是通过矩阵乘法将X中的每个元素从其41维稀疏表示转换为100维,这应该针对批输入中的所有元素完成
为此,我做了以下工作
class EmbeddingMatrix(Layer):
def __init__(self, output_dim, **kwargs):
self.output_dim = output_dim
super(EmbeddingMatrix, self).__init__(**kwargs)
def build(self, input_shape):
# Create a trainable weight variable for this layer.
self.kernel = self.add_weight(name='kernel',
shape=(input_shape[2], self.output_dim),
initializer='uniform',
trainable=True)
super(EmbeddingMatrix, self).build(input_shape) # Be sure to call this somewhere!
def call(self, x, mask=None):
return K.dot(x, self.kernel)
def compute_output_shape(self, input_shape):
return (input_shape[0], input_shape[1], self.output_dim)
我使用的LSTM网络如下所示:
x_i = [ 0. , 0. , 0. , 0.03666667, 0. ,
0. , 0.95666667, 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0.00666667, 0. ,
0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. ,
0. ]
inputs = Input(shape=(FLAGS.look_back, FLAGS.inputlength))
inputs_embedded = EmbeddingMatrix(N_EMBEDDING)(inputs)
encoded = LSTM(N_HIDDEN, dropout=0.2, recurrent_dropout=0.2)(inputs_embedded)
dense = TimeDistributed(Dense(N_DENSE, activation='sigmoid'))(dropout)
dense_output = TimeDistributed(Dense(FLAGS.inputlength, activation='softmax'))(dense)
embedder = Model(inputs, inputs_embedded)
model = Model(inputs, dense_output)
model.compile(loss='mean_squared_error', optimizer = RMSprop(lr=LEARNING_RATE, clipnorm=5))
但是,在运行时,我会出现以下错误:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-24-5a28b4f3b6b9> in <module>()
5 inputs_embedded = EmbeddingMatrix(N_EMBEDDING)(inputs)
6
----> 7 encoded = LSTM(N_HIDDEN, dropout=0.2, recurrent_dropout=0.2)(inputs_embedded)
8
9 dense = TimeDistributed(Dense(N_DENSE, activation='sigmoid'))(dropout)
/Users/asturkmani/anaconda3/lib/python3.5/site-packages/keras/layers/recurrent.py in __call__(self, inputs, initial_state, **kwargs)
260 # modify the input spec to include the state.
261 if initial_state is None:
--> 262 return super(Recurrent, self).__call__(inputs, **kwargs)
263
264 if not isinstance(initial_state, (list, tuple)):
/Users/asturkmani/anaconda3/lib/python3.5/site-packages/keras/engine/topology.py in __call__(self, inputs, **kwargs)
567 '`layer.build(batch_input_shape)`')
568 if len(input_shapes) == 1:
--> 569 self.build(input_shapes[0])
570 else:
571 self.build(input_shapes)
/Users/asturkmani/anaconda3/lib/python3.5/site-packages/keras/layers/recurrent.py in build(self, input_shape)
1041 initializer=bias_initializer,
1042 regularizer=self.bias_regularizer,
-> 1043 constraint=self.bias_constraint)
1044 else:
1045 self.bias = None
/Users/asturkmani/anaconda3/lib/python3.5/site-packages/keras/legacy/interfaces.py in wrapper(*args, **kwargs)
85 warnings.warn('Update your `' + object_name +
86 '` call to the Keras 2 API: ' + signature, stacklevel=2)
---> 87 return func(*args, **kwargs)
88 wrapper._original_function = func
89 return wrapper
/Users/asturkmani/anaconda3/lib/python3.5/site-packages/keras/engine/topology.py in add_weight(self, name, shape, dtype, initializer, regularizer, trainable, constraint)
389 if dtype is None:
390 dtype = K.floatx()
--> 391 weight = K.variable(initializer(shape), dtype=dtype, name=name)
392 if regularizer is not None:
393 self.add_loss(regularizer(weight))
/Users/asturkmani/anaconda3/lib/python3.5/site-packages/keras/layers/recurrent.py in bias_initializer(shape, *args, **kwargs)
1033 self.bias_initializer((self.units,), *args, **kwargs),
1034 initializers.Ones()((self.units,), *args, **kwargs),
-> 1035 self.bias_initializer((self.units * 2,), *args, **kwargs),
1036 ])
1037 else:
/Users/asturkmani/anaconda3/lib/python3.5/site-packages/keras/backend/tensorflow_backend.py in concatenate(tensors, axis)
1721 return tf.sparse_concat(axis, tensors)
1722 else:
-> 1723 return tf.concat([to_dense(x) for x in tensors], axis)
1724
1725
/Users/asturkmani/anaconda3/lib/python3.5/site-packages/tensorflow/python/ops/array_ops.py in concat(concat_dim, values, name)
1073 ops.convert_to_tensor(concat_dim,
1074 name="concat_dim",
-> 1075 dtype=dtypes.int32).get_shape(
1076 ).assert_is_compatible_with(tensor_shape.scalar())
1077 return identity(values[0], name=scope)
/Users/asturkmani/anaconda3/lib/python3.5/site-packages/tensorflow/python/framework/ops.py in convert_to_tensor(value, dtype, name, as_ref, preferred_dtype)
667
668 if ret is None:
--> 669 ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref)
670
671 if ret is NotImplemented:
/Users/asturkmani/anaconda3/lib/python3.5/site-packages/tensorflow/python/framework/constant_op.py in _constant_tensor_conversion_function(v, dtype, name, as_ref)
174 as_ref=False):
175 _ = as_ref
--> 176 return constant(v, dtype=dtype, name=name)
177
178
/Users/asturkmani/anaconda3/lib/python3.5/site-packages/tensorflow/python/framework/constant_op.py in constant(value, dtype, shape, name, verify_shape)
163 tensor_value = attr_value_pb2.AttrValue()
164 tensor_value.tensor.CopyFrom(
--> 165 tensor_util.make_tensor_proto(value, dtype=dtype, shape=shape, verify_shape=verify_shape))
166 dtype_value = attr_value_pb2.AttrValue(type=tensor_value.tensor.dtype)
167 const_tensor = g.create_op(
/Users/asturkmani/anaconda3/lib/python3.5/site-packages/tensorflow/python/framework/tensor_util.py in make_tensor_proto(values, dtype, shape, verify_shape)
365 nparray = np.empty(shape, dtype=np_dt)
366 else:
--> 367 _AssertCompatible(values, dtype)
368 nparray = np.array(values, dtype=np_dt)
369 # check to them.
/Users/asturkmani/anaconda3/lib/python3.5/site-packages/tensorflow/python/framework/tensor_util.py in _AssertCompatible(values, dtype)
300 else:
301 raise TypeError("Expected %s, got %s of type '%s' instead." %
--> 302 (dtype.name, repr(mismatch), type(mismatch).__name__))
303
304
TypeError: Expected int32, got list containing Tensors of type '_Message' instead.
---------------------------------------------------------------------------
TypeError回溯(最近一次调用上次)
在()
5输入\u嵌入=嵌入矩阵(N\u嵌入)(输入)
6.
---->7编码=LSTM(N_隐藏,辍学=0.2,经常性_辍学=0.2)(嵌入输入)
8.
9稠密=时间分布(稠密(N_稠密,激活='sigmoid'))(辍学)
/用户/asturkmani/anaconda3/lib/python3.5/site-packages/keras/layers/recurrental.py在调用中(自我、输入、初始状态,**kwargs)
260#修改输入规范以包含状态。
261如果初始_状态为无:
-->262返回超级(循环,自).\u调用(输入,**kwargs)
263
264如果不是isinstance(初始_状态,(列表,元组)):
/用户/asturkmani/anaconda3/lib/python3.5/site-packages/keras/engine/topology.py在调用中(self,input,**kwargs)
567'`layer.build(批处理输入形状)`)
568如果len(输入_形状)==1:
-->569自我构建(输入形状[0])
570其他:
571.自我构建(输入形状)
/Users/asturkmani/anaconda3/lib/python3.5/site-packages/keras/layers/recurrent.py内置(self,input_-shape)
1041初始值设定项=偏差初始值设定项,
1042正则化器=自偏移正则化器,
->1043约束=自身偏差(约束)
1044其他:
1045自我偏差=无
/包装器中的Users/asturkmani/anaconda3/lib/python3.5/site-packages/keras/legacy/interfaces.py(*args,**kwargs)
85警告。警告('更新您的`+对象\u名称+
86'`对Keras 2 API的调用:'+签名,stacklevel=2)
--->87返回函数(*args,**kwargs)
88包装器。_原始函数=func
89返回包装器
/用户/asturkmani/anaconda3/lib/python3.5/site-packages/keras/engine/topology.py添加权重(self、name、shape、dtype、初始化器、正则化器、可训练、约束)
389如果数据类型为无:
390数据类型=K.floatx()
-->391 weight=K.variable(初始值设定项(形状),dtype=dtype,name=name)
392如果正则化器不是无:
393自加损耗(正则化器(重量))
/用户/asturkmani/anaconda3/lib/python3.5/site-packages/keras/layers/recurrent.py in bias_初始值设定项(形状,*args,**kwargs)
1033自身偏差\初始值设定项((自身单位,),*args,**kwargs),
1034个初始值设定项.one()((self.units,),*args,**kwargs),
->1035自我偏差\初始值设定项((自我单位*2,),*args,**kwargs),
1036 ])
1037其他:
/Users/asturkmani/anaconda3/lib/python3.5/site-packages/keras/backend/tensorflow_backend.py串联(张量,轴)
1721返回tf.sparse_concat(轴,张量)
1722其他:
->1723返回tf.concat([对于张量中的x,到密度(x)),轴)
1724
1725
/concat中的Users/asturkmani/anaconda3/lib/python3.5/site-packages/tensorflow/python/ops/array_ops.py(concat_dim,值,名称)
1073运算。将_转换为_张量(concat_dim,
1074 name=“concat_dim”,
->1075 dtype=dtypes.int32)。获取形状(
1076).断言\u与(张量\u形状.标量())兼容
1077返回标识(值[0],名称=范围)
/用户/asturkmani/anaconda3/lib/python3.5/site-packages/tensorflow/python/framework/ops.py在convert_-to_-tensor(值、数据类型、名称、as_-ref、首选数据类型)中
667
668如果ret为无:
-->669 ret=conversion\u func(值,dtype=dtype,name=name,as\u ref=as\u ref)
670
671如果未实施ret:
/Users/asturkmani/anaconda3/lib/python3.5/site-packages/tensorflow/python/framework/constant_op.py in_constant_tensor_conversion_函数(v,dtype,name,as_ref)
174 as_ref=False):
175=作为参考
-->176返回常量(v,dtype=dtype,name=name)
177
178
/用户/asturkmani/anaconda3/lib/python3.5/site-packages/tensor