numpy Keras类型错误:应为float32,但得到了类型为“Tensor”的〈tf.Tensor ..>

55ooxyrt  于 2023-01-09  发布在  其他
关注(0)|答案(2)|浏览(384)

我有一个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_iduser_idzip_codeagegender。下面是一个示例行:

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)
)

请建议。

5vf7fwbs

5vf7fwbs1#

我是这样解决的:

kernel_constraint=tf.keras.constraints.min_max_norm

=〉

kernel_constraint=tf.keras.constraints.MinMaxNorm()

可能只需要添加括号(Y)

vulvrdjw

vulvrdjw2#

我所做的有一些基本的问题。我把嵌入层和分类输入连接起来。嵌入层输出一个3DTensor(尽管打印出.shape仅显示2D,不知道为什么)。将它与输入分类组合而不传递分类,尽管任何其他层实际上没有意义。因此,I flattened嵌入层输出,并通过Dense层传递输入分类,然后将它们连接起来。
为简单起见,假设我们有两个特征-user_idage,我们希望通过训练过程为user_id生成嵌入,age是分类变量,作为LabelEncoding之后的模型输入传递。
以下代码解决了该问题:

row_count = train.shape[0]
EMBEDDING_SIZE = 50
NUM_USERS = movielens['user_id'].nunique()

user_input = keras.Input(shape=(1,), name='user')
age_input = keras.Input(shape=(1,), name='age')
user_emb = layers.Embedding(output_dim=EMBEDDING_SIZE, input_dim=NUM_USERS+1, input_length=row_count, name='user_emb')(user_input)
user_vec = layers.Flatten(name='FlattenUser')(user_emb)
dense_1 = layers.Dense(20, activation='relu')(age_input)
concat = layers.concatenate([user_vec, dense_1], axis=1)
dense = layers.Dense(10,name='FullyConnected')(concat)
outputs = layers.Dense(10, activation="softmax") (dense)
adam = keras.optimizers.Adam(lr=0.005)
model = keras.Model([user_input, age_input], outputs)
model.compile(optimizer=adam,loss= 'mean_absolute_error')

相关问题