首页 > 解决方案 > 如何根据特定条件更改 keras 张量的值

问题描述

我正在尝试使用 lambda 层更改 Keras 张量的值。但是,它给了我这个错误消息。

"AttributeError: 'int' object has no attribute 'get_shape."

这是代码。

user_matrix = K.constant(getTrainMatrix(train))
item_matrix = K.constant(getTrainMatrix(train).T)

# Input variables
user_input = Input(shape=(1,), dtype='int32', name='user_input')
item_input = Input(shape=(1,), dtype='int32', name='item_input')

user_rating = Lambda(lambda x: tf.gather(user_matrix, tf.to_int32(x)))(user_input)
item_rating = Lambda(lambda x: tf.gather(item_matrix, tf.to_int32(x)))(item_input)
user_rating = Reshape((num_items, ))(user_rating)
item_rating = Reshape((num_users, ))(item_rating)

MLP_Embedding_User = Dense(layers[0]//2, activation="linear" , name='user_embedding')
MLP_Embedding_Item  = Dense(layers[0]//2, activation="linear" , name='item_embedding')
user_latent = MLP_Embedding_User(user_rating)
item_latent = MLP_Embedding_Item(item_rating)

在 MLP_Embedding_User 之前,我只是放了这行代码,

user_rating=Lambda(lambda x:2 if x==0 else 0)(user_rating ) 

现在我的问题是如何正确执行此操作。

标签: tensorflowlambdakeras

解决方案


尝试使用tf.whereandtf.equal而不是使用 if else 语句。

user_rating = K.constant(np.random.randint(0,2,size=10))
K.eval(user_rating)
# array([1., 1., 0., 0., 0., 0., 0., 1., 1., 0.], dtype=float32)

user_rating=Lambda(lambda x: tf.where(tf.equal(x, 0.), 2.*tf.ones_like(x), tf.zeros_like(x)))(user_rating)

K.eval(user_rating)
# array([0., 0., 2., 2., 2., 2., 2., 0., 0., 2.], dtype=float32)

推荐阅读