gpt4 book ai didi

python - 二维输入的 Keras 模型

转载 作者:太空宇宙 更新时间:2023-11-04 00:05:04 25 4
gpt4 key购买 nike

我正在尝试改编 keras tutorial在房价上评估棋盘游戏位置。问题是棋盘游戏位置是二维的,这让 keras 提示不已。

下面是一些基于教程的代码,用于处理从线性方程生成的一些虚拟数据。

import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from keras.wrappers.scikit_learn import KerasRegressor
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import KFold

# fix random seed for reproducibility
seed = 1
np.random.seed(seed)

# Generate dataset with linear outputs.
sample_count = 1000
column_count = 5
X = np.random.uniform(size=sample_count * column_count)
X.shape = (sample_count, column_count)
Y = 2*X[:, 0] + X[:, 1] + X[:, 2] + 11*X[:, 3] + 3*X[:, 4]


# define base model
def baseline_model():
# create model
model = Sequential()
model.add(Dense(column_count * 2,
input_dim=column_count,
kernel_initializer='normal',
activation='relu'))
model.add(Dense(1, kernel_initializer='normal'))
# Compile model
model.compile(loss='mean_squared_error', optimizer='adam')
return model


# evaluate model with standardized dataset
estimator = KerasRegressor(build_fn=baseline_model, epochs=100, batch_size=5, verbose=0)

kfold = KFold(n_splits=10, random_state=seed)
results = cross_val_score(estimator, X, Y, cv=kfold)
print("Results: %.2f (%.2f) MSE" % (results.mean(), results.std()))

estimator.fit(X, Y)

test_samples = np.identity(column_count)
predictions = estimator.predict(test_samples)
print(predictions)

这很好用,但当我尝试与二维数据等效的东西时却不行。二维码如下:

import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from keras.wrappers.scikit_learn import KerasRegressor
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import KFold

# fix random seed for reproducibility
seed = 1
np.random.seed(seed)

# Generate dataset with linear outputs.
sample_count = 1000
row_count = 2
column_count = 3
X = np.random.uniform(size=sample_count * row_count * column_count)
X = X.reshape(sample_count, row_count, column_count)
Y = 2*X[:, 0, 0] + X[:, 0, 1] + 2*X[:, 0, 2] + 11*X[:, 1, 0] + 3*X[:, 1, 1]
Y = Y.reshape(sample_count, 1)


# define base model
def baseline_model():
# create model
model = Sequential()
model.add(Dense(row_count * column_count * 2,
input_shape=(row_count, column_count),
kernel_initializer='normal',
activation='relu'))
model.add(Dense(1, kernel_initializer='normal'))
# Compile model
model.compile(loss='mean_squared_error', optimizer='adam')
return model


# evaluate model with standardized dataset
estimator = KerasRegressor(build_fn=baseline_model, epochs=100, batch_size=5, verbose=0)

kfold = KFold(n_splits=10, random_state=seed)
results = cross_val_score(estimator, X, Y, cv=kfold)
print("Results: %.2f (%.2f) MSE" % (results.mean(), results.std()))

estimator.fit(X, Y)

test_samples = np.zeros((row_count*column_count, row_count, column_count))
for sample_num, (row_num, column_num) in enumerate((row_num, column_num)
for row_num in range(row_count)
for column_num in range(column_count)):
test_samples[sample_num, row_num, column_num] = 1
predictions = estimator.predict(test_samples)
print(predictions)

当我运行该代码时,出现此错误:

Traceback (most recent call last):
File "/home/don/PycharmProjects/ml_tutorial/ml_tutorial/run_linear2.py", line 40, in <module>
results = cross_val_score(estimator, X, Y, cv=kfold)
File "/home/don/.local/share/virtualenvs/ml_tutorial-3a_885qf/lib/python3.6/site-packages/sklearn/model_selection/_validation.py", line 402, in cross_val_score
error_score=error_score)
File "/home/don/.local/share/virtualenvs/ml_tutorial-3a_885qf/lib/python3.6/site-packages/sklearn/model_selection/_validation.py", line 240, in cross_validate
for train, test in cv.split(X, y, groups))
File "/home/don/.local/share/virtualenvs/ml_tutorial-3a_885qf/lib/python3.6/site-packages/sklearn/externals/joblib/parallel.py", line 917, in __call__
if self.dispatch_one_batch(iterator):
File "/home/don/.local/share/virtualenvs/ml_tutorial-3a_885qf/lib/python3.6/site-packages/sklearn/externals/joblib/parallel.py", line 759, in dispatch_one_batch
self._dispatch(tasks)
File "/home/don/.local/share/virtualenvs/ml_tutorial-3a_885qf/lib/python3.6/site-packages/sklearn/externals/joblib/parallel.py", line 716, in _dispatch
job = self._backend.apply_async(batch, callback=cb)
File "/home/don/.local/share/virtualenvs/ml_tutorial-3a_885qf/lib/python3.6/site-packages/sklearn/externals/joblib/_parallel_backends.py", line 182, in apply_async
result = ImmediateResult(func)
File "/home/don/.local/share/virtualenvs/ml_tutorial-3a_885qf/lib/python3.6/site-packages/sklearn/externals/joblib/_parallel_backends.py", line 549, in __init__
self.results = batch()
File "/home/don/.local/share/virtualenvs/ml_tutorial-3a_885qf/lib/python3.6/site-packages/sklearn/externals/joblib/parallel.py", line 225, in __call__
for func, args, kwargs in self.items]
File "/home/don/.local/share/virtualenvs/ml_tutorial-3a_885qf/lib/python3.6/site-packages/sklearn/externals/joblib/parallel.py", line 225, in <listcomp>
for func, args, kwargs in self.items]
File "/home/don/.local/share/virtualenvs/ml_tutorial-3a_885qf/lib/python3.6/site-packages/sklearn/model_selection/_validation.py", line 528, in _fit_and_score
estimator.fit(X_train, y_train, **fit_params)
File "/home/don/.local/share/virtualenvs/ml_tutorial-3a_885qf/lib/python3.6/site-packages/keras/wrappers/scikit_learn.py", line 152, in fit
history = self.model.fit(x, y, **fit_args)
File "/home/don/.local/share/virtualenvs/ml_tutorial-3a_885qf/lib/python3.6/site-packages/keras/engine/training.py", line 952, in fit
batch_size=batch_size)
File "/home/don/.local/share/virtualenvs/ml_tutorial-3a_885qf/lib/python3.6/site-packages/keras/engine/training.py", line 789, in _standardize_user_data
exception_prefix='target')
File "/home/don/.local/share/virtualenvs/ml_tutorial-3a_885qf/lib/python3.6/site-packages/keras/engine/training_utils.py", line 128, in standardize_input_data
'with shape ' + str(data_shape))
ValueError: Error when checking target: expected dense_2 to have 3 dimensions, but got array with shape (900, 1)

如何说服模型接受二维输入?

最佳答案

基于 GitHub issue 中的类似讨论,您可以只添加一个 Flatten() 层来减少输入维度。

import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Flatten
from keras.wrappers.scikit_learn import KerasRegressor
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import KFold

# fix random seed for reproducibility
seed = 1
np.random.seed(seed)

# Generate dataset with linear outputs.
sample_count = 1000
row_count = 2
column_count = 3
X = np.random.uniform(size=sample_count * row_count * column_count)
X = X.reshape(sample_count, row_count, column_count)
Y = 2*X[:, 0, 0] + X[:, 0, 1] + 2*X[:, 0, 2] + 11*X[:, 1, 0] + 3*X[:, 1, 1]
Y = Y.reshape(sample_count, 1)


# define base model
def baseline_model():
# create model
model = Sequential()
model.add(Dense(row_count * column_count * 2,
input_shape=(row_count, column_count),
kernel_initializer='normal',
activation='relu'))
model.add(Flatten())
model.add(Dense(1, kernel_initializer='normal'))
# Compile model
model.compile(loss='mean_squared_error', optimizer='adam')
return model


# evaluate model with standardized dataset
estimator = KerasRegressor(build_fn=baseline_model, epochs=100, batch_size=5, verbose=0)

kfold = KFold(n_splits=10, random_state=seed)
results = cross_val_score(estimator, X, Y, cv=kfold)
print("Results: %.2f (%.2f) MSE" % (results.mean(), results.std()))

estimator.fit(X, Y)

test_samples = np.zeros((row_count*column_count, row_count, column_count))
for sample_num, (row_num, column_num) in enumerate((row_num, column_num)
for row_num in range(row_count)
for column_num in range(column_count)):
test_samples[sample_num, row_num, column_num] = 1
predictions = estimator.predict(test_samples)
print(predictions)

我想我需要使用像 Conv2D 这样的其他层来实际利用二维关系,但这让我克服了错误。

关于python - 二维输入的 Keras 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54414337/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com