سلام
لطفا خطایی که داشتید رو همراه کدتون بگید که مشخص بشه مشکل از کجا بوده. اما فعلا با فرض اینکه کلا سوال سره اینه که چطوری روی هر المان از یه تنسور کار کنیم جواب می دم
حداقل این چندتا روش که هست، با ترکیب و نگاه متفاوت به بقیه دستورات هم میشه از این کارا کرد
1- از همون indexing شبیه numpy با for میشه استفاده کرد به شرط اینکه بقیه موارد هم درست باشه. مثلا این خطا میده
for i in range(10):
my_tensor[i] = f(my_tensor[i])
به خاطر بحث assignment و اینجور چیزا که باید درست رعایت بشه. ولی با یه سری تغییرات که البته بهترین روش نیست میشه درستش کرد
my_output = []
for i in range(10):
my_output.append(f(my_tensor[i])
my_output_tensor = tf.stack....
باید به دید این بهش نگاه کرد الان گراف محاسباتی که می خواد ساخته بشه چه فرمی داره و هر نود داره چی کار می کنه و ...
2- از tf.unstack استفاده کنید و تنسور بشه لیستی از تنسورها (که اینجا باید اینقدر unstack کنید که هر تنسور فقط یه المان بشه) بعدش روی لیست خروجی می تونید for بزنید. این روش هم یه جوری همون روش بالاییه ولی تر و تمیز تر شده
نمونه اش توی این سوال مطرح شده:
https://stackoverflow.com/questions/43327668/looping-over-a-tensor
3- بازم تابع توی تنسورفلو هست که میشه ازش استفاده کرد. نمونش split ه. که بهش می گید یه آرایه رو از کجا و به چه تعداد قسمت کنه (که میشه بگید به تعداد المان ها قسمت کنه که هر المان رو جدا جدا داشته باشید)
مثلا توی کد مقاله DRAW برای قسمت guassian attention نیازه که مثلا به یه قسمت log اعمال بشه یه قسمت exp و ....
یه تابع مشابه این میشه براش تعریف کرد
def decode(raw_parameters):
# Raw parameters = [u_y, log_sigma2_y, log_delta_y, u_x, log_sigma2_x, log_delta_x]
with tf.name_scope('decode_spatial_params'):
#Split parameters
split_axis = raw_parameters.shape.ndims - 1
u_y, log_sigma2_y, log_delta_y, u_x, log_sigma2_x, log_delta_x = \
tf.split(raw_parameters, 6, split_axis)
#Apply activation functions
u_y = tf.nn.tanh(u_y)
u_x = tf.nn.tanh(u_x)
sigma2_y = tf.exp(log_sigma2_y)
sigma2_x = tf.exp(log_sigma2_x)
delta_y = tf.exp(log_delta_y)
delta_x = tf.exp(log_delta_x)
decoded_params = tf.concat([u_y, sigma2_y, delta_y, u_x, sigma2_x, delta_x], -1)
return decoded_params
اینجا فرض بر اینه که raw_parameters مثلا همون تنسوریه که می خواید روی هر المانش یه تابع اعمال کنید و اینجا 6 تا المان داره که با split جداشون کردیم، یه سری تابع روی هر کدوم اعمال کردیم و دوباره concat کردیم فرستادیم بره
اینجا تعداد المان ها خیلی کم بوده و دستی همه چیز جدا شده اما میشه براش for هم نوشت
4- استفاده از توابعی مثل gather و slice و ....
5- از pytorch استفاده کنیم که این کارا توش راحت تره D: