在此丢失函数中,我需要创建完整的度量标准,具体取决于批处理中的图像数量和图像大小。但是,我可以从y_pred获取图像大小,但不能从批处理大小中获取图像,因为在初始化图形时,图像大小为None。
def focal_loss(content, label_remap, gamma_=2, w_d=1e-4):
def focal_loss_fixed(y_true, y_pred):
num_classes = len(content.keys())
print("y_true_b", y_true.get_shape().as_list())
cv_eqation = K.constant([0.114, 0.587, 0.299])
y_true = tf.multiply(y_true, cv_eqation)
y_true = tf.reduce_sum(y_true, axis=3)
y_true = tf.cast(y_true, dtype=tf.uint8)
lbls_resized = y_true
logits_train = y_pred
b, c, w, h = K.int_shape(y_pred)
batch = K.constant(b)
channel = K.variable(c)
width = K.variable(w)
high = K.variable(h)
with tf.variable_scope("loss"):
......
# make the labels one-hot for the cross-entropy
onehot_mat = tf.reshape(tf.one_hot(lbls_resized, num_classes), (-1, num_classes))
# focal loss p and gamma
gamma = np.full((high * width * batch, channel), fill_value=gamma_)
print("gamma", gamma.shape)
.........
return loss
return focal_loss_fixed
此外,我通过使用onehot_mat形状尝试了另一种方法,但是它的形状没有任何价值。
答案 0 :(得分:0)
请参阅this answer。听起来您想了解张量的动态形状,但正在使用静态形状。您需要使用tf.shape
来获取运行时批处理的动态形状,而不是get_shape
来获取构建网络时已知的静态形状。{p>
更新: 对于您的特定任务,在我看来,您似乎正在尝试创建一个张量,该张量的形状取决于当前的批处理大小。我认为您可以执行以下操作:
import tensorflow as tf
import numpy as np
vector = tf.Variable(tf.random_normal([3], stddev=0.1), name="weights")
batch = tf.placeholder(tf.float32, shape=[None,2,2])
vector_times_batchsize = tf.tile(vector, tf.shape(batch)[0:1])
init_all_op = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init_all_op)
print sess.run(vector_times_batchsize, feed_dict={batch: np.zeros((5,2,2), np.float32)}).shape
这将通过根据张量gamma_image
的第一维的形状重复batch
张量来创建新张量。
请注意,您不能使用numpy函数,因为此张量的创建必须是tensorflow图的一部分,因为只有在运行时才知道该sice,而在创建图时才知道。