关于图片通道的问题

来源:6-8 编写训练神经网络的方法(上)

金华爱计算机呀

2019-05-09

老师,我觉得卷积层只有三层太少,我又加了两层,然后出现了这个问题
ValueError: Negative dimension size caused by subtracting 2 from 1 for ‘max_pooling2d_3/MaxPool’ (op: ‘MaxPool’) with input shapes: [?,1,1,128].,
请问该怎么解决呢。
图片上传不了,我给您粘贴一下定义模型的代码,如下:

#定义一个判别器模型

def discriminator_model():
model = tf.keras.models.Sequential() #Sequential类:创建一个定义神经网络的模型的对象。
model.add(tf.keras.layers.Conv2D( #Conv2D :二维的卷积层,#layers:层
128,#64个过滤器,输出的深度是64
(5,5),#过滤器在二维的大小是5*5
padding=“same”,#same 表示输出的大小不变,因此需要在外围补0两圈
input_shape=(64,64,3) #输入形状(64,64,3)3表示RGB三原色
))
model.add(tf.keras.layers.Activation(“tanh”)) #Activation : 激活函数层
model.add(tf.keras.layers.MaxPool2D(pool_size=(2,2))) #池化层
model.add(tf.keras.layers.Conv2D(
128,
(5,5))) #这里第二层卷积层不需要再确定input_shape,因为第一层已经定义过,
# 激活函数层的输出作为池化层的输入,池化层的输出作为第二层卷积层的输入
model.add(tf.keras.layers.Activation(“tanh”))
model.add(tf.keras.layers.MaxPool2D(pool_size=(2,2)))
model.add(tf.keras.layers.Conv2D(128,(5,5)))
model.add(tf.keras.layers.Activation(“tanh”))
model.add(tf.keras.layers.MaxPool2D(pool_size=(2,2)))
model.add(tf.keras.layers.Conv2D(128,(5,5)))
model.add(tf.keras.layers.Activation(“tanh”))
model.add(tf.keras.layers.MaxPool2D(pool_size=(2,2)))
model.add(tf.keras.layers.Conv2D(128, (5,5)))
model.add(tf.keras.layers.Activation(“tanh”))
model.add(tf.keras.layers.MaxPool2D(pool_size=(2,2)))
model.add(tf.keras.layers.Flatten()) # 扁平化:去冗余、繁重、复杂的装饰,扁平层可以说主要是将高维的数据转成低唯
# 减少处理时间;降低硬件需求
model.add(tf.keras.layers.Dense(1024)) #1024个神经元的 全连接层
model.add(tf.keras.layers.Activation(“tanh”))
model.add(tf.keras.layers.Dense(1)) #1个神经元的 全连接层Dense
model.add(tf.keras.layers.Activation(“sigmoid”)) #添加sigmoid激活层

return model

#定义生成器模型
#从随机数来生成图片

def generator_model():
model = tf.keras.models.Sequential()

model.add(tf.keras.layers.Dense(input_dim=100,units=1024))# input_dim:输入的维度是100的正态分布的随机数
                                                          #units:输出维度是1024的全连接层
model.add(tf.keras.layers.Activation("tanh"))
model.add(tf.keras.layers.Dense(128*2*2)) # 512个神经元的全连接层
model.add(tf.keras.layers.BatchNormalization())#批标准化
model.add(tf.keras.layers.Activation("tanh"))
model.add(tf.keras.layers.Reshape((2,2,128),input_shape=(128,2,2))) #变成8*8的像素
model.add(tf.keras.layers.UpSampling2D(size=(2,2)))#上采样 ,变成4*4像素
model.add(tf.keras.layers.Conv2D(128,(5,5),padding="same"))
model.add(tf.keras.layers.Activation("tanh"))
model.add(tf.keras.layers.UpSampling2D(size=(2,2)))#变成8*8像素
model.add(tf.keras.layers.Conv2D(128,(5,5),padding="same"))
model.add(tf.keras.layers.Activation("tanh"))
model.add(tf.keras.layers.UpSampling2D(size=(2,2)))  # 变成16*16像素
model.add(tf.keras.layers.Conv2D(3, (5,5),padding="same"))
model.add(tf.keras.layers.Activation("tanh"))
model.add(tf.keras.layers.UpSampling2D(size=(2,2)))  # 变成32*32像素
model.add(tf.keras.layers.Conv2D(3, (5, 5), padding="same"))
model.add(tf.keras.layers.Activation("tanh"))
model.add(tf.keras.layers.UpSampling2D(size=(2,2)))  # 变成64*64像素
model.add(tf.keras.layers.Conv2D(3, (5, 5), padding="same"))
model.add(tf.keras.layers.Activation("tanh"))


return model
写回答

1回答

Oscar

2019-05-22

由于你卷积和池化层多了,所以它图片大小已经不能再向下采样了。

  1. 要么你去掉一层卷积和池化。

  2. 要么你试试在 Conv2D 和 MaxPool2D 加 padding='same' 参数。

0
1
金华爱计算机呀
非常感谢!
2019-05-29
共1条回复

基于Python玩转人工智能最火框架 TensorFlow应用实践

机器学习入门,打牢TensorFlow框架应用是关键!

2214 学习 · 688 问题

查看课程