[英]How would I go about changing the input_shape for Alex net (with tf-keras)?
Here is the code:这是代码:
def AlexNet(log_path, save_path, input_shape):
# code source => 'engmrk.com/alexnet-implementation-using-keras'
# model definition
model = models.Sequential()
# 1st Convolutional Layer
model.add(layers.Conv2D(filters=96, input_shape=(INPUT_SHAPE), kernel_size=(11,11), strides=(4,4), padding='valid'))
model.add(layers.Activation('relu'))
# Max Pooling
model.add(layers.MaxPooling2D(pool_size=(2,2), strides=(2,2), padding='valid'))
# 2nd Convolutional Layer
model.add(layers.Conv2D(filters=256, kernel_size=(11,11), strides=(1,1), padding='valid'))
model.add(layers.Activation('relu'))
# Max Pooling
model.add(layers.MaxPooling2D(pool_size=(2,2), strides=(2,2), padding='valid'))
# 3rd Convolutional Layer
model.add(layers.Conv2D(filters=384, kernel_size=(3,3), strides=(1,1), padding='valid'))
model.add(layers.Activation('relu'))
# 4th Convolutional Layer
model.add(layers.Conv2D(filters=384, kernel_size=(3,3), strides=(1,1), padding='valid'))
model.add(layers.Activation('relu'))
# 5th Convolutional Layer
model.add(layers.Conv2D(filters=256, kernel_size=(3,3), strides=(1,1), padding='valid'))
model.add(layers.Activation('relu'))
# Max Pooling
model.add(layers.MaxPooling2D(pool_size=(2,2), strides=(2,2), padding='valid'))
# Passing it to a Fully Connected layer
model.add(layers.Flatten())
# 1st Fully Connected Layer
model.add(layers.Dense(4096, input_shape=(input_shape[0] * input_shape[1] * input_shape[2],))
model.add(layers.Activation('relu'))
# Add Dropout to prevent overfitting
model.add(layers.Dropout(0.4))
# 2nd Fully Connected Layer
model.add(layers.Dense(4096))
model.add(layers.Activation('relu'))
# Add Dropout
model.add(layers.Dropout(0.4))
# 3rd Fully Connected Layer
model.add(layers.Dense(1000))
model.add(layers.Activation('relu'))
# Add Dropout
model.add(layers.Dropout(0.4))
# Output Layer
model.add(layers.Dense(17))
model.add(layers.Activation('softmax'))
model.summary()
When I tried, just changing the input shape to (91, 74, 3), I got this error:当我尝试将输入形状更改为 (91, 74, 3) 时,我收到此错误:
ValueError: Negative dimension size caused by subtracting 11 from 10 for '{{node conv2d_1/Conv2D}} = Conv2D[T=DT_FLOAT, data_format="NHWC", dilations=[1, 1, 1, 1], explicit_paddings=[], padding="VALID", strides=[1, 1, 1, 1], use_cudnn_on_gpu=true](max_pooling2d/Identity, conv2d_1/Conv2D/ReadVariableOp)' with input shapes: [?,19,10,96], [11,11,96,256].
Now how would I go about changing, for example, the strides and or kernel_size if I wanted to do AlexNet with a dataset of RGB (91 * 74) images which have the input shape --> (91, 74, 3).现在,如果我想用具有输入形状的 RGB (91 * 74) 图像数据集做 AlexNet,我将如何更改步幅和或 kernel_size --> (91, 74, 3)。
Is this even possible, if so how?这甚至可能吗,如果可以的话怎么办?
Thank you....谢谢....
Convolutional layers and average pooling or max pooling layers reduce the size of the image w, h
as you go deeper into the network, if you start with a small image it might end up having negative dimensions which doesn't make any sense.卷积层和平均池化或最大池化层会减小图像w, h
的大小,因为您 go 深入网络,如果您从小图像开始,它可能最终具有没有任何意义的负尺寸。 if you want to start with small images try removing some of the max_pool layers or use padding="same"
on the conv layers or just reduce the depth of the network's architecture.如果您想从小图像开始尝试删除一些 max_pool 层或在 conv 层上使用padding="same"
或只是减少网络架构的深度。
example: after the first layer the shape is gonna be
(21, 16, 96)
.示例:在第一层之后,形状将是(21, 16, 96)
。
How to calculate the output: forvalid
padding it is((W - F) / S) +1
forsame
padding the output shape is the same as the input shape except the number of channels如何计算 output:对于valid
填充,它是((W - F) / S) +1
对于same
的填充 output 形状与输入形状相同,但通道数除外
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.