我是tensoflow的新手,我想用我自己的数据(40x40的图像)改编MNIST教程https://www.tensorflow.org/tutorials/layers。这是我的模型函数:
def cnn_model_fn(features, labels, mode):
# Input Layer
input_layer = tf.reshape(features, [-1, 40, 40, 1])
# Convolutional Layer #1
conv1 = tf.layers.conv2d(
inputs=input_layer,
filters=32,
kernel_size=[5, 5],
# To specify that the output tensor should have the same width and height values as the input tensor
# value can be "same" ou "valid"
padding="same",
activation=tf.nn.relu)
# Pooling Layer #1
pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)
# Convolutional Layer #2 and Pooling Layer #2
conv2 = tf.layers.conv2d(
inputs=pool1,
filters=64,
kernel_size=[5, 5],
padding="same",
activation=tf.nn.relu)
pool2 = tf.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2], strides=2)
# Dense Layer
pool2_flat = tf.reshape(pool2, [-1, 10 * 10 * 64])
dense = tf.layers.dense(inputs=pool2_flat, units=1024, activation=tf.nn.relu)
dropout = tf.layers.dropout(
inputs=dense, rate=0.4, training=mode == tf.estimator.ModeKeys.TRAIN)
# Logits Layer
logits = tf.layers.dense(inputs=dropout, units=2)
predictions = {
# Generate predictions (for PREDICT and EVAL mode)
"classes": tf.argmax(input=logits, axis=1),
# Add `softmax_tensor` to the graph. It is used for PREDICT and by the
# `logging_hook`.
"probabilities": tf.nn.softmax(logits, name="softmax_tensor")
}
if mode == tf.estimator.ModeKeys.PREDICT:
return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions)
# Calculate Loss (for both TRAIN and EVAL modes)
loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits)
# Configure the Training Op (for TRAIN mode)
if mode == tf.estimator.ModeKeys.TRAIN:
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001)
train_op = optimizer.minimize(
loss=loss,
global_step=tf.train.get_global_step())
return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op)
# Add evaluation metrics (for EVAL mode)
eval_metric_ops = {
"accuracy": tf.metrics.accuracy(
labels=labels, predictions=predictions["classes"])}
return tf.estimator.EstimatorSpec(
mode=mode, loss=loss, eval_metric_ops=eval_metric_ops)
我在标签和logit之间有形状尺寸错误:
InvalidArgumentError(回溯,请参见上文):logits和标签的第一维必须相同,logits形状为[3,2],标签形状为[1]
filenames_array是16个字符串的数组
["file1.png", "file2.png", "file3.png", ...]
labels_array是16个整数的数组
[0,0,1,1,0,1,0,0,0,...]
主要功能是:
# Create the Estimator
mnist_classifier = tf.estimator.Estimator(model_fn=cnn_model_fn, model_dir="/tmp/test_convnet_model")
# Train the model
cust_train_input_fn = lambda: train_input_fn_custom(
filenames_array=filenames, labels_array=labels, batch_size=1)
mnist_classifier.train(
input_fn=cust_train_input_fn,
steps=20000,
hooks=[logging_hook])
我试图重塑logit,但没有成功:
logits = tf.reshape(logits,[1,2])
我需要你的帮助,谢谢
编辑
经过更多时间搜索后,在模型函数的第一行
input_layer = tf.reshape(features, [-1, 40, 40, 1])
表示将动态计算batch_size尺寸的“ -1”在此处具有值“ 3”。与我的错误相同的“ 3”:
logits和标签的第一维必须相同,logits形状为[3,2],标签形状为[1]
如果我将值强制设置为“ 1”,则会出现此新错误:
要重塑的输入是具有4800值的张量,但请求的形状具有1600
也许我的功能有问题?
编辑2:
完整的代码在这里:https
:
//gist.github.com/geoffreyp/cc8e97aab1bff4d39e10001118c6322e
编辑3
我更新了要点
logits = tf.layers.dense(inputs=dropout, units=1)
https://gist.github.com/geoffreyp/cc8e97aab1bff4d39e10001118c6322e
但是我不完全理解您对批次大小的回答,这里的批次大小如何为3,而我选择的批次大小为1?
如果我选择batch_size = 3, 则会 出现此错误:
logits和标签的第一维必须相同,logits的形状为[9,1],标签的形状为[3]
我试图重塑标签:
labels = tf.reshape(labels, [3, 1])
我更新了功能和标签结构:
filenames_train = [['blackcorner-data/1.png', 'blackcorner-data/2.png', 'blackcorner-data/3.png',
'blackcorner-data/4.png', 'blackcorner-data/n1.png'],
['blackcorner-data/n2.png',
'blackcorner-data/n3.png', 'blackcorner-data/n4.png',
'blackcorner-data/11.png', 'blackcorner-data/21.png'],
['blackcorner-data/31.png',
'blackcorner-data/41.png', 'blackcorner-data/n11.png', 'blackcorner-data/n21.png',
'blackcorner-data/n31.png']
]
labels = [[0, 0, 0, 0, 1], [1, 1, 1, 0, 0], [0, 0, 1, 1, 1]]
但没有成功…
问题出在您的目标形状上,并且与正确选择适当的损失函数有关。您有两种可能性:
1.可能性 :如果您具有一维整数编码目标,则可以sparse_categorical_crossentropy
用作损失函数
n_class = 3
n_features = 100
n_sample = 1000
X = np.random.randint(0,10, (n_sample,n_features))
y = np.random.randint(0,n_class, n_sample)
inp = Input((n_features,))
x = Dense(128, activation='relu')(inp)
out = Dense(n_class, activation='softmax')(x)
model = Model(inp, out)
model.compile(loss='sparse_categorical_crossentropy',optimizer='adam',metrics=['accuracy'])
history = model.fit(X, y, epochs=3)
2.可能性
:如果您已对目标进行一次热编码以具有2D形状(n_samples,n_class),则可以使用categorical_crossentropy
n_class = 3
n_features = 100
n_sample = 1000
X = np.random.randint(0,10, (n_sample,n_features))
y = pd.get_dummies(np.random.randint(0,n_class, n_sample)).values
inp = Input((n_features,))
x = Dense(128, activation='relu')(inp)
out = Dense(n_class, activation='softmax')(x)
model = Model(inp, out)
model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])
history = model.fit(X, y, epochs=3)
问题内容: 我有一个问题。 我正在尝试通过使用以下代码来复制20x361矩阵的最后一列: 但是我得到了错误: ValueError:所有输入数组的维数必须相同 但是,我已经通过检查矩阵尺寸 我得到 (20公升)(20公升,361公升) 所以尺寸匹配?错误在哪里? 问题答案: 如果我从3x4数组开始,然后将3x1数组与轴1连接起来,则会得到3x5数组: 请注意,两个要连接的输入都具有2维。 省略形状
问题内容: 如何串联这些数组? 首先具有形状 第二个形状 最终结果应该是 我试过了 但是我得到这个错误 我究竟做错了什么? 问题答案: 要使用,我们需要将第二个数组扩展到,然后沿着- 或者,我们可以使用它来照顾它- 样品运行- 如果是这样,它的一个阵列具有的形状,很可能所有的数据都包含在它的唯一元素,我们需要 压扁 在连接前出来。为此,我们也可以使用它。这里是一个示例,目的是为了清楚地说明这一点-
我为代码的质量提前道歉。当我尝试将html代码放入gatsby.js项目的index.js页面中时,我遇到以下错误: ./src/components/section3.js模块构建失败时出错(来自./node_modules/gatsby/dist/utils/babel loader.js):SyntaxError:/path/src/components/section3.js:相邻的JSX
我试图在页面中显示文章,但我遇到了一些问题,需要在reactjs中封装标签。看起来React不接受相邻的相同标记如何显示表格数据? 有人知道问题出在哪里吗?
我有以下返回语句,即给出错误任何想法是错误的?
定义为一维数组,定义为二维数组,但这一行为是两个夜晚。原因是什么? 以及该代码的输出:
问题内容: 假设你创建一个使用生成器模式的人一个类名,并假设生成器类包含的方法,,当然,你考虑的方法,并为这个类的用户必须的。 如果可能的话,我们希望以某种方式标记这些方法为强制性的。如果此类的用户尝试构建Person实例但忘记调用这些方法中的任何一个,我们希望得到某种警告- 从Java编译器,或者从Eclipse或Maven,我们用来构建我们的警告。项目-他们中的任何一个都可以。 有可能吗?您会
我一直在尝试将一个html网站移植到Gatsbyjs并做出反应。在构建header Comparement时,我在带有的行中得到一个错误“相邻的JSX元素必须包装在一个封闭的标记中”。我想不出这个问题,请你帮忙。我使用有状态组件构建它的原因是,稍后我将向它添加一些额外的功能。 这是我的代码: