tensorflow - 如何根据特定条件更改 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 )
现在我的问题是如何正确执行此操作。
解决方案
尝试使用tf.where
andtf.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)
推荐阅读
- ravendb - RavenDb 的 `Include` 是否支持构建文档 ID,而不仅仅是选择一个?
- c++ - 如何强制 GNU make 重新编译在具有不同 FLAGS 的两个目标中使用的相同目标文件
- python - Pandas:如何引用结构列:('Name', n) ('Name', n+1)
- angular - ng build --prod 时,类型“TournamentsComponent”上不存在属性“加载”
- java - 获取第二天选定的小时纪元
- swift - 是否可以在 Swift 游乐场中运行 Xcode 程序?
- php - 同一列中的两个值
- firebase - Firebase Fido2 身份验证支持
- c - 带指针的结构体数组
- button - JavaFX Boolean Binding 和 TableView Binding 多个