Saya telah melatih model klasifikasi biner dengan CNN, dan ini kode saya
model = Sequential()
model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1],
border_mode='valid',
input_shape=input_shape))
model.add(Activation('relu'))
model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1]))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=pool_size))
# (16, 16, 32)
model.add(Convolution2D(nb_filters*2, kernel_size[0], kernel_size[1]))
model.add(Activation('relu'))
model.add(Convolution2D(nb_filters*2, kernel_size[0], kernel_size[1]))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=pool_size))
# (8, 8, 64) = (2048)
model.add(Flatten())
model.add(Dense(1024))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(2)) # define a binary classification problem
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy',
optimizer='adadelta',
metrics=['accuracy'])
model.fit(x_train, y_train,
batch_size=batch_size,
nb_epoch=nb_epoch,
verbose=1,
validation_data=(x_test, y_test))
Dan di sini, saya ingin mendapatkan output dari setiap layer seperti TensorFlow, bagaimana saya bisa melakukan itu?
sumber
K.function([inp]+ [K.learning_phase()], [out])
artinya dalam kode Anda?np.random.random(input_shape)[np.newaxis,...]
dapat juga ditulis sebagainp.random.random(input_shape)[np.newaxis,:]
K.function
sini , dan memprediksi menggunakannya dalam loop prediksi di sini . Memprediksi loop di atas ukuran batch (jika tidak diatur ke 32) tapi itu untuk mengurangi kendala pada memori GPU. Jadi saya tidak yakin mengapa Anda mengamatimodel.predict
lebih cepat.Dari https://keras.io/getting-started/faq/#how-can-i-obtain-the-output-of-an-intermediate-layer
Salah satu cara sederhana adalah membuat Model baru yang akan menampilkan lapisan yang Anda minati:
Atau, Anda dapat membangun fungsi Keras yang akan mengembalikan output dari lapisan tertentu yang diberi input tertentu, misalnya:
sumber
layer_output = get_3rd_layer_output([X, 0])[0]
danlayer_output = get_3rd_layer_output([X, 1])[0]
Dokumen menyebutkan mode kereta dan mode ujiBerdasarkan semua jawaban yang baik dari utas ini, saya menulis perpustakaan untuk mengambil output dari setiap lapisan. Ini mengabstraksi semua kerumitan dan telah dirancang agar seramah mungkin:
https://github.com/philipperemy/keract
Ini menangani hampir semua kasus tepi
Semoga ini bisa membantu!
sumber
Berikut ini terlihat sangat sederhana bagi saya:
Di atas adalah objek tensor, sehingga Anda dapat memodifikasinya menggunakan operasi yang dapat diterapkan ke objek tensor.
Misalnya, untuk mendapatkan bentuk
model.layers[idx].output.get_shape()
idx
adalah indeks dari layer dan Anda dapat menemukannya darimodel.summary()
sumber
Saya menulis fungsi ini untuk diri saya sendiri (di Jupyter) dan terinspirasi oleh jawaban indraforyou . Ini akan memplot semua output layer secara otomatis. Gambar Anda harus memiliki bentuk (x, y, 1) di mana 1 berarti 1 saluran. Anda cukup panggil plot_layer_outputs (...) untuk plot.
sumber
Dari: https://github.com/philipperemy/keras-visualize-activations/blob/master/read_activations.py
sumber
Ingin menambahkan ini sebagai komentar (tetapi tidak memiliki perwakilan cukup tinggi) untuk jawaban @ indraforyou untuk memperbaiki masalah yang disebutkan dalam komentar @ mathtick. Untuk menghindari
InvalidArgumentError: input_X:Y is both fed and fetched.
pengecualian, cukup ganti barisoutputs = [layer.output for layer in model.layers]
denganoutputs = [layer.output for layer in model.layers][1:]
, yaitumengadaptasi contoh kerja minimal indraforyou:
ps upaya saya mencoba hal-hal seperti
outputs = [layer.output for layer in model.layers[1:]]
tidak berhasil.sumber
keras
model Anda ). Lapisan embeddings kata Anda setara dengan layer input pada contoh yang diberikan di sini.Dengan asumsi Anda memiliki:
1- Keras pra-terlatih
model
.2- Input
x
sebagai gambar atau set gambar. Resolusi gambar harus kompatibel dengan dimensi lapisan input. Misalnya 80 * 80 * 3 untuk gambar 3-saluran (RGB).3- Nama output
layer
untuk mendapatkan aktivasi. Misalnya, lapisan "flatten_2". Ini harus dimasukkan dalamlayer_names
variabel, mewakili nama lapisan yang diberikanmodel
.4-
batch_size
adalah argumen opsional.Kemudian Anda dapat dengan mudah menggunakan
get_activation
fungsi untuk mendapatkan aktivasi outputlayer
untuk input yang diberikanx
dan pra-dilatihmodel
:sumber
Jika Anda memiliki salah satu dari kasus berikut:
InvalidArgumentError: input_X:Y is both fed and fetched
Anda perlu melakukan perubahan berikut:
outputs
variabelfunctors
loopContoh minimum:
sumber
[x1, x2, xn, 1]
? X1 saya tidak didefinisikan dan saya ingin memahami apa yang Anda definisikan di sana.x1
danx2
merupakan input dari model. Seperti yang dinyatakan itu jika Anda mendapat 2 input pada model Anda.Yah, jawaban lain sangat lengkap, tetapi ada cara yang sangat mendasar untuk "melihat", bukan "mendapatkan" bentuk.
Lakukan saja
model.summary()
. Ini akan mencetak semua layer dan bentuk output mereka. Nilai "None" akan menunjukkan dimensi variabel, dan dimensi pertama adalah ukuran batch.sumber