【发布时间】:2018-09-28 21:03:06
【问题描述】:
使用带有 Tensorflow 后端的 Keras DL 库,我正在尝试使用内置的 IMDB 数据集实现用于情绪分析的批处理和验证生成器。
数据集包含 25000 个训练样本和 25000 个测试样本。 因为为每个样本的字数设置一个截止值会产生相当低的准确度,所以我正在尝试批量训练和测试样本,以便内存负载不会很糟糕。
当前代码:
from __future__ import print_function
from keras.preprocessing import sequence
from keras.models import Sequential
from keras.layers import Dense, Embedding, Dropout
from keras.layers import LSTM, TimeDistributed
from keras.datasets import imdb
from keras.callbacks import EarlyStopping, ModelCheckpoint
import numpy as np
max_features = 20000
def generate_batch(batchsize):
'''
'''
(x_train, y_train), (_,_) = imdb.load_data()
for i in range(0, len(x_train), batchsize):
x_batch = x_train[i:(i+batchsize)]
y_batch = y_train[i:(i+batchsize)]
x_batch = sequence.pad_sequences(x_train, maxlen=None)
yield(x_batch, y_batch)
def generate_val(valsize):
'''
'''
(_,_), (x_test, y_test) = imdb.load_data()
for i in range(0, len(x_test), valsize):
x_val = x_test[i:(i+valsize)]
y_val = y_test[i:(i+valsize)]
x_val = sequence.pad_sequences(x_test, maxlen=None)
yield(x_val, y_val)
print('Build model...')
primary_model = Sequential()
primary_model.add(Embedding(input_dim = max_features,
output_dim = max_features,
trainable=False,
weights=[(np.eye(max_features,max_features))],
mask_zero=True))
primary_model.add(TimeDistributed(Dense(150, use_bias=False)))
primary_model.add(LSTM(128))
primary_model.add(Dense(2, activation='softmax'))
primary_model.summary()
primary_model.compile(loss='sparse_categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
print('Train...')
filepath = "primeweights-{epoch:02d}-{val_acc:.2f}.hdf5"
checkpoint = ModelCheckpoint(filepath,
verbose=1,
save_best_only=True)
early_stopping_monitor = EarlyStopping(patience=2)
primary_model.fit_generator(generate_batch(25),
steps_per_epoch = 1000,
epochs = 1,
callbacks=[early_stopping_monitor],
validation_data=generate_val(25),
validation_steps=1000)
score, acc = primary_model.evaluate(x_test, y_test,
batch_size=batch_size)
print('Test score:', score)
print('Test accuracy:', acc)
primary_model.save('primary_model_imdb.h5')
但是,在尝试运行当前代码时,Keras 向我抛出了以下错误:
Traceback (most recent call last):
File "imdb_gen.py", line 94, in <module>
validation_steps = 1000)
File "/home/d/user/.local/lib/python3.5/site-
packages/keras/legacy/interfaces.py", line 91, in wrapper
return func(*args, **kwargs)
File "/home/d/user/.local/lib/python3.5/site-packages/keras/models.py",
line 1276, in fit_generator
initial_epoch=initial_epoch)
File "/home/d/user/.local/lib/python3.5/site-
packages/keras/legacy/interfaces.py", line 91, in wrapper
return func(*args, **kwargs)
File "/home/d/user/.local/lib/python3.5/site-
packages/keras/engine/training.py", line 2224, in fit_generator
class_weight=class_weight)
File "/home/d/user/.local/lib/python3.5/site-
packages/keras/engine/training.py", line 1877, in train_on_batch
class_weight=class_weight)
File "/home/d/user/.local/lib/python3.5/site-
packages/keras/engine/training.py", line 1490, in _standardize_user_data
_check_array_lengths(x, y, sample_weights)
File "/home/d/user/.local/lib/python3.5/site-
packages/keras/engine/training.py", line 220, in _check_array_lengths
'and ' + str(list(set_y)[0]) + ' target samples.')
ValueError: Input arrays should have the same number of samples as target
arrays. Found 25000 input samples and 25 target samples.
【问题讨论】:
-
这是由于您的代码中的拼写错误:
x_batch = sequence.pad_sequences(x_train, maxlen=None)为您提供了整个填充的x_train,这将是 25000 个样本。你可能想要x_batch = sequence.pad_sequences(x_batch, maxlen=None)
标签: python tensorflow keras generator imdb