Mengonversi tensor TensorFlow menjadi array Numpy
Deskripsi Masalah
Saya mencoba menulis fungsi kerugian khusus di TensorFlow 2.3.0. Untuk menghitung kerugian, saya membutuhkan y_predparameter untuk diubah menjadi array numpy. Namun, saya tidak dapat menemukan cara untuk mengubahnya dari <class 'tensorflow.python.framework.ops.Tensor'>menjadi numpy array, meskipun tampaknya ada fungsi TensorFlow untuk melakukannya.
Contoh Kode
def custom_loss(y_true, y_pred):
print(type(y_pred))
npa = y_pred.make_ndarray()
...
if __name__ == '__main__':
...
model.compile(loss=custom_loss, optimizer="adam")
model.fit(x=train_data, y=train_data, epochs=10)
memberikan pesan kesalahan: AttributeError: 'Tensor' object has no attribute 'make_ndarraysetelah mencetak jenis y_predparameter:<class 'tensorflow.python.framework.ops.Tensor'>
Apa yang sudah saya coba sejauh ini
Mencari solusi, saya menemukan ini tampaknya menjadi masalah umum dan ada beberapa saran, tetapi sejauh ini tidak berhasil untuk saya:
1. "... jadi panggil saja .numpy () pada objek Tensor.": Bagaimana cara mengubah tensor menjadi array numpy di TensorFlow?
jadi saya mencoba:
def custom_loss(y_true, y_pred):
npa = y_pred.numpy()
...
memberikanku AttributeError: 'Tensor' object has no attribute 'numpy'
2. "Gunakan tensorflow.Tensor.eval () untuk mengonversi tensor menjadi array": Cara mengonversi tensor TensorFlow menjadi array NumPy dengan Python
jadi saya mencoba:
def custom_loss(y_true, y_pred):
npa = y_pred.eval(session=tf.compat.v1.Session())
...
memberi saya salah satu jejak pesan kesalahan terpanjang yang pernah saya lihat dengan inti:
InvalidArgumentError: 2 root error(s) found.
(0) Invalid argument: You must feed a value for placeholder tensor 'functional_1/conv2d_2/BiasAdd/ReadVariableOp/resource' with dtype resource
[[node functional_1/conv2d_2/BiasAdd/ReadVariableOp/resource (defined at main.py:303) ]]
[[functional_1/cropping2d/strided_slice/_1]]
(1) Invalid argument: You must feed a value for placeholder tensor 'functional_1/conv2d_2/BiasAdd/ReadVariableOp/resource' with dtype resource
[[node functional_1/conv2d_2/BiasAdd/ReadVariableOp/resource (defined at main.py:303) ]]
juga harus memanggil Fungsi Kompatibilitas TensorFlow dari Versi 1.x tidak terasa sangat tahan masa depan, jadi saya tidak terlalu suka pendekatan ini.
3. Melihat Dokumen TensorFlow sepertinya ada fungsi yang saya perlukan hanya menunggu: tf.make_ndarray Buat ndarray numpy dari tensor.
jadi saya mencoba:
def custom_loss(y_true, y_pred):
npa = tf.make_ndarray(y_pred)
...
memberikanku AttributeError: 'Tensor' object has no attribute 'tensor_shape'
Melihat contoh di dokumentasi TF mereka menggunakan ini pada proto_tensor, jadi saya mencoba mengonversi ke proto terlebih dahulu:
def custom_loss(y_true, y_pred):
proto_tensor = tf.make_tensor_proto(y_pred)
npa = tf.make_ndarray(proto_tensor)
...
tapi sudah tf.make_tensor_proto(y_pred)memunculkan kesalahan:TypeError: Expected any non-tensor type, got a tensor instead.
Juga mencoba membuat tensor const terlebih dahulu memberikan kesalahan yang sama:
def custom_loss(y_true, y_pred):
a = tf.constant(y_pred)
proto_tensor = tf.make_tensor_proto(a)
npa = tf.make_ndarray(proto_tensor)
...
Ada lebih banyak posting di sekitar ini tetapi tampaknya mereka semua kembali ke tiga ide dasar ini. Menantikan saran Anda!
Jawaban
y_pred.numpy()bekerja di TF 2 tetapi AttributeError: 'Tensor' object has no attribute 'make_ndarraymenunjukkan bahwa ada bagian dari kode Anda yang tidak Anda jalankan dalam mode Eager karena Anda tidak akan memiliki Tensorobjek tetapi file EagerTensor.
Untuk mengaktifkan Mode Eager, letakkan ini di awal kode Anda sebelum apa pun dalam grafik dibuat:
tf.config.experimental_run_functions_eagerly(True)
Kedua, saat Anda mengompilasi model Anda, tambahkan parameter ini:
model.compile(..., run_eagerly=True, ...)
Sekarang Anda mengeksekusi dalam Mode Eager dan semua variabel benar-benar memiliki nilai yang dapat Anda cetak dan kerjakan. Ketahuilah bahwa beralih ke mode Eager mungkin memerlukan penyesuaian tambahan pada kode Anda (lihat di sini untuk ikhtisar).