python-3.x - 添加多个隐藏层keras
问题描述
我有一个使用 keras 的简单情绪分析器,这是我的代码,其中我使用了 github 上的 keras 代码:https ://github.com/keras-team/keras/blob/master/examples/imdb_lstm.py
初始和工作模型是:
from __future__ import print_function
from keras.preprocessing import sequence
from keras.models import Sequential
from keras.layers import Dense, Embedding, Activation
from keras.layers import GRU, LeakyReLU
from keras.datasets import imdb
max_features = 2000
maxlen = 80 # cut texts after this number of words (among top max_features most common words)
batch_size = 256
hidden_layer_size = 32
dropout = 0.2
num_epochs = 1
activation_func = LeakyReLU(alpha=0.5)
print('Loading data...')
(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features)
print(len(x_train), 'train sequences')
print(len(x_test), 'test sequences')
print('Pad sequences (samples x time)')
x_train = sequence.pad_sequences(x_train, maxlen=maxlen)
x_test = sequence.pad_sequences(x_test, maxlen=maxlen)
print('x_train shape:', x_train.shape)
print('x_test shape:', x_test.shape)
print('Build model...')
model = Sequential()
model.add(Embedding(max_features, hidden_layer_size))
model.add(GRU(hidden_layer_size, dropout=dropout, recurrent_dropout=dropout))
model.add(Activation(activation_func))
model.add(Dense(1, activation='sigmoid'))
# try using different optimizers and different optimizer configs
model.compile(loss='binary_crossentropy',
optimizer='adam',
metrics=['accuracy'])
print('Train...')
model.fit(x_train, y_train,
batch_size=batch_size,
epochs=num_epochs,
validation_data=(x_test, y_test))
score, acc = model.evaluate(x_test, y_test,
batch_size=batch_size)
print('Test score:', score)
print('Test accuracy:', acc)
我得到的错误是这个:
ValueError: Input 0 is in compatible with layer gru_2: expected ndim=3, found ndim=2
每次我尝试在模型上添加第二个隐藏层时都会发生这种情况,例如:
model = Sequential()
model.add(Embedding(max_features, hidden_layer_size))
model.add(GRU(hidden_layer_size, dropout=dropout, recurrent_dropout=dropout))
model.add(Activation(activation_func))
model.add(GRU(hidden_layer_size, dropout=dropout, recurrent_dropout=dropout))
model.add(Activation(activation_func))
model.add(Dense(1, activation='sigmoid'))
我相信我遗漏了一些关于隐藏层尺寸的东西。我应该如何继续成功添加另一个隐藏层?
提前致谢,
解决方案
这是因为默认情况下,Keras 中的 RNN 层只返回最后一个输出,即输入(samples, time_steps, features)
变为(samples, hidden_layer_size)
. 为了链接多个 RNN,您需要将隐藏的 RNN 层设置为return_sequences=True
:
model = Sequential()
model.add(Embedding(max_features, hidden_layer_size))
# Add return_sequences=True
model.add(GRU(hidden_layer_size, activation=activation_func, dropout=dropout, recurrent_dropout=dropout, return_sequences=True))
# (samples, time_steps, hidden_layer_size)
model.add(GRU(hidden_layer_size, activation=activation_func, dropout=dropout, recurrent_dropout=dropout))
# (samples, hidden_layer_size)
model.add(Dense(1, activation='sigmoid'))
您还可以返回最后隐藏的等,查看有关这些参数的作用的文档。
推荐阅读
- react-native - react-native 应用程序中的“属性描述必须有一个对象”错误。为什么?
- python - 如何在python pyqt5中连续更改标签颜色颜色
- c - C 中的 .o 与 .out
- amazon-quicksight - Quicksight 计算字段试图从 MYSQL 解析Json
- powerbi - 评估变量中的 VAR 与 RETURN 中的表达式有什么区别?
- python - Python扫雷矩阵越界循环并且最后一行未填充
- javascript - 如何使用固定四舍五入到小数点后两位(2)
- ruby - 如何在 Docker 的 Alpine 上修复 ruby-bundler 包含的并发 ruby?
- html - 如何使 nth-child 停止影响所有元素
- r - 如何有条件地将 id 值迭代到数据框