Python tensorflow 2从顺序到功能

Python tensorflow 2从顺序到功能,python,tensorflow,keras,deep-learning,Python,Tensorflow,Keras,Deep Learning,我使用顺序API定义了以下自动编码器模型: 将tensorflow导入为tf 从tensorflow进口keras 从tensorflow.keras导入图层 从tensorflow.keras.layers导入Conv2D、输入、密集、Lambda、重塑、激活、退出 def测试顺序(X列,历次): 模型=keras.Sequential() #编码器 add(Conv2D(64,内核大小=(6,2)\ 激活='relu'\ “相同”, 扩张率=1\ 步幅=1\ 输入_shape=(X_trai

我使用顺序API定义了以下自动编码器模型:

将tensorflow导入为tf
从tensorflow进口keras
从tensorflow.keras导入图层
从tensorflow.keras.layers导入Conv2D、输入、密集、Lambda、重塑、激活、退出
def测试顺序(X列,历次):
模型=keras.Sequential()
#编码器
add(Conv2D(64,内核大小=(6,2)\
激活='relu'\
“相同”,
扩张率=1\
步幅=1\
输入_shape=(X_train.shape[1],X_train.shape[2],1)))
模型。添加(辍学(0.1))
#潜在空间
模型.添加(密度(2))
#译码器
add(Conv2D(64,内核大小=(6,2)\
激活='relu'\
“相同”,
扩张率=1\
步幅=1)
模型。添加(辍学(0.1))
add(Conv2D(1,内核大小=(6,2)\
激活='relu'\
(同上)
compile(loss='mse',optimizer='adam',metrics=['mae','mape'])
打印(model.summary())
打印()
打印(‘培训…’)
历史=模型.fit(X_列,X_列,历代=历代,详细=0)
打印('DONE!!')
回归模型、历史

我想使用函数API重写它,以便能够分别返回编码器和解码器。我的尝试是:

def test\u fun(X_train,epochs,潜伏期):
导入tensorflow作为tf
从tensorflow.keras.layers导入Conv2D、输入、密集、Lambda、重塑
从tensorflow.keras.layers导入辍学,批次标准化
从tensorflow.keras.models导入模型
从tensorflow.keras.Loss导入均方误差
将keras.backend作为K导入
###编码器
e_i=Input(shape=(X_train.shape[1],X_train.shape[2],1),name='enc_Input')#输入层
cx=Conv2D(64,内核大小=(6,2)\
激活='relu'\
“相同”,
扩张率=1\
步幅=1\
输入_shape=(X_train.shape[1],X_train.shape[2],1),name='enc_c1')(e_i)
cx=辍学率(0.1)(cx)
###潜在空间
x=密集(潜在空间,name='潜在空间')(cx)
###实例化编码器
编码器=型号(e_i,x,name='encoder')
打印(encoder.summary())
###译码器
d_i=输入(形状=(潜在尺寸,1),名称='decoder_输入')
cx=Conv2D(64,内核大小=(6,2)\
激活='relu'\
“相同”,
扩张率=1\
步幅=1,name='dec_c1')(d_i)
cx=辍学率(0.1)(cx)
o=Conv2D(1,内核大小=(6,2)\
激活='relu'\
“相同”\
name='decoder_output')(cx)
#解码器实例化
解码器=型号(d_i,o,name='decoder')
打印(decoder.summary())
#实例化AE
ae_输出=解码器(编码器(e_i))
ae=模型(e_i,ae_输出,name='ae')
#编译AE
编译(优化器='adam',loss='mse',metrics=['mae','mape']\
实验运行(函数=假)
#列车自动编码器
历史=ae.fit(X_序列,X_序列,年代=年代,详细=0)
返回编码器、解码器、ae、历史记录
但是,这会返回解码器的输入大小错误:

为什么它期望ndim=4


再想一想,如果没有在解码器的第一层中填充class='valid',seauntial模型如何工作。顺便说一句,即使使用padding='valid',我也会收到相同的错误。

我认为问题不在于padding。根据keras文件:

Conv2D层采用4维输入,即(批量大小、行、列、通道)

但是你给“dec_c1”层的输入是形状的(潜伏期,1),所以我建议你把输入层“decoder_input”的形状改成3-dim格式


d_i=Input(shape=(潜伏期,1,1),name='decoder\u Input')

谢谢,使用
Input(shape=(180,潜伏期,潜伏期),name='decoder\u Input')
模型似乎有正确的维度(两个模型的摘要相同)。然而,不同模型的结果却大不相同。使用函数API定义的API的质量要差得多。你遇到过类似的事情吗?错误可能在哪里?我认为在使用内核初始化器的情况下,由于各种原因可能会发生错误