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)'然后我得到了()
我对gru1和gru_1b的形状感到很困惑 . 为什么他们不同?
2.我设置了return_sequences和return_state为True然后得到了
valueerror:
实际上我不知道下一步该做什么 .
1 回答
这个问题更适合Cross Validated论坛,但还可以 .
所以为了回答你的第一个问题,时间步长只是一个表示序列长度的数字 . RNN以特定方式工作,因为它们具有自身的重复连接 . 在LSTM的例子中给出了对RNN的非常好的解释here . 在那里你可以看到
cell state
和state
之间的区别 .要回答第二个问题,
(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_state
和return_sequences
参数的重点是下一层和计算所需要的 . 第一个是将单元状态作为输出的第一个元素返回 . 第二个是每个时间步后的状态 . 因此,在读取每个字(或序列元素)之后,RNN根据读取的输入元素和cell state
更新state
. 因此,使用return_sequences
,您可以在RNN内处理每个字后得到序列,并且state
已更新 .我认为,在您阅读我在此答案中链接的博文后,一切都会更加清晰 . 我希望这是有帮助的 :)