首页 文章

混淆了keras.layers.RNN中时间步和输出形状的概念

提问于
浏览
0

keras.layers.RNN输入形状3D张量与形状(batch_size,timesteps,input_dim) . return_state的输出形状:张量列表 . 第一个张量是输出 . 其余的张量是最后的状态,每个状态都有形状(batch_size,units) . if return_sequences:具有形状的3D张量(batch_size,timesteps,units) . 否则,2D张量与形状(batch_size,units) .

我对时间步的概念感到困惑 .

我对如何处理三轴输入的过程感到困惑 .

简化代码

import keras
from keras.applications.inception_resnet_v2 import InceptionResNetV2
from keras.applications.mobilenet import MobileNet
from keras.applications.vgg19 import VGG19
from keras.applications.densenet import DenseNet
from keras.preprocessing import image
from keras.engine import Layer
from keras.applications.inception_resnet_v2 import preprocess_input
from keras.layers import Conv2D, UpSampling2D, InputLayer, Conv2DTranspose, Input, Reshape, merge, concatenate
from keras.layers import Activation, Dense, Dropout, Flatten
from keras.layers.normalization import BatchNormalization
from keras.callbacks import TensorBoard 
from keras.models import Sequential, Model
from keras.layers.core import RepeatVector, Permute
from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img
from skimage.color import rgb2lab, lab2rgb, rgb2gray, gray2rgb
from skimage.transform import resize
from skimage.io import imsave
import numpy as np
import os
import random
import tensorflow as tf
import keras.backend as K
from keras.layers.recurrent import GRU
from keras.layers.merge import add

encoder_input = Input(shape=(32, 32, 1))

rnn_size = 16
encoder_output = Conv2D(16, (3,3), activation='relu', padding='same')(encoder_input)
sequence_output = Reshape(target_shape=(32, 512))(encoder_output)  
gru_1 = GRU(rnn_size, return_sequences=False,kernel_initializer='he_normal', name='gru1')(sequence_output)
gru_1b = GRU(rnn_size, return_sequences=True, go_backwards=True, kernel_initializer='he_normal', name='gru1_b')(sequence_output)
gru1_merged = add([gru_1, gru_1b])
gru_2 = GRU(rnn_size, return_sequences=True,kernel_initializer='he_normal', name='gru2')(gru1_merged)
gru_2b = GRU(rnn_size, return_sequences=True, go_backwards=True, kernel_initializer='he_normal', name='gru2_b')(gru1_merged)
sequence_output = concatenate([gru_2, gru_2b])
sequence_output = K.expand_dims(sequence_output, 3)
fusion_output = concatenate([encoder_output,sequence_output ], axis=3) 

model = Model(inputs=encoder_input, outputs=fusion_output)
model.summary()

输出错误

ValueError:Concatenate层要求输入具有匹配的形状,但concat轴除外 . 得到输入形状:[(无,32,32,16),(无,无,32,1)]

我认为'sequence_output'的形状将是(None,32,32,1) . 但它是(None,None,32,1) . 我不知道出了什么问题所以我开始怀疑我对RNN的理解 .

我做了什么

1.输出gru1和gru_1b

注释后:

'#sequence_output = K.expand_dims(sequence_output,3)'

'#fusion_output = concatenate([encoder_output,sequence_output ], axis=3)'然后我得到了()
output

我对gru1和gru_1b的形状感到很困惑 . 为什么他们不同?

2.我设置了return_sequences和return_state为True然后得到了

valueerror:

实际上我不知道下一步该做什么 .

1 回答

  • 0

    这个问题更适合Cross Validated论坛,但还可以 .

    所以为了回答你的第一个问题,时间步长只是一个表示序列长度的数字 . RNN以特定方式工作,因为它们具有自身的重复连接 . 在LSTM的例子中给出了对RNN的非常好的解释here . 在那里你可以看到 cell statestate 之间的区别 .

    要回答第二个问题, (batch_size, timesteps, units) 是输出维度 . timesteps 再次是输入序列的维数,而's something you should standardize and define on input shape (all sequences on the input have to be of the same length, if they'则不是,你应该将它们填充到指定的长度) . units 是输出的维数,它是您图层中每个RNN单元格的输出 .

    那些 return_statereturn_sequences 参数的重点是下一层和计算所需要的 . 第一个是将单元状态作为输出的第一个元素返回 . 第二个是每个时间步后的状态 . 因此,在读取每个字(或序列元素)之后,RNN根据读取的输入元素和 cell state 更新 state . 因此,使用 return_sequences ,您可以在RNN内处理每个字后得到序列,并且 state 已更新 .

    我认为,在您阅读我在此答案中链接的博文后,一切都会更加清晰 . 我希望这是有帮助的 :)

相关问题