假设我正在尝试将池化层的输出连接到密集层。为了做到这一点,我需要压缩汇集的张量。考虑以下几层:
def conv_layer(input, in_channels, out_channels, name="conv"):
w = tf.get_variable("W", initializer=tf.truncated_normal([3, 3, in_channels, out_channels], stddev=0.1))
b = tf.get_variable("B", initializer=tf.constant(0.1, shape=[out_channels]))
conv = tf.nn.conv2d(input, w, strides=[1,1,1,1], padding="SAME")
act = tf.nn.relu(conv + b)
return act
def pool_layer(input, name="pool"):
pool = tf.nn.max_pool(input, ksize=[1,2,2,1], strides=[1,2,2,1], padding="SAME")
return pool
def dense_layer(input, size_in, size_out, name="dense"):
w = tf.get_variable("W", initializer=tf.truncated_normal([size_in, size_out], stddev=0.1))
b = tf.get_variable("B", initializer=tf.constant(0.1, shape=[size_out]))
act = tf.nn.relu(tf.matmul(input, w) + b)
return act
我正在使用它们来创建网络:
def cnn_model(x):
x_image = tf.reshape(x, [-1, nseries, present_window, 1])
conv1 = conv_layer(x_image, 1, 32, "conv1")
pool1 = pool_layer(conv1, "pool1")
conv2 = conv_layer(pool1, 32, 64, "conv2")
pool2 = pool_layer(conv2, "pool2")
nflat = 17*15*64 # hard-coded
flat = tf.reshape(pool2, [-1, nflat])
yhat = dense_layer(flat, nflat, future_window, "dense1")
return yhat
正如您所看到的,我正在对变量nflat
进行硬编码。怎么避免这个?
答案 0 :(得分:1)
如果是张量pool.get_shape()
应该适用于Keras或Tensorflow。
这实际上将返回一个具有每个维度大小的元组,因此您需要从中进行选择,可能它是您的第二个。
如果输入实际上是您的输入(没有任何其他图层),为什么要最大化池?你不是在寻找dropout
吗?
如果您的批量大小是可变的,确实会发现问题,因为无法告诉模型reshape
的大小