我有一个Keras模型它会给我误差
TypeError: Expected float32, got <tf.Tensor 'recommender_dnn_25/strided_slice_5:0' shape=(None, 1) dtype=float32> of type 'Tensor' instead.
我正在向我的keras模型发送numpy.ndarray
类型的训练/验证数据。这来自movielens
数据集,值为movie_id
、user_id
、zip_code
、age
、gender
。下面是一个示例行:
x_train[0]
array(['195', '241', 415, 3, 1], dtype=object)
前两个输入与模型训练过程沿着被训练到嵌入。后三个(邮政编码,年龄,性别)在所有五个特征被连接之前经历下面的转换。
1.转换为浮动
1.整形为(无,1)
1.使用zip_code = K.constant(zip_code)
转换为Tensor,没有此步骤,我看到错误ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type int)
现在,当我运行这个模型时,我得到错误TypeError: Expected float32, got <tf.Tensor 'recommender_dnn_25/strided_slice_5:0' shape=(None, 1) dtype=float32> of type 'Tensor' instead.
错误发生在zip_code = K.constant(zip_code)
,甚至在它进入连接阶段之前。
以下型号代码:
x_train.shape
(90000, 5)
EMBEDDING_SIZE = 50
NUM_USERS =movielens['user_id'].nunique()
NUM_MOVIES = movielens['movie_id'].nunique()
class RecommenderDNN(keras.Model):
def __init__(self, num_users, num_movies, embedding_size, **kwargs):
super(RecommenderDNN, self).__init__(**kwargs)
self.num_users = num_users
self.num_movies = num_movies
self.embedding_size = embedding_size
self.user_embedding = layers.Embedding(
num_users,
embedding_size,
embeddings_initializer="he_normal",
embeddings_regularizer=keras.regularizers.l2(1e-6),
)
self.movie_embedding = layers.Embedding(
num_movies,
embedding_size,
embeddings_initializer="he_normal",
embeddings_regularizer=keras.regularizers.l2(1e-6),
)
def call(self, inputs):
user_vector = self.user_embedding(inputs[:, 0])
movie_vector = self.movie_embedding(inputs[:, 1])
zip_code = float(inputs[:, 2])
age = float(inputs[:, 3])
gender = float(inputs[:,4])
zip_code = zip_code[: ,None]
age = age[: ,None]
gender = gender[: ,None]
zip_code = K.constant(zip_code)
age = K.constant(age)
gender = K.constant(gender)
print(user_vector.shape)
print(movie_vector.shape)
print(zip_code.shape)
print(age.shape)
print(gender.shape)
concat = layers.concatenate([user_vector, movie_vector, zip_code, age, gender], axis=1)
concat_dropout = layers.Dropout(0.2)(concat)
# rest of the layers ...
result = layers.Dense(1, activation='softmax',name='Activation')(dense_4)
return result
model = RecommenderDNN(NUM_USERS, NUM_MOVIES, EMBEDDING_SIZE)
model.compile(
loss=keras.losses.BinaryCrossentropy(), optimizer=keras.optimizers.Adam(lr=0.001)
)
请建议。
2条答案
按热度按时间5vf7fwbs1#
我是这样解决的:
=〉
可能只需要添加括号(Y)
vulvrdjw2#
我所做的有一些基本的问题。我把嵌入层和分类输入连接起来。嵌入层输出一个3DTensor(尽管打印出
.shape
仅显示2D,不知道为什么)。将它与输入分类组合而不传递分类,尽管任何其他层实际上没有意义。因此,Iflattened
嵌入层输出,并通过Dense
层传递输入分类,然后将它们连接起来。为简单起见,假设我们有两个特征-
user_id
和age
,我们希望通过训练过程为user_id
生成嵌入,age
是分类变量,作为LabelEncoding
之后的模型输入传递。以下代码解决了该问题: