AttributeError: Lapisan tidak memiliki node masuk, atau AttributeError: Lapisan tidak pernah dipanggil

Saya memerlukan cara untuk mendapatkan bentuk tensor keluaran untuk semua jenis lapisan (yaitu Dense, Conv2D, dll) di TensorFlow. Menurut dokumentasi, ada properti output_shape yang menyelesaikan masalah. Namun setiap kali saya mengaksesnya saya mendapatkan AttributedError.

Berikut adalah contoh kode yang menunjukkan masalahnya:

import numpy as np
import tensorflow as tf


x = np.arange(0, 8, dtype=np.float32).reshape((1, 8))
x = tf.constant(value=x, dtype=tf.float32, verify_shape=True)

dense = tf.layers.Dense(units=2)

out = dense(x)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    res = sess.run(fetches=out)
    print(res)
    print(dense.output_shape)

Pernyataan print(dense.output_shape) akan menghasilkan pesan kesalahan:

AttributeError: The layer has never been called and thus has no defined output shape.

atau print(dense.output) akan menghasilkan:

AttributeError('Layer ' + self.name + ' has no inbound nodes.')
AttributeError: Layer dense_1 has no inbound nodes.

Apakah ada cara untuk memperbaiki kesalahan tersebut?

NB: Saya tahu bahwa pada contoh di atas saya bisa mendapatkan bentuk tensor keluaran melalui out.get_shape(). Namun saya ingin tahu mengapa properti output_shape tidak berfungsi dan bagaimana cara memperbaikinya?


person NShiny    schedule 15.01.2019    source sumber


Jawaban (1)


TL;DR

Bagaimana cara memperbaikinya? Tentukan lapisan masukan:

x = tf.keras.layers.Input(tensor=tf.ones(shape=(1, 8)))
dense = tf.layers.Dense(units=2)

out = dense(x)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    res = sess.run(fetches=out)
    print(dense.output_shape) # shape = (1, 2)

Sesuai dengan dokumentasi Keras, jika sebuah lapisan memiliki satu node, Anda bisa mendapatkan tensor masukan, tensor keluaran, bentuk masukan, dan bentuk keluarannya melalui:

  • lapisan.masukan
  • lapisan.output
  • lapisan.input_shape
  • lapisan.output_shape

Namun pada contoh di atas, saat kita memanggil layer.output_shape atau atribut lainnya, akan muncul pengecualian yang tampak agak aneh.

Jika kita mendalami kode sumber, kesalahan yang disebabkan oleh node masuk.

if not self._inbound_nodes:
  raise AttributeError('The layer has never been called '
                       'and thus has no defined output shape.')

Apa itu node masuk ini?

Node menggambarkan konektivitas antara dua lapisan. Setiap kali sebuah lapisan terhubung ke beberapa input baru, sebuah node ditambahkan ke layer._inbound_nodes. Setiap kali output suatu lapisan digunakan oleh lapisan lain, sebuah node ditambahkan ke layer._outbound_nodes.

Seperti yang Anda lihat di atas, ketika self._inbounds_nodes adalah Tidak Ada, ia akan mengeluarkan pengecualian. Ini berarti ketika sebuah lapisan tidak terhubung ke lapisan masukan atau lebih umum lagi, tidak ada lapisan sebelumnya yang terhubung ke lapisan masukan, self._inbounds_nodes kosong sehingga menyebabkan masalah.

Perhatikan bahwa x dalam contoh Anda, adalah tensor dan bukan lapisan masukan. Lihat contoh lain untuk klarifikasi lebih lanjut:

x = tf.keras.layers.Input(shape=(8,))
dense = tf.layers.Dense(units=2)

out = dense(x)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    res = sess.run(fetches=out, feed_dict={x: np.ones(shape=(1, 8))})
    print(res)
    print(res.shape)  # shape = (1,2)
    print(dense.output_shape)  # shape = (None,2)

Tidak apa-apa karena lapisan input sudah ditentukan.


Perhatikan bahwa, dalam contoh Anda, out adalah tensor. Perbedaan antara fungsi tf.shape() dan .shape =(get_shape()) adalah:

tf.shape(x) mengembalikan tensor bilangan bulat 1-D yang mewakili bentuk dinamis x. Bentuk dinamis hanya akan diketahui pada waktu eksekusi grafik.

x.shape mengembalikan tupel Python yang mewakili bentuk statis x. Bentuk statis, diketahui pada waktu definisi graf.

Baca selengkapnya tentang bentuk tensor di: https://pgaleone.eu/tensorflow/2018/07/28/understanding-tensorflow-tensors-shape-static-dynamic/

person Amir    schedule 15.01.2019
comment
Saya tidak yakin jawaban Anda membantu saya mengatasi masalah saya. tf.shape berfungsi dengan tensor dan tf.layers.Dense bukan tensor tetapi lapisan (yaitu subkelas tf.layers.Layer dan tf.keras.layers.Layer. Adapun atribut x.shape saya tidak yakin apa yang Anda maksud. Menurut dokumentasi Lapisan padat tidak memiliki atribut seperti itu. Sedangkan untuk bentuk dinamis, tidak demikian halnya dengan sampel saya. Jika saya akan menambahkan tf.shape(out).eval() di dalam Pernyataan with dalam contoh saya maka akan mengembalikan [1 2] yang berarti tensor keluaran berbentuk statis. - person NShiny; 16.01.2019
comment
Terima kasih banyak! Itu sangat membantu. - person NShiny; 19.01.2019