亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

kMeans Clustering using TF2.0, ValueError:

kMeans Clustering using TF2.0, ValueError:

互換的青春 2022-10-05 16:55:46
我正在嘗試使用 TensorFlow 2.0 實現簡單的 k-means 聚類。預計@tf.function使用 autograph 來轉換帶有 for 循環的函數。請讓我知道導致 ValueError 的原因。tf_kmeans.pyimport tensorflow as tfimport numpy as npfrom typeguard import typecheckedfrom typing import [email protected] train_kmeans(X: Union[tf.Tensor, np.ndarray],     k: Union[int, tf.Tensor],     n_iter: Union[int, tf.Tensor] = 10) -> (tf.Tensor, tf.Tensor):    X = tf.convert_to_tensor(X)    X = tf.cast(X, tf.float32)    assert len(tf.shape(X)) == 2, "Training data X must be represented as 2D array only"    m = tf.shape(X)[0]    k = tf.convert_to_tensor(k, dtype=tf.int64)    random_select = tf.random.shuffle(X)    init_centroids = random_select[:k]    centroids = tf.Variable(init_centroids)    clusters = tf.zeros([m, ], dtype=tf.int64)    clusters = tf.Variable(clusters)    for _ in tf.range(n_iter):        squared_diffs = tf.square(X[None, :, :] - centroids[:, None, :])        euclidean_dists = tf.reduce_sum(squared_diffs, axis=-1) ** 0.5        clusters.assign(tf.argmin(euclidean_dists, axis=0))        selector = tf.range(k)[:, None] == clusters[None, :]        for c in tf.range(k):            select = selector[c]            points = X[select]            mean_points = tf.reduce_mean(points, axis=0)            centroids[c].assign(mean_points)    centroids = tf.convert_to_tensor(centroids)    return centroids, clusters以下代碼用于調用該函數:tf_means_test.pyimport tensorflow as tfimport numpy as npX = np.array([[ 2., 10.],    [ 2.,  5.],    [ 8.,  4.],    [ 5.,  8.],    [ 7.,  5.],    [ 6.,  4.],    [ 1.,  2.],    [ 4.,  9.]])k = 3import tf_kmeanscentroids, clusters = tf_kmeans.train_kmeans(X, k)print(centroids)print(clusters)如果tf.function刪除了裝飾器,則代碼可以正常工作,因為在這種情況下不會執行簽名。提前致謝。
查看完整描述

1 回答

?
達令說

TA貢獻1821條經驗 獲得超6個贊

我假設您想要一個tf.Variable僅使用的實例assign。但是,在使用 時tf.function,您應該始終從外部提供變量,并在內部使用內置的 TensorFlow 數據結構。


例如,您的代碼更改最少,沒有tf.Variable對象將是:


import tensorflow as tf

import numpy as np

from typeguard import typechecked

from typing import Union


@tf.function

def train_kmeans(X: Union[tf.Tensor, np.ndarray], 

    k: Union[int, tf.Tensor], 

    n_iter: Union[int, tf.Tensor] = 10) -> (tf.Tensor, tf.Tensor):


    X = tf.convert_to_tensor(X)

    X = tf.cast(X, tf.float32)


    # Required as an int later

    num_centers = k


    assert len(tf.shape(X)) == 2, "Training data X must be represented as 2D array only"

    m = tf.shape(X)[0]


    k = tf.convert_to_tensor(k, dtype=tf.int64)


    random_select = tf.random.shuffle(X)

    init_centroids = random_select[:k]


    centroids = init_centroids

    clusters = tf.zeros([m, ], dtype=tf.int64)


    for _ in tf.range(n_iter):

        squared_diffs = tf.square(X[None, :, :] - centroids[:, None, :])

        euclidean_dists = tf.reduce_sum(squared_diffs, axis=-1) ** 0.5


        clusters = tf.argmin(euclidean_dists, axis=0)


        selector = tf.range(k)[:, None] == clusters[None, :]


        # TF data structure

        new_centroids = tf.TensorArray(tf.float32, num_centers, element_shape=[1, 2])

        for c in range(k):

            select = selector[c]

            points = X[select]

            centroid = tf.reduce_mean(points, axis=0)

            centroid = tf.reshape(centroid, [1, 2])

            new_centroids.write(tf.cast(c, tf.int32), centroid)

        centroids = new_centroids.concat()

        centroids = tf.reshape(centroids, [num_centers, 2])


    return centroids, clusters


查看完整回答
反對 回復 2022-10-05
  • 1 回答
  • 0 關注
  • 128 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號