У меня есть код тензорного потока для сегментации, где я делаю модификации, чтобы включить пакет слов в качестве нашего экстрактора возможностей, а затем использую эти функции для задачи классификации.цель состоит в том, чтобы передать промежуточный уровень вывода CNN в функцию BoW в качестве нашего ввода и получить обратно результат, который затем обрабатывается оставшимися слоями CNN.
Я пробовал следующий код:
def CNN_B(im_size,out_size,L,batch,ind,batch_size=1,layers = 5, wd=0.001, numfilt=None, E_blur=2,stack_from=2):
if numfilt is None:
numfilt = np.ones(layers,dtype=np.int32)*32
#Input and output
x = tf.placeholder(tf.float32, shape=[im_size, im_size, 3, batch_size])
x_image = tf.reshape(x, [-1, im_size, im_size, 3])
y_ = tf.placeholder(tf.float32, shape=[L,2])
bov=BOV()
W_conv = []
b_conv = []
h_conv = []
h_pool = []
resized_out = []
W_conv.append(weight_variable([7, 7, 3, numfilt[0]], wd=wd))
b_conv.append(bias_variable([numfilt[0]]))
h_conv.append(tf.nn.relu(conv2d(x_image, W_conv[-1],padding='SAME') + b_conv[-1]))
h_pool.append(batch_norm(max_pool_2x2(h_conv[-1])))
for layer in range(1,layers):
if layer == 1:
W_conv.append(weight_variable([5, 5, numfilt[layer-1], numfilt[layer]],wd=wd))
else:
W_conv.append(weight_variable([3, 3, numfilt[layer-1], numfilt[layer]], wd=wd))
b_conv.append(bias_variable([numfilt[layer]]))
h_conv.append(tf.nn.relu(conv2d(h_pool[-1], W_conv[-1],padding='SAME') + b_conv[-1]))
h_pool.append(batch_norm(max_pool_2x2(h_conv[-1])))
if layer >= stack_from:
resized_out.append(tf.image.resize_images(h_conv[-1], [out_size, out_size]))
h_concat = tf.concat(resized_out,3)
# MLP for dimension reduction
W_convd = weight_variable([1, 1, int(h_concat.shape[3]), 256], wd=wd)
b_convd = bias_variable([256])
h_convd = batch_norm(tf.nn.relu(conv2d(h_concat, W_convd) + b_convd))
# MLP for dimension reduction
W_convf = weight_variable([1, 1, 256, 64],wd=wd)
b_convf = bias_variable([64])
h_convf = batch_norm(tf.nn.relu(conv2d(h_convd, W_convf) + b_convf))
#Predict energy
W_fcE = weight_variable([1, 1, 64, 1],wd=wd)
b_fcE = bias_variable([1])
h_fcE = conv2d(h_convf, W_fcE) + b_fcE
G_filt = gaussian_filter((9,9), E_blur)
predE = tf.reshape(conv2d(h_fcE,G_filt), [out_size, out_size, 1, -1])
# Predict alpha
W_fcA = weight_variable([1, 1, 64, 1],wd=wd)
b_fcA = bias_variable([1])
h_fcA = conv2d(h_convf, W_fcA) + b_fcA
h_fcA = tf.reduce_mean(h_fcA) + h_fcA * 0
# predA = tf.nn.softplus(tf.reshape(h_fcA,[im_size,im_size,1,-1]))
predA = tf.reshape(h_fcA, [out_size, out_size, 1, -1])
# Predict beta
W_fcB = weight_variable([1, 1, 64, 1],wd=wd)
b_fcB = bias_variable([1])
h_fcB = conv2d(h_convf, W_fcB) + b_fcB
#h_fcB = tf.log(1+tf.exp(h_fcB))
predB = tf.reshape(h_fcB, [out_size, out_size, 1, -1])
# Predict kappa
W_fcK = weight_variable([1, 1, 64, 1],wd=wd)
b_fcK = bias_variable([1])
h_fcK = conv2d(h_convf, W_fcK) + b_fcK
#h_fcK = tf.log(1+tf.exp(h_fcK))
predK = tf.reshape(h_fcK, [out_size, out_size, 1, -1])
#Inject the gradients
grad_predE = tf.placeholder(tf.float32, shape=[out_size, out_size, 1, batch_size])
grad_predA = tf.placeholder(tf.float32, shape=[out_size, out_size, 1, batch_size])
grad_predB = tf.placeholder(tf.float32, shape=[out_size, out_size, 1, batch_size])
grad_predK = tf.placeholder(tf.float32, shape=[out_size, out_size, 1, batch_size])
l2loss = tf.add_n(tf.get_collection('losses'), name='l2_loss')
grad_l2loss = tf.placeholder(tf.float32, shape=[])
tvars = tf.trainable_variables()
grads = tf.gradients([predE,predA,predB,predK,l2loss], tvars, grad_ys = [grad_predE,grad_predA,grad_predB,grad_predK,grad_l2loss])
##classification model
x_1 = tf.placeholder(tf.float32, shape=[100, None])
y_1 = tf.placeholder(tf.float32, shape=[None, 3])
vocab = tf.placeholder(tf.float32, shape=[100, 1])
x1 = batch[ind]
feature_im=tf.reshape(h_conv[5], [h_conv[5].shape[0]*h_conv[5].shape[1]*h_conv[5].shape[2], h_conv[5].shape[3]])
vocab = tf.py_func(bov.trainModel(feature_im), [feature_im], tf.float32)
...................
...................
...................
return tvars,grads,predE, predA, predB, predK, l2loss, grad_predE, grad_predA, grad_predB, grad_predK, grad_l2loss, x,y_,x_1,y_1, vocab, train_step, loss, ind, accuracy, feature_im
CNN_B вызывается как таковой
with tf.device('/cpu:0'):
tvars, grads, predE, predA, predB, predK, l2loss, grad_predE, grad_predA, grad_predB, grad_predK, \
grad_l2loss, x, y_ , x_1,y_1, train_step, loss, ind, accuracy= CNN_B(im_size, out_size, L, batch_x,ind, \
batch_size=1,layers=len(numfilt),wd=0.001,numfilt=numfilt)
С каждой эпохой сеанс запускается для расчетаследующие значения:
[mapE, mapA, mapB, mapK, l2,_,c, accuracy_val] = sess.run([predE, predA, predB, predK, l2loss, train_step, loss, accuracy], feed_dict={x: batch, x_1: x1, y_1: y1})
При таком подходе я получаю следующую ошибку:
TypeError: Объекты Tensor могут повторяться только тогда, когда включено активное выполнение.Чтобы перебрать этот тензор, используйте tf.map_fn.
Я также попытался преобразовать свой тензор feature_im в массив numpy с помощью функции feature_im.eval(session=sess)
, но я получаю следующую ошибку сthis:
ValueError: Невозможно оценить тензор с помощью eval (): сеанс по умолчанию не зарегистрирован.Используйте с sess.as_default () или передайте явный сеанс в eval (session = sess)
Код для
bov.trainModel:
def trainModel(self, feat):
kp, des = feat
print("kp shape=", np.shape(kp))
print(np.shape(des))
descriptor_list.append(des)
# perform clustering
bov_descriptor_stack = bov_helper.formatND(descriptor_list)
bov_helper.cluster()
bagfeatures=bov_helper.developVocabulary(n_images = trainImageCount, descriptor_list=descriptor_list)
print(np.shape(bagfeatures))
# show vocabulary trained
# . bov_helper.plotHist()
bagfeatures=bov_helper.standardize()
#. bov_helper.train(. train_labels)
return bagfeatures